Introduction: Arduino Laser Engraver

Picture of Arduino Laser Engraver
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:

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

Step 2: Linear Motion Method

Picture of Linear Motion Method

The machine uses ballscrews and linear bearings to control the position and motion of the X and Y axes.
The specifications of the machine's ballscrews and accessories are:

16mm ballscrew, 400mm length (462mm including machined ends)
5mm pitch
C7 accuracy rating
BK12/BF12 ballscrew supports

I chose to use ballscrews due to their very high accuracy (minimal backlash), rigidity and efficiency. Since the ballscrew nut consists of ball bearings rolling in a track against the ballscrew, there is very little friction, which means the motors can run at higher speeds without stalling.

The second photo shows a test fitting for the x-axis. On either side of the ballscrew is a linear bearing on a steel shaft. This configuration is quite common for cnc machines, and provides a stable foundation for the base plate (Y-axis) and laser assembly (X-axis).
The parts I used are:
16mm hardened chromed shaft , 500mm length (qty: 4)
16mm linear bearing - SC16LUU (qty:4)
16mm shaft support - SK16 (qty:8)

The ballscrew nut's rotational orientation is locked using a piece of aluminium (this is how we spell it in Australia!) angle attached to the moving component of the axis. This can be seen in the last photo, which shows the y-axis. The base plate is fastened to the two linear bearings, and to the ballscrew nut (through the aluminium angle). Rotation of the ballscrew shaft results in the linear motion of the base plate.

Step 3: Frame Construction

Picture of Frame Construction

The ballscrew supports and shaft supports are mounted on 50mm x 50mm hollow aluminium posts. These posts are used for all major structural parts of the machine, and are actually aluminium fence posts (purchased at Bunnings, if anyone from Australia is reading). The thickness of the aluminium is about 2mm.

I chose to use these posts because they are easy to cut and drill, and also hold their shape well when supporting heavy loads. In addition, because they are square, they provide excellent reference surfaces to make sure things are parallel / perpendicular.
The holes were drilled using a cordless drill, and the posts were cut using a mitre saw. (It is also possible to cut the aluminium posts with a hacksaw).

M5 socket head cap screws, and M5 nuts were used to hold most of the parts together. I didn't use a permanent fastening  method because I wanted to keep everything adjustable. Using screws also means that the machine is easy to disassemble and modify for future upgrades.

Some pictures of the frame being built are above. The base of the Y-axis is made up of several A4-sized 4.5mm thick clear acrylic sheets.

Step 4: Stepper Motors + Drivers

Picture of Stepper Motors + Drivers

After some poor results with NEMA 17 stepper motors in an earlier design, I decided to use some NEMA 23 motors with a decent torque rating for this machine. Strong stepper motors also require strong drivers to get the most out of them. As a result, I chose to use a dedicated stepper driver for each motor.

Some details about the chosen components are below:

Stepper Motor (qty:2)
NEMA 23 frame size
1.8Nm holding torque (255 oz-in)
200 steps / revolution (1.8 deg step angle)
Up to 3.0A current
Weight - 1.05kg (They are really heavy!!)
Bipolar 4 wire connection

Stepper Driver (qty:2)
Digital stepping driver
Microstepping feature
Output current 0.5A to 5.6A
Output current limiter (reduces risk of motors overheating)
Control Signals: Step and Direction inputs
Pulse Input freq up to 200kHz
20V-50V DC supply voltage

For each axis, the motor directly drives the ballscrew through a motor coupler. The motors are mounted to the frame using two aluminium angles and an aluminium plate. The aluminium angles and plate are 3mm thick, and are strong enough to support the 1kg motor without bending.

Note: It is really important to correctly align the motor shaft and ballscrew. The couplers I used have some flex to compensate for minor errors, but if the alignment error is too large, they will fail!

Step 5: Laser Diode + Driver

Picture of Laser Diode + Driver

The laser diode I chose is a 1.5W 445nm diode mounted in a 12mm aixiz housing, with a focusable glass lens. These can be found, preassembled, on eBay. Since it is a 445nm laser, the light it produces is visible blue light.

