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 89Next »

Belt speed should be faster.

pierreh11 month ago

hi my gcode sender does not work why would that be and how do i know if the engraver is on how does the on/off work on the arduino plz reply ASAP plz thax

getburnt (author)  pierreh11 month ago

The Gcode sender is only needed for vector mode (Step 9) - is that the mode you want to use? For vector mode, you'll need to install GRBL on the Arduino. You might need to check your serial port settings if the Gcode sender doesn't communicate with GRBL

Hi. Not one of the sketches work on the arduino
getburnt (author)  pierreh125 days ago

Are there any error messages? Are you able to upload the arduino sketch to your arduino? If you're not using an arduino Mega, you'll have to change the "LASER" pin to a different pin number. Also, what motor hardware are you using? The sketch assumes that the stepper drivers accept step/direction pulses.

Hi. How do i install GRBL on the arduino?? And. On the arduino. How do i wire pin 1 and pin 0. For on/off. That part im struggling with. Thax for your reply. And thax for a
great project
getburnt (author)  pierreh11 month ago

If you're just trying to get your machine working, I'd suggest using raster mode (Step 8) instead. It is easier to troubleshoot with my Arduino sketch (you might need to modify the pin assignments because I used an Arduino Mega). Once you have uploaded the sketch, you can use the Arduino IDE Serial monitor to manually drive the machine. You can send it instruction characters such as 1, 3, 5 or 7 (move right, left, down or up), and check if your motors move correctly. The laser is turned on/off by the instruction characters 9 and 0. If you need further guidance, send me an email - my address is

TrueHybridX1 month ago

How were you swapping between the vector and raster modes?

With reading the instructable I logically think during raster mode it seems the machine would be jumpy as it goes from pixel to pixel, is that not the case?

getburnt (author)  TrueHybridX1 month ago

Hi, I used different software on the Arduino. For raster mode, I used my Arduino sketch. For vector mode, I installed an unmodified version of GRBL on an Arduino Uno.

(Note: GRBL 0.8c didn't work on an Arduino Mega. I'm not sure if the current version of GRBL supports the Mega).

Would it be possible to get a copy of the code for your desktop app? Or maybe post it on github? I want to give a go at getting it working on my Linux box
getburnt (author)  TrueHybridX1 month ago

Yes, I've sent you a private message

01010010002 months 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)  01010010002 months ago

I've sent you a private message

Thanks for the reply, but I can not find the PM :-(
getburnt (author)  01010010002 months 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 :-(
ElmerC3 months 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)  ElmerC3 months 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.

Terr0rb0t5 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)  Terr0rb0t4 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.

jgzifly5 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)  jgzifly5 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.

zero2one136 months ago

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

imont6 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)  imont6 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 getburnt6 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)  imont6 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.

imont6 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_h7 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.
KennethRJ7 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)  KennethRJ7 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.

gwork17 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 gwork17 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)  gwork17 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!

gwork17 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)  gwork17 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).

1-40 of 89Next »