I started this project because I wanted to make something that had mechanical, electrical and software components. After looking around on Instructables, I figured that an Arduino based laser engraver would be an interesting machine to make, and that the machine itself could make interesting things. Laser diodes have also advanced quite a lot in the last few years, allowing reasonably powerful DIY laser engravers to be made without the hassles of laser tubes.

This machine can engrave wood and cut paper. I haven't tried other materials yet because there is no fume extraction capability - plastics generally create toxic gases when burnt.

SAFETY WARNING - Please be safe when using lasers. The laser used in this machine can cause permanent eyesight damage, and probably even blindness. When working with powerful lasers (>5mW), always wear a pair of laser safety glasses designed to block your laser's wavelength.

For a quick overview of the guts of the machine, have a look at the video below
(Note: The machine runs slightly faster now, and also has a different laser heatsink to the one in the video)

For pictures of engravings, skip to the end, or visit my website's gallery:

A spreadsheet containing the parts list is below.

Also, for any Aussies unsure about the laser import laws, I've attached the current rules (at Dec 2013) below. Laser diodes and laser modules (such as the one in this machine) are legal, however laser pointers are prohibited.
This is a pdf version of the following webpage:
Remove these adsRemove these ads by Signing Up

Step 1: Frame Design

Picture of Frame Design
Before starting construction, I made a CAD model of the machine to make sure that everything would fit, and to figure out the dimensions of the parts. Some screenshots of the machine's CAD model are above.