The laser diode requires a heatsink, when running at high power levels. I used two  SK12 12mm aluminium shaft supports, to both mount and cool the laser module.

The intensity of the laser output is dependent on the current that goes through it. The diode by itself cannot regulate current, and if connected directly to a supply, it will draw more and more current until it destroys itself. So, a regulated current circuit is required to protect the laser diode and control its brightness. A circuit diagram of my laser driver is above.

This circuit requires at least a 10V DC supply, and has a simple on/off signal input, which is provided by the Arduino. The LM317T chip is a linear voltage regulator, which has been configured as a current regulator. A potentiometer is included in the circuit to allow the regulated current to be adjusted.

The values of the resistors are:
R1 - 1 ohm (3W)
R2 - 5 ohm (15W) potentiometer
R3 - 180 ohm (0.5W)
(R1 and R2 need to have sufficient power ratings to support the power that is dissipated through them)

R1 and R2 together control the value of the regulated current. The range of current outputs for this circuit are:
R1+R2 = 1ohm: 1.25A
R1+R2 = 6ohm: 0.21A

The NPN transistor is used as a switch. When there is a 5V output from the Arduino, the circuit will turn on the laser. When there is a 0V output from the Arduino, the circuit will switch off the laser.

I used veroboard (stripboard) to mount all the laser driver components. Heatsinks were also installed on the LM317T and NPN transistor. Solid core 22 AWG wire was used for connections between different points on the veroboard.

Step 6: Power Supplies

Picture of Power Supplies

The machine has two separate power supplies, due to different voltage requirements. The stepper motor drivers can accept a 20V-50V DC supply. Each stepper motor has a maximum current of 3.0A, but in normal operation, the motors don't need 3.0A. When they are running continuously, I found that they need less than 1A each. When the motors are changing speed, they usually need less than 2A each. The power  supply I used to supply both stepper drivers is a 100W lab power supply, with a maximum output of 36V at 3A.

The laser driver requires a supply voltage of at least 10V, with current of at least 1.25A. I used an ATX PC PSU as a 12V power supply. The laser driver is connected to the PSU through a breakout box that I made, which provides standard banana jacks for +5V and +12V terminals. The box also has analog ammeters for monitoring current. For instructions on how to create an ATX PSU breakout box, there are a number of other instructables on this site.

Step 7: Microcontroller + Electrical Connections

Picture of Microcontroller + Electrical Connections

An Arduino provides the brains for the machine. It outputs step and direction signals for the stepper drivers, and a laser enable signal for the laser driver. In the current design, only 5 output pins are required to control the machine.

A diagram showing all the electrical connections is above.

An important thing to remember is that the grounds for all components should be connected together.

I used solid core 22AWG wire for signal lines and power cables. For power cables, the power supply ends were terminated with banana plugs.

Step 8: Software (Raster Engraving)

When I originally designed the machine, I only wanted it to engrave regular bitmap picture files. So, I made three separate programs, which when used together, allow normal bitmap pictures to be engraved onto wood.

C# Program (Generates "instruction" text file)

This accepts a bitmap file and outputs a text file, containing "instruction characters". The bitmap type it accepts is a 24-bit bitmap, with only black and white pixels (no greys / colours). The program analyses the bitmap, scanning row by row for the black pixels that need to be engraved. First, it scans the top row left-to-right, then drops down one row, scans right-to-left, drops down another row, scans left-to-right, and so on, until the last row is scanned. It can skip blank pixels on the edges of the rows, and can skip blank rows. Also, due to the Arduino serial buffer limitations, the program divides the text file into comma separated "instruction blocks", which are under 64 characters long. These numerical instructions are interpreted by the Arduino (see Arduino Sketch section for details).

This program works well for smaller images (eg less than 1000 x 700), but gets bogged down with larger images that have lots of burnt pixels (can take over 10 minutes to generate the instruction file).

The way that this program scans the image carries over directly to the way the machine engraves the image. The Arduino uses the instruction file to make the machine engrave the image row by row.

Sample Comma Separated Instruction Blocks (to see what the numbers mean, scroll down to the Arduino sketch section):


The executable is at the bottom of the page

Processing IDE Sketch (Streams instruction data)

A simple Processing sketch was created to stream the contents of the instruction file.

