Freitag, 7. Juni 2013

My new LaserCutter (technical details)

A lot of people asked me about additional information about my laser cutter project.


The Laser Driver, is based on the A 1 MHz Analog Laser Modulator Based On LM317 Regulator. I planned to build a Laser PCB Exposer like this one. But after some calculations I was not longer convinced that it would provide satisfying results in resolution and usability. I canceled the project and the laser with driver was unused for more than a year.

However, the driver has some serious disadvantages for this use case.
First of all, if the Atmega (Arduino) is booting up, all pins are high-Z - this is enough to power the laser, not on full current but it is damned bright. I highly recommend to build another driver from Sam's page. The analog modulation is not necessary, neither is the switching time.

Secondly, a current monitoring by the Arduino would be nice maybe even current controlling. I think this is worth to invest some time in.

Thirdly, no emergency switch-off or at least a second enable pin.

The Laser itself is a 445nm Diode I've purchased for about 50€. It was labeled 1000mW, but I don't believe it will run this long on that power output.

Now to the mechanical part. I don't feel comfortable by releasing the complete design because I'm not happy with it. It was very quickly done and has a lot of disadvantages. The worst part is the swinging of the Y-axis.

I think, a possible solution is a second belt, but this increases the cost and complexity of the device.
The belts are just fixed with cable ties and some other nasty hacks. If you really want the design, email me and I will send you the files.

I used Skeinforge to generate the G-Code.

I added a M103 to turn off the laser and a M101 for turning it on. So you have to add these two commands in the Commands.cpp file of the firmware:


      case 101: // M101 Laser ON
        wait_until_end_of_move();
        digitalWrite(5, HIGH);

        codenum = 100;        // Wait vor 100ms for the Laser to burn though the material.
        codenum += millis();  // keep track of when we started waiting
        while((unsigned long)(codenum-millis())  < 2000000000 ){
            gcode_read_serial();
            check_periodical();
          }
 break;

      case 103: // M103 Laser OFF
 wait_until_end_of_move();
 digitalWrite(5, LOW);
        break;

I hope some of you found parts of this entry useful.