The y-axis is on the bottom of the machine, and provides a moving base for the engraved piece. The x-axis is on the top, and moves the laser assembly (the laser isn't shown in the model).
1-40 of 78Next »
010100100020 days ago

meantime thanks for sharing this project !!!
and could you help me with the part about the laser?
you have a scheme for newbie for the PCB that you did? and all the necessary materials including laser, lens ecc ecc?
many many thanks

getburnt (author)  010100100019 days ago

I've sent you a private message

Thanks for the reply, but I can not find the PM :-(
getburnt (author)  010100100019 days ago

Sometimes the messages take a few hours to appear haha. I've sent you an email :)

Thanks for the reply, but I can not find the PM :-(
Thanks for the reply, but I can not find the PM :-(
Thanks for the reply, but I can not find the PM :-(
ElmerC1 month ago

algun diodo laser que me recomienden y donde puedo adquirirlo o comprarlo

atradeceria mucho su respuesta Gracias.

I recommend a laser diode and where I can buy or purchase
Thank you very much for your response atradeceria .

getburnt (author)  ElmerC1 month ago

Hi, (the US site) is probably the best place to buy a diode. I bought mine from the seller "dtr-lpf"

I'd recommend a 2W 445nm blue diode, in a copper Aixiz module, with three-element-glass lens.

Terr0rb0t3 months ago


I implemented your software into our existing Laser engraver/cnc machine. Everything went fine at first, I installed the required .NET -frameworks etc. I made a test run with the Arduino logo picture that you supplied. The image was a bit off, which i wrote down to differences between our setups/high speed/insufficient torque. So i went and editet a stock B&W photograph into what i thought would be more suitable for checking how the system handled halftones and such. and now..

What ever I do, the Processing sketch starts uploading the same (badly photoshopped/prepped) photograph and burning it onto the surface. What I mean, is even if I remove all the processing files and all other files related to this project, after downloading and processing the stock arduino logo-photo through your Image converter and re-configuring both the arduino and processing sketches (only minor changes such as COM- port value) I still get only this one crappy image to run. Nothing seems to change this,

I really like your software/project and would like to keep using it. I just can't figure out how sketch can run a file that doesn't even exist anymore.

I checked also the Imagearray-file and found that it was generated anew each time I process a different picture, so i guess the problem is not there.

I'm sorry for any typos and misspelling/usage of words/terms. I'm not a native speaker.

Long story short: The processing sketch prints the same image over and over no matter what I do/what parameters i change.

Thansk beforehand, as this is probably a problem originating from my mediocre computer skill, any help is appreciated.

getburnt (author)  Terr0rb0t3 months ago


There could be a few reasons for this problem. The first thing to check is the generation of the "cncinstructions.txt" file using the C# program. You need to make sure that you delete any existing "cncinstructions.txt" file in the folder. If there is an old file in there, the C# program will just append to the file. This could explain why you're seeing the Arduino image whenever you engrave, because it is always at the start of the file.

The second thing to check is that the "cncinstructions.txt" file is copied to the correct directory for the Processing sketch.

Also, regarding halftones, the software (in it's current state) won't handle them at all. The C# program is written to check the value of the red subpixel in each pixel of the image. If it is zero (i.e. black), it is considered to be a pixel that should be engraved. If it is any other value (1 to 255), it is considered to be a blank pixel - dithering is used to show shades of grey (when viewed from a distance).

If you'd like to have a closer look at the C# program, I can email the source code to you (my email is I have tried grayscale (using a PWM signal for laser intensity) and it does work, but the results are heavily dependent on the material being burnt - I've found dithering to be a good compromise.

jgzifly3 months ago

This is an impressive project. I intend to make one. I have the stepper motors and some of the hardware that I used on another project that didn't give me the repeatability I wanted. It used MECH3 and GCODE created from Sketchup vector files for cutting using a dremal tool to cut 6mm foam board. I want to switch to laser cutting, but I will start with your laser engraving first. The foam board cutting may take a stronger laser or multiple passes ad different levels. It will require cutting to 3 different depths. (score the top layer, cut half way thru and cut all the way thru). That will require a third axis or maybe controlling the speed of the cut, or controlling the strength of the laser.

I noticed that used speed to control weather to burn a pixel or not. Would using half speed give you somewhat of a gray scale.

I am a retired programmer. I like to make flowcharts of processes. See my attached flowcharts, pages 1-2.

Flowchart Page 1.bmpFlowchart Page 2.bmp
getburnt (author)  jgzifly3 months ago

Those are some great charts, and they summarise the process well.

Currently, in both raster and vector (GRBL) modes, the laser is just switched on and off when needed. In raster mode, the speed change is only there because the laser needs some more time to burn a mark (when the laser is passing over blank pixels, it is off).

To control the depth of the cut, it is probably best to digitally control the laser intensity. I'd suggest trying to configure PWM control of the laser. I'm not sure how to get this working in GRBL (I'm just using spindle on/off to control the laser), but it is relatively simple to add this capability to my original C# program (I've emailed it to you). I can confirm that the laser driver circuit described in this instructable can work with a PWM signal, and the laser intensity does vary with PWM duty cycle.

zero2one134 months ago

sir can i have your cad file? tp get the detailed measurements for the frame, if its alright. thanks.... :)

imont5 months ago

can you explain the steeps to print raster image, how do set the place where to print? how do you send the firle to print_? what do you charge in your arduino?

getburnt (author)  imont5 months ago

Here are some detailed steps. Let me know if there is a section that you'd like more details about.


Upload "cncmotors_driver3.ino" to the Arduino
through the Arduino IDE (sketch editor).

You can edit parameters such as time
delays and the "scalefactor" variable to match your machine, then upload to the Arduino


The Processing sketch streams the text file to the Arduino. Try
the steps below to get it working:

Copy the "textfilestreamer2.pde" file to a
location on your computer. As an example, I'm going to use "C:\"

Open the "textfilestreamer2.pde" file. If
Processing has been installed correctly, a popup message will appear, and tell
you that the file needs to be inside a sketch folder. Click ok, to create the

You will now have the folder "C:\textfilestreamer2\"

Create the folder "C:\textfilestreamer2\data\"

Copy the text file you generated and paste it into

In Processing, click "Run"

It should start sending data to your Arduino - the Rx/Tx
status LEDs on your Arduino should start flashing.

Note: The Processing sketch has been configured to use
"COM3" to talk to the Arduino. If your Arduino is on a different COM
port, you can either change it to COM3 in Windows Device Manager, or edit the
sketch to match your configuration.

Setting Start Position:

You can use the serial monitor in the Arduino
IDE (sketch editor), to send manual user inputs and set the start position.

Click "Tools" -> "Serial Monitor". Then, you can enter
the numbers 1,3,5 or 7 to move the X/Y position. For example, sending the text
"1111111111" will send instructions to make the laser move 10 steps (1mm) to the right.

imont getburnt5 months ago
thanks a lot, now is very clear. One more question, in order to set the speed of the motors, i must to use the same size of stepper motor in both axis (x,y) Is this correct?
getburnt (author)  imont5 months ago

Yes, I recommend using the same motors for both axes, so that properties such as the number of steps per revolution are the same.

The motor speed is set by the variables "shortdelay" and "longdelay" in the Arduino sketch. A smaller delay will result in the motor rotating faster, but if it is too small, the motor will stall.

Also, if you are using different motors, with different steps/rev, you can still use them, but you may need to modify the Arduino/Processing sketches, to correct image distortions.

imont5 months ago

can you explain the steps for raster engraving please, i only know ho to get the instruction from the image, then i lost, i have the processing.exe but i dont know how to send the image to my cnc laser

andrew_h1 year ago
How did you go getting the laser 1.5W modules into Australia or did you buy them locally somehow? I've got a chinese CNC machine that i've been thinking about adding a laser engraver to for ages - This would be an easy mod...
jonrb andrew_h5 months ago

I know I'm very late to this one, but for the benefit of anybody else wondering about this, I thought I'd answer.

Depending on your state, laser diodes themselves aren't actually outlawed. Victoria, for example, bans only the importing of laser pointers, which it defines as being handheld battery powered devices. Importing the diode itself is fine, and if they confiscate it, you have the right to whine.

getburnt (author)  andrew_h1 year ago
Yeah, I had the same concerns before I bough the lasers from the US. When I checked the Customs restrictions, my understanding was that only fully assembled portable lasers (eg those flashlight / torch types) are illegal. It should be legal to import the laser modules that I've used because they can't actually work until you add extra electronics.
If you're unsure, you could also check with the seller to see if they've encountered any problems delivering to Australia.
KennethRJ5 months ago

Very nice and professional build! I am wondering: Isn't it overkill to use high torque motors when (only) operating a laser ? The build seems strong enough to be use as a dedicated CNC machine, but this must add to the cost ?

getburnt (author)  KennethRJ5 months ago

Thanks! Yes, the motors are a bit overpowered for the task, but this has some advantages. Since the machine has been assembled, the motors have never skipped any steps or stalled. This gives me some extra confidence when engraving larger images (which can take 2+ hours), because it reduces the chance of the machine creating wonky or corrupted engravings.

However, I think motors with less torque should work properly too.

gwork16 months ago

This is one of the best instructables I have ever seen. My diode arrived today, time for some fun :)

I have a question about the photographic style images - what preprocessing was applied to the bitmaps? If I load any colour image, of course no pixels are white, so the result is total blackout.

gwork1 gwork16 months ago

I also wondered why your image processing takes so long. I tried the C# code below, it only takes a few seconds. Writing a file is not going to add materially to that (although I will use C# as my GUI and to communicate with the Arduino, I have this working for my CNC lathe)

using System.Drawing;

private void buttonOpenFile_Click(object sender, EventArgs e)
Bitmap image1;
OpenFileDialog fDialog = new OpenFileDialog();
fDialog.Title = "Open bitmap file";
fDialog.Filter = "Bitmap files|*.bmp;*.jpg;*.gif" ;
fDialog.InitialDirectory = @"C:\Dropzone";
if (fDialog.ShowDialog() == DialogResult.OK)
image1 = new Bitmap(fDialog.FileName.ToString());
pictureBoxMain.Image = image1;
int x, y;
for (x = 0; x < image1.Width; x++)
for (y = 0; y < image1.Height; y++)
Color pixelColor = image1.GetPixel(x, y);
if (pixelColor.R != 255 || pixelColor.G!= 255 || pixelColor.B!=255)
Color newColor = Color.FromArgb(0, 0, 0);
image1.SetPixel(x, y, newColor);


getburnt (author)  gwork16 months ago

For the photos, I used a combination of GIMP ( and MS Paint.
The general steps I used are:
1. Open the photo in GIMP
2. Increase the brightness by +127
3. Increase the brightness again by +50
4. Convert to grayscale (Image -> Mode -> Grayscale)
5. Convert to 1-bit dithered image (Image -> Mode -> Indexed). In the dialog box, select "Use black and white (1-bit) palette", and select "Floyd-Steinberg normal" dithering.
6. Export the image as a bitmap (File -> Export, and export as a Windows bitmap). The file will be saved as a 1-bit bitmap.
7. Open the file in MS Paint, and resave it as a 24-bit bitmap.
The brightness adjustments are probably machine specific, and would depend on your machine's pixel pitch and laser power. I just used trial and error to find the settings that would produce an image with good contrast.

The time taken for the C# program to process images seems to increase exponentially with image size - I haven't really got round to fixing this yet.
Some background info: when you run the program, you'll notice that it creates two text files. One of these (imagearray.txt) is just the image converted into a 2D array of 0s and 1s, and this gets created almost instantly. The second file (cncinstructions.txt) is the one that can take a very long time, where the program produces the motor/laser instructions using the 2D array of 0s and 1s. It does this by iterating through the 2D array of 0s and 1s, row by row. For each row, it initially finds the location of the first burnt pixel and does a count of the burnt pixels. Once it has this information, it starts to calculate the motor/laser instructions for the row, by moving to the first pixel, and working its way through to the last pixel in the row. Also, the program scans consecutive rows in opposite directions (eg row 1 L-R, row 2 R-L, row 3 L-R,....). The slowness might be due to the way C# handles 2D arrays - some articles I've read suggest flattening a 2D array into a 1D array for a big performance improvement. There are also some nested loops which would need to be run many more times for higher resolution images. If you want, you can send me an email (, and I'll send you my C# source code.

Also, don't forget to wear your laser safety glasses!

gwork16 months ago

255 oz/inches seems way overpowered! I run a metal lathe with 125oz/inch motors. One is a little underpowered (the leadscrew), the other (cross slide) is fine. This is pushing a heavy cross slide holding a cutter chewing into metal. And on Acme threads which have higher friction than ballscrews. I'm very surprised that a Nema 11 would not be powerful enough.

getburnt (author)  gwork16 months ago

Yes, the motors have much higher torque than required by this machine. When I was building it, I didn't know what speed the machine could run at, so I got overpowered motors to be completely sure that they would never stall or skip steps at any speed. In an earlier design, I used NEMA 17 motors with M8 threaded rod leadscrews, and they stalled very easily (unless they were running at a very low speed).

TfdPaintball6 months ago

have you worked on anodized aluminium since then?

getburnt (author)  TfdPaintball6 months ago

I haven't tried it yet, but unfortunately I don't think it will work. The laser diode isn't very powerful (compared to laser engravers with laser tubes), and it may also be the wrong wavelength for anodized aluminium. There's a comparison of some laser wavelengths here:

Also, these Kickstarter campaigns use laser diodes that are similar to my machine, and they both list the materials they have tested:

They both say that aluminium can't be engraved.

bob1.6181 year ago
The third pin on those laser diodes is an optical feedback pin, which lets you set the appropriate input power. If you don't use it, you risk destroying the diode with thermal runaway if you drive it near the rated output, or so I've heard. You can build a simple feedback supply for a few bucks more than the one shown above. Look here for ideas:
Send me the circuit of the above I couldn't under stand which wire goes where.
getburnt (author)  bob1.6181 year ago
Thanks for the info!
When I upgrade the laser diode to a more powerful one, I'll look into using that third pin in a new laser driver circuit. I don't want to end up with very expensive LEDs :P
imont1 year ago
Hi, can you explain me the steeps to print raster images, please.
getburnt (author)  imont1 year ago
Hi, if you are planning to use the software on step 8, here is a more detailed overview of the procedure:

First, you will need the Processing IDE installed on your computer (link is on step 8). Currently, I am using version 2.0.1 32-bit, with the Serial library. (Serial doesn't work with the 64-bit version at the moment)

From Step 8, download and extract "CNC Image" to a folder on your computer (eg C:\CNC Image Program). There should be three files in the folder

Prepare a 24-bit bitmap file. Find a picture, convert it to black and white only (eg use GIMP / Photoshop to dither it to a 1-bit image) then save it as a 24-bit bitmap.

Run the "CNC Image Program.exe" program
In the program's text box, enter the full path to your bitmap file. There is a sample bitmap (arduino.bmp) included with the program that you can try first. The path would be something like "C:\CNC Image Program\arduino.bmp" (depending on where you put the folder)
Click "OK" and after a while, the image should be displayed by the program. The file "cncinstructions.txt" should have been created in the folder (eg C:\CNC Image Program\cncinstructions.txt)
(If you need to run the program again, clear all .txt files in the folder)

From Step 8, download and extract "" to somewhere on your computer (eg C:\). Run the file "textfilestreamer2.pde". The Processing IDE should start, and ask you if it can move the file into a folder. Click yes/ok, and the .pde file will be in a new folder (eg C:\textfilestreamer2\texfilestreamer2.pde)
In the folder, create a new folder called "data" (eg C:\textfilestreamer2\data) Copy the generated file, cncinstructions.txt, into the data folder

From Step 8, download and extract "" to somewhere on your computer (eg C:\). Open the .ino file and upload it to your arduino. Also, the Arduino needs to be configured to use COM3

After all these steps, all you need to do is click run in the processing sketch. It will open a serial connection to the arduino, and begin sending instructions. The arduino will interpret the commands and move the motors / control the laser.

Tried to run "CNC Image Program.exe" program, keep getting 'not a valid Win32 application', my system is winxp 32

getburnt (author)  atlantisarn9 months ago

I've just uploaded a version that has been compiled for Windows XP. Give this one a try (it's also on Step 8) - let me know if it still doesn't work

Thanks, it works

Now, I'm trying to figure out how to get laser work, you used pin 12 or pin13 to control laser pulse?

getburnt (author)  atlantisarn9 months ago

The Arduino sketch in Step 8 uses pin 51 (I used an Arduino Mega for the raster engraving). You can change it to any pin you want, by configuring the variable "LASER".

1-40 of 78Next »