You can get Processing from here:

The data is streamed via a virtual serial port connection to the Arduino. The sketch sends the comma separated instruction blocks, one block at a time, with a delay between blocks. These delays are calculated at run time, based on the contents of each instruction block. The delay is needed to ensure that the Processing sketch doesn't send new instructions to the Arduino before the previous instructions have executed. If this occurs, the engraved image will be corrupted, so the timing values used in the Processing sketch and Arduino sketch have to be compatible.
The Processing sketch also provides a progress status, by counting the total number of instruction blocks, and continuously reporting how many instruction blocks have been sent to the Arduino.

The sketch is at the bottom of the page

Arduino Sketch (Interprets instruction data and controls hardware)

The Arduino sketch interprets each instruction block. There are a number of instruction characters:
1 - Move RIGHT by one pixel FAST (blank pixel)
2 - Move RIGHT by one pixel SLOW (burnt pixel)
3 - Move LEFT by one pixel FAST (blank pixel
4 - Move LEFT by one pixel SLOW (burnt pixel)
5 - Move UP by one pixel FAST (blank pixel)
6 - Move UP by one pixel SLOW (burnt pixel)
7 - Move DOWN by one pixel FAST (blank pixel)
8 - Move DOWN by one pixel SLOW (burnt pixel)
9 - Turn laser ON
0 - Turn laser OFF
r - Return axes to start position
With each character, the arduino runs a corresponding function, to write to the output pins.

The Arduino controls the motor speed through the delays between step pulses. Ideally, the machine would run the motors at the same high speed, whether its engraving a pixel or passing over a blank pixel. However, due to the laser diode's limited power, the machine has to slow down slightly when burning a pixel. This is why there are two speeds for each direction in the instruction character list above. Currently, I have configured the machine to pass over a blank pixel in 8ms, and to pass over a burnt pixel in 18ms.

The Arduino sketch also controls image scaling.
The stepper drivers have been configured for half-stepping, meaning that the drivers need 400 step pulses per one revolution of the motor, or 400 step pulses / 5mm of linear motion. Without any scaling, the engraved pictures would be too small to see.
I decided to use a scale factor of 8, so that when the machine moves one pixel, 8 step pulses are sent. This translates to 50 pixels / one revolution of the motor, or 50 pixels / 5mm of linear motion. This means that the pixel pitch is 0.1mm, or 254dpi. An image that is 1600x900 pixels will be 16cm x 9cm in size.
It should be noted that although the pixel pitch is 0.1mm, the pixel spot created by the laser is larger than 0.1mm x 0.1mm.

The sketch is at the bottom of the page

Step 9: Software (Vector Mode)

The machine is compatible with the very cool Grbl Arduino software.

Check out the Grbl website here:

Grbl has been designed to control 3-axis CNC milling machines. It interprets G-code instructions, and outputs control signals for X/Y/Z axis stepper motor drivers and the spindle.

For the laser engraver, the X and Y axis stepper drivers are connected to the relevant pins on the Arduino. The Z axis outputs are ignored.
The laser driver is connected to the spindle enable pin on the Arduino. To turn on the laser, the M03 code is used. The M05 code disables the laser.
(These are usually the codes to turn on the spindle (clockwise) and turn off the spindle)

The video below shows the machine engraving a vector drawing with Grbl.

Step 10: Improvements by the Instructables Community

This step is intended for sharing improvements made by Instructables readers.

Handshaking - by "spiralout11235"

The first improvement is from "spiralout11235" (clever username!) who has implemented serial handshaking between the Processing sketch and the Arduino (for raster engraving). This eliminates the need for setting time delays in the Processing sketch.  In addition, the Arduino sketch features PWM control of laser output, and a few other changes you'll notice if you look through the code closely.
He has kindly offered to share his ideas and code. Here are his notes:

Arduino sketch: version 4.0 Handshake
Processing sketch: 2.0 Handshake

Version notes: Handshaking is now implemented: no longer need to set delay times in Processing. This means Arduino and Processing send and receive data when the other is ready. Processing waits until it receives Serial data: SerialEvent() triggers and reads until the line break '\n'. So Serial.print()'s until Serial.println() is the entire command from Arduino. (Black and white images only; no greyscale)

1. Arduino println's out an "A" and waits for Processing to receive this and send it back. "Connection established".
2. Arduino sends a "1" to signal that it is ready for the "linelength" of the next instructions set.
3. If Processing receives "1" it sends (linelength + 10) (reason explained in code).
4. Arduino is now expecting linelength. Reads serial when it comes and writes linelength = linelength-10. Arduino sends "2" signaling ready for Instruction block.
5. If Processing receives "2" it sends the next instruction block.
6. Arduino receives instructions block and continues reading each byte until numBytes = linelength (expected number of bytes) as basic assurance of complete data
7. Repeat steps 2-6 until all instruction sets are sent.

In addition, I hooked up a Button and a Pot
- When Arduino starts up, while it's looking for Processing to start (establishContact() function), it enables the user to hit a button to turn the laser on; the percentage of 'on' is determined by the reading of the Pot. After setup, button/pot are not used.
- This enabled me to set up the laser current draw/limiting (at max Pot) as well as line up my target (at low Pot)
- Button: one side to ground, one side to pin 12, which is set to INPUT_PULLUP
- Pot (10k or anything high enough not to blow the pin (20mA I believe)): 1 end to 5V, the other to Gnd, the middle to Analog (A0) or pin 14
*After setup, laser power is determined from defined variable laserPercentage
**** Laser control must be at pin 10 (or any with PWM) for analogWrite() to work. If you don't have a Pot yet, just feed pin 14 5V so laser is set at full power.

The Processing and Arduino files are in the "" file below.

If you'd like to share your improvements or suggestions, send me a message (via Instructables or, and I can upload them to this step.

Step 11: Final Results and Conclusion

Picture of Final Results and Conclusion

Some images that the machine has engraved are above. (For the engraved photo and Arduino logo, some image processing was required before sending the bitmap to the C sharp application).

For more images, have a look on my website:

Final Thoughts
Overall, I think this project was worth the time and effort. I gained a lot of knowledge that can be transferred to future projects. Probably the most useful thing I learnt is to make sure all the parts can work together effectively - if there is a weak component, it has the ability to limit the whole machine, due to dependencies between components. For example, the motors have to be strong enough to move the axes, but then the frame has to be strong enough to hold the motors, and so on...

There are also a few future updates that would make the machine better:
- Install a stronger laser to speed up the machine
- Add limit switches on both axes to protect the machine from crashing into itself (haven't had a crash yet, but it is inevitable without limit switches)
- Refine the C sharp program, so that larger images don't take 15min+ to process into instruction files

Laser Engraving Tips

Visit the Obrary Blog for some of my laser engraving tips, and other useful info:


PaulW370 (author)2017-11-21

First of all, I love your project and am super excited to build something similar. Your information was already extremely useful to have an idea how to start! For my purpose I would like the machine to not only engrave wood, but also cut cardboard. Have you had any experience with this, or do you think your laser would be strong enough? (standard cardboard, around 2mm thick) From what I found a laser with 2W is about the minimum that can be used, so I'm thinking about getting a 3 or 5.5W one.

Would be a tremendous help, if you could share your ideas!

Greetings from Germany and Thanks in advance.


getburnt (author)PaulW3702017-11-22


Thanks for reading my Instructable! I haven't tried cardboard in my machine, but it did cut white paper easily. I think even a 1.5W laser should be able to cut cardboard (but at a slower speed than a 3W+ laser).

I would recommend getting the strongest blue laser diode you can (within your budget), as you'll have more power when you need it, and you can turn the power down if required. Also, make sure you get some good laser safety glasses!

coffee112358 (author)2017-04-03

Sir. Can we ask for your help in building this machine? How can we make sure that our stepper motor will not shake or vibrate when doing the process? And how can we make designs having sizes asked by the customer? Hope you see this comment.

getburnt (author)coffee1123582017-04-05

Hi, if your motor driver supports half-stepping or micro-stepping, that should help to reduce the motor vibrations. Also, if your machine has a strong, sturdy frame, motor vibrations shouldn't affect the engraving quality.

Regarding size, if you are engraving using my raster software, your machine will have a particular resolution - for my machine, it is 254 dpi (the pixel pitch is 0.1mm). You can control the size of the engraved image by scaling the bitmap image - for example, with my machine, a 10cm x 10cm engraving corresponds to a bitmap image of 1000 pixels x 1000 pixels

coffee112358 (author)getburnt2017-04-07

Thank you for the response sir. Regarding the motors, we would be using the same motor that you used. I wanted to ask if the motor drivers were configured to do specific steps or they will only be connected to the arduino and the stepper motors. And for the software, are they still available online? And lastly, we wanted to know if the software can automatically set the laser in the middle before engraving?

getburnt (author)coffee1123582017-04-09

The motor drivers connect to the Arduino and stepper motors. My drivers had some jumper switches for configuring half-stepping / micro-stepping.

My software is available - the files can be downloaded from Step 8. You will probably need to modify the Arduino sketch slightly to work with your machine (adjust timings, pin assignments, etc). If you want to engrave using GCode instead, GRBL is still available online.

My software doesn't centre the laser position, but the laser can manually be driven to a start position using the Arduino serial monitor, by sending it text strings (1,3,5,7 for right, left, up, down)

coffee112358 (author)getburnt2017-04-18

What configuration should we use when it comes to half-stepping or micro-stepping? Can we ask for the connections of stepper motors together with their jumpers and arduino?

Is there a way we can set the codes to make the laser center before engraving starts?

getburnt (author)coffee1123582017-04-20

I'd recommend trying a few different configurations, to see what is best for your machine. My machine is configured to use half-stepping. The user guide for your motor driver should show how to configure it for half-stepping. The user guide should also show how to connect the motor.

To centre the laser, you will need some reference points. One way to do this is to add limit switches in a corner of your engraving area (X/Y axes). You could get the machine to move the motors until it hits the limit switches, and that could be considered the origin of your work area. Alternatively, you could place the origin at an offset to the corner, based on a certain number of X/Y steps. My machine doesn't have this functionality - you would need to modify the arduino code and add the switch hardware to add a "centre" function.

coffee112358 (author)getburnt2017-06-07

Sir. Is grbl software optional? Because when I visited the site where there are steps on how to upload gcode to arduino board using grbl. And i saw that hex was the file format of the image and not bitmap.

getburnt (author)coffee1123582017-06-08

The bitmap images only work with my software. You can either use the raster engraving software on your machine (to engrave bitmaps), or use the Grbl software for vector-based engraving. You can't have both at the same time on the Arduino. I'm not really sure what you mean by "optional"

The Grbl "hex" file is the Grbl software - it replaces the arduino sketch. You can flash the hex file to your Arduino using XLoader. Alternatively, you can download the Grbl source code, compile it and upload it using the Arduino IDE (check here for more details:

Grbl requires Gcode instructions. You will need to prepare a gcode file, and use a gcode sender program to transmit the instructions to the Arduino - have a look at the video on step 9 for one way to get from a CAD drawing to a completed engraving using Grbl.

coffee112358 (author)getburnt2017-10-09

good day sir. i have a question about the laser driver. i made the same driver as you did with atx as power supply. now, when i connect my 2W m140 laser diode, it does not light up. but when i put LED instead of laser, it lights on. can i have some help about this? thanks

robdevenney (author)2017-07-03

Superb work and write up. There is a serious amount of time, energy and skill invested in this. I keep swapping and changing my mind of giving this a go but with the option of using it as a dual head CNC / laser engraver I just know from bittersweet past experience the amount of time these types of projects eat up. Definitely added to my favorites in Chrome for future study should I ever pull the trigger.

GF14 (author)2017-06-23

Sir, can you help me make a machine like that. I am beginner, before I have made cnc 3 axis machine using spindle separate (manual) with arduino, nema 23, stepper motor tb6560. I have also bought a 405nm laser and laser module. Can you give complete tutorial and flashing grbl for laser. thanks. I hope you will help.

getburnt (author)GF142017-06-24

Hi, I recommend breaking it down into lots of little tasks, and working on each task individually. For example, get one motor to work (using an arduino test sketch), then get the other motor working, figure out how to control the laser, etc. Once you have everything working separately, you can start putting the machine together - add one thing at a time, and don't rush it! Good luck

Hamids (author)2017-05-01

thanks for sharing your project , actually I use the new grbl 1.1f
but when I feed my gcode file to machine , it shows slow performance
whereas I saw many engraving use fast movements, I've tried to use
higher feedrate but its not very useful and its changed a bit , do you
have any idea where should I seek this issue ? on CAM side or machine
side ?


getburnt (author)Hamids2017-05-12

I would double check the GRBL settings - make sure the max rate for the X/Y axes is higher than the feed rate in your GCode. You might also need to check that the steps/mm is correctly configured in GRBL

muhammadm223 (author)2017-02-09

Bro,Your laser is use adruino? Or other?

getburnt (author)muhammadm2232017-02-10

Yes, my machine is Arduino based. For Gcode (vector mode), I use GRBL. For raster engraving, I use the custom made software in Step 8

muhammadm223 (author)2017-02-09

I find a problem again
My laser can't control the intencity automatically, so always use max intencity, if the picture has a thin line, my laser engrave a thick line with 100% intencity, so I want my laser adjust the intencity automatically, if the picture has a thin line the laser can engrave appropriate with my picture,
Im very pour of this problem
I hope You can solve my problem

adirams (author)2017-02-03

Can i have the engraving firmware?

muhammadm223 (author)adirams2017-02-08

Yes you can

getburnt (author)adirams2017-02-07

Hi, I've sent a message to your Instructables inbox

JonatanM8 (author)2016-12-27

Hola que tal, una pregunta, ¿ con que programa generas los codigos G ?
y, ¿ que programa usas para enviarlos ? ¿el Gcode sender? muchas gracias
y muy genial tu proyecto

getburnt (author)JonatanM82016-12-28


(I used Google translate, so hopefully these answers are helpful). For vector mode (with GRBL), I used the following:

Solidworks - to create the 2D DXF drawing

DXF2GCode - to convert the DXF into GCode

Universal GCode Sender - to send the GCode to the Arduino

In Spanish (Google Translate):

usé Google traducir, así que espero que estas respuestas son útiles). Para el
modo vectorial (con GRBL), utilicé lo siguiente:

- para crear el dibujo 2D DXF

- para convertir el DXF en GCode

Universal GCode Sender -
para enviar el GCode al Arduino

RobotEyes (author)2016-09-03

Some time ago I built a Laser Engraver with this GearBest Kit.

Unfortunately I have not found a software acceptable and easy to use, so I wrote my own.

My software allows to load a picture and send it to the laser engraver quickly and easily.

My software is written in a generic way for almost all machines with standard GCode firmawre.

At the moment the software is WORK IN PROGRESS currently, in ALPHA testing.

As I needed to modulate the laser power (I have a 5500 mW one) I used GRBL firmware version 0.9 (other versions are ON / OFF, 0.9 is PWM)

Here the Robot Laser Project page :

I will update soon the page (for now very rough).

Please send an email at with your opinion, thanks.

marc7974 (author)2016-04-11

Hi there....first of all...great project..I build my own 2 axis laser engraver... with belt drive and I used DRV8825 Stepper driver... mechanic and electronic works fine..i used gbrl and was able to make perfect circles. I rather use your setup with processing and got everything working...the only problem is my pic's come out oval instead of round...I tried changing the arduino parameters but nothing changes...any ideas...

Thanks ...Marc

Le MoulinD (author)marc79742016-07-26


Maybe you solved it and maybe i'm too late, but it might help someone :

If your step/mm are not the same on X and Y ($100 and $101 in grbl), get the ratio between steps/mm X and step/mm Y.

Then you can go in the arduino program, change const float stepsPerPixel; into :

const float stepsPerPixelX = 8;
const float stepsPerPixelY = 10;

Here 8/10 match my X over Y steps/mm ratio, but you will have to change accordingly

At the end of the document, put your stepsPerPixelX or stepsPerPixelY where you see stepsPerPixel written (use ctrl+f).depending on the kind of move. You will now have a scaled X and Y :)

Le MoulinD (author)marc79742016-07-26


Maybe you solved it and maybe i'm too late, but it might help someone :

If your step/mm are not the same on X and Y ($100 and $101 in grbl), get the ratio between steps/mm X and step/mm Y.

Then you can go in the arduino program, change const float stepsPerPixel; into :

const float stepsPerPixelX = 8;
const float stepsPerPixelY = 10;

Here 8/10 match my X over Y steps/mm ratio, but you will have to change accordingly

At the end of the document, put your stepsPerPixelX or stepsPerPixelY where you see stepsPerPixel written (use ctrl+f).depending on the kind of move. You will now have a scaled X and Y :)

getburnt (author)marc79742016-04-12

Hi Marc,

Do the X and Y axes for your machine have the same "steps/mm"? My Arduino code assumes they are the same, so if your machine has different "steps/mm" for X / Y, you'll need to modify the code and use a different "scalefactor" value for each axis.

If your machine is supposed to have the same "steps/mm" for both axes, maybe double check the microstep settings on your stepper drivers - if they are accidentally mismatched, that might explain the ovals.

RashidZ2 (author)2016-06-26

Hi there, amazing project, really liked ur explainations as well. I need some help. I am currently working on making a similar project, but instead of a laser im using a camera. However, the precision I need for the X and Y direction is 20 microns with minimal backlash. I am planning to use a 0.9 deg/step stepper motor and also a stepper driver for microstepping. However, I am not sure if this motor would be correct for this project and which stepper driver to get. I would love some help. Thanks!

getburnt (author)RashidZ22016-06-27

Hi, 20 microns is very small! I think it should be possible if you pick a ballscrew with a small pitch/lead. If you use a motor with 0.9 deg / step, it has 400 full steps / revolution. Then, if you pick a ballscrew with a pitch of 1mm, each full step results in a linear movement of 1mm / 400 = 0.0025mm = 2.5 microns. So theoretically, you will need 8 full steps to move 20 microns. This provides higher precision than my machine (1.8 deg / step, 5mm pitch -> 1 full step = 0.025mm = 25 microns).

I think the main requirement when choosing a stepper motor is torque - if the motor doesn't provide enough torque, you won't get reliable motion. You might need to experiment with a few different motors to find the sweet spot, (or just get very overpowered motors like me haha). Note: stepper motors have high torque when rotating slowly, and low torque when rotating at high speed.

Regarding the stepper driver, the main feature to look at is the current that it can provide for the motor. You need to be sure that the driver can provide more current than the motor requires. Half-stepping / micro-stepping is also nice to have.

jasonmarkham (author)2016-06-17

What is the transistor that you used, it surely must handle all the current that is passing through the ld.

getburnt (author)jasonmarkham2016-06-18

I used a TIP102 NPN transistor as a switch - it can handle collector currents up to 8A

marc7974 (author)2016-04-12

Hi again

Thanks for the fast reply...So...I'm using NEMA-17 steppers with 200 steps and 1.8 degrees on both X and Y axes. My drivers are set to 1/32 step resolution and the pulley's have 18 teeth. Your setup is 200 steps per rotation....18 rotation per in. and 25.4 mm per in. and no matter which setting I change it does not seem to make a difference.

I hope this helps....because i'm lost...LOL


getburnt (author)marc79742016-04-13

What type of bitmap files are you using? The C# program is expecting 24-bit bitmaps, so if it receives a bitmap with a different colour depth (eg 32-bit), it could explain the strange results.

Try engraving the "arduino.bmp" file that was included with the C# program (but remember to delete "cncinstructions.txt" and "imagearray.txt" before you generate the new instruction file).

If the arduino logo engraves at the correct aspect ratio, then you only need to change your image files to 24-bit bitmaps to get normal engravings.

suturb (author)2016-03-02

Hi all, i have a similar laser (2.8 w, 450nm) engraver but I'm slightly worried about the safety. It came with goggles but im not sure whether they suffice.
Is an indirect beam of this laser dangerous?
Which type of material wouldn serve as a good safety screen for such a laser?
Thank you! *

getburnt (author)suturb2016-03-02

Hi, your laser is a lot more powerful than mine! I'd recommend that you have a look at the laserpointerforums website ( to see which safety goggles are suitable. As long as you're wearing suitable eye protection for your laser, your eyes should be safe.

I didn't install a safety screen for my machine, but I made sure no one else entered the room whenever the laser engraver was running.

dennis17 (author)2016-01-11


Congratulations for your project ! I need some help... I assembled the driver as you suggested and I tried it to the same diode . It brings out light, but only for some seconds ... Any ideas ? Had you ever the same problem ?

Thanks !

getburnt (author)dennis172016-01-11

Hi, I haven't seen that problem before. Have you checked the max current of your power supply? If you used the same resistor values as me, it needs to supply at least 1.25A - if the power supply isn't strong enough, it might be shutting off automatically after a few seconds.

dennis17 (author)getburnt2016-01-12

My power supply is an AC Adapter that supplies output current up to 3A and voltage 12V. It is approximately like this :

Do I need another one ?

getburnt (author)dennis172016-01-12

That type of power supply should be ok. Have you checked the circuit with a multimeter? For example, connect a multimeter in series with the laser diode to see what happens to the current going through the laser. You could also do continuity checks to make sure the components are connected the correct way. The only other thing I can suggest is trying a different power supply, if you have a spare one.

Luckyyy23 (author)2016-01-04

Help, please.

The xloader uploaded 0.8 grbl.hex (successful). G-code Sender 1.0.9 and 1.0.8 also tells you that it is not booted up the Arduino. You can not do anything. What did I do wrong?

getburnt (author)Luckyyy232016-01-04

Did you select the correct port in Gcode Sender? If you're using Windows, you can check the COM Port number of your Arduino in Device Manager

jkeesler562 (author)2015-11-03

What is the biggest size you can print?

getburnt (author)jkeesler5622015-11-04

The theoretical maximum is 30cm x 30cm, but the machine is a bit too slow for that size - it would literally take half a day or more. The actual maximum is about 20cm x 15cm.

jkeesler562 (author)getburnt2015-11-04

So would it be a big adjustment to your plans to make it able to print at 30 cm x 36 cm? I want to make this and know nothing of any of these aspects of this machine.

getburnt (author)jkeesler5622015-11-04

There are a few modifications you could make to speed up the machine for larger engravings:

- use a more powerful laser. I'm only using a max current of 1.25A through a 1.5W laser diode. There are more powerful 445nm laser diodes now, that can handle a higher current (1.8A+). A stronger laser means you can reduce the time needed to engrave / burn a pixel

- speed up the motors when going over blank pixels. I limited the speed, to reduce the speed difference between blank and burnt pixels. This was because the machine would vibrate too much, if the speed difference was high. If a stronger laser is used, both motor speeds can be increased.

- reduce the machine's resolution. The machine has a relatively high resolution - 10 pixels per mm (or 254 dpi). You wouldn't need such a high resolution for larger engravings.

tduv (author)2015-10-17

Hey mate how you going? I'm building the main frame but I couldn't figure out what distance should I leave between the laser and the workplate. I'm planning to get a 2W 445nm diode. Is there an optimum distance calculation of some sort? Thanks a lot!!

getburnt (author)tduv2015-10-17

On my machine, there is about 11cm between the laser and workplate. You should pick a distance based on the focal length of your laser (lens), and the thickness/height of the items you want to engrave. If the laser module you choose is like mine, it will have an adjustable lens that can focus to a distance range of at least 5 to 11cm (it can probably focus to shorter/longer distances, but I haven't tested it to the full limits). Also, you could make a height adjustable mount, so that you can fit thicker/taller items under the laser. Your white frame looks cool :)

tduv (author)2015-10-04

Hi,I'm planning to build this project I was checking out the part list and I've got a couple of questions.

1.You are using 16mm ballscrew but the coupling is 6.35 to 8mm. How does it supposed to work? is there another piece between the shaft and the ballscrew?

2.In the list you've got 12mm shaft support (SK12). I don't understand where this is used.

Thanks for the help ;)

About This Instructable




Bio: I'm an engineer from Australia
More by getburnt:Arduino RC Car with FPV CameraArduino Laser Engraver
Add instructable to: