- Easy to use software.
- Support JPG, PNG, GIF, BMP image formats.
- Stable USB connection, error-correction algorythm.
- Full kinematic test can check if engraver works ok.
- Saving and restoring projects for engraving.
- Auto-save projects before engraving.
- Alows to continue engraving in case if process interrupted.
- Manual laser position control.
- Realtime laser position indicator.
- Easy material testing.
- C# software to control engraver
- Arduino firmware to control engraver
- Schematics how to connect modules to arduino to make firmware work
If you don't want to build or edit sources of PC software, you can just run it with following steps:
- Check if you have installed .NET Framework 3.5
- Open application from:
PC Software\LaserDrawerApp v.3\LaserDrawerApp\bin\Release\LaserDrawerApp.exe
To build software, you need such environment:
- Use Microsoft Windows
- Visual Studio 2019 installed
- C# Windows Forms installed
Usage demo: https://youtu.be/yXsoJGkvpNk
- Before usage engraver already assembled, drivers installed, firmware flashed and configured.
- Connect USB cable from arduino.
- Open PC Software, update list of COM ports, select engraver COM port and press connect. Engraver will execute self-testing command to check if CNC works correctly. System will step some steps forward from home point and measure how much steps needed to trigger endstop again. Based on this measurement engraver will connect successfully, or throw an error. If you have errors on this step and can`t figure how to fix it, you always can send commands manually by arduino port monitor to debug device.
- Create new project. Project size is measured from top-left corner of working zone. If you not sure about project size, select 25% for first tests.
- Add images or text on project. JPG, PNG, GIF and BMP formats are supported.
- You can move laser head with arrows on left panel. Actual head position will be displayed on phoject area. You can move and resize objects in project.
- Set material paramenets: burn time for 1 pixel and number of repeatings. Material settings is very individual and optimal way to get best results is a lot of practice.
- If you don't know which burn time is best for you, you can use burn test block on left panel. It will burn short line (about 5mm) with selected settings and you can check if it's normal settings for your material.
- When objects are positioned, you can render your project. While rendering software will prepare instructions for engraving.
- If everything fine, press Engrave. System will initialize motors (if needed) and start engraving. Don't look at working laser while engraving, use safety glasses! If something goes wrong, press stop button. Engraver will stop executing commands and move head to 0. If needed, disconnect motors and laser from power.
Move laser head to maxumim and minimum position or table. As a result, system is measuring number of steps needed to trigger endstop from maximum position.
Turn ON device backlight.
Turn OFF device backlight.
Shows system status or engraver. For debugging.
When motors disabled, you can easily move laser head.
The easiest way to engrave. If your engraver not perfectly precise, use this mode. The most reliable method, usually gives the best result, although it takes longer to engrave. The setting is applied at render time. If the project is already rendered, a re-render will be required if the optimization method is changed.
Enables burning when laser head moves back. Your engraver has to be assembled very precisely, othervise image will deform if you enable this optimization; May cause distortion in the form of "doubling" of the picture. If such appear, turn off the optimization. The setting is applied at render time. If the project is already rendered, a re-render will be required if the optimization method is changed.
Aligns all instructions to minimize laser head movement. Optimal for cutting (but notice, begerally this software is not optimized for cutting at all). Also breaks every instruction into 3px length. It needed to get better results in case if engraver is used for cutting. Your engraver has to be assembled very precisely, othervise image will deform if you enable this optimization; It can cause distortion in the form of divergence of fragments of the picture. If such appear, turn off the optimization. The setting is applied at render time. If the project is already rendered, a re-render will be required if the optimization method is changed.
Just for fun, scrambles all the instructions. Very inefficient way to engrave:) Can cause all distortions of the picture. Engraving for a long time. Just for fun. The setting is applied at render time. If the project is already rendered, a re-render will be required if the optimization method is changed.
If semitones enabled, burning time for every pixel is calculated based on pixel darkness and burning time value set by user. If semitones disabled, burning time for every pixal can be only 0ms or burning time value set by user. Whether to keep the halftones of the image. Halftone engraving takes much longer and is not suitable for every material. The setting is applied at render time. If the project is already rendered, a re-render will be required if the render settings are changed.
Open one more window with log. Useful for debugging.
If enabled, more information will be printed to log.
Show info about developer and credits.
Opens previously rendered and saved set of instructions. Notice, that every time you render your project, it automatically saved in temporary folder. So, if engraving process is interrupted, you can open autosaved project and continue from last engraved position. Just don't move objects on table.
Saves rendered set of instructions.
Get list of available COM port list to ComboBox and tries to select one with connected Arduino.
Try to connect to COM port and send command for self-testing. If self-testing passed, connection successful.
You can:
- Manually move head. Slow or quick.
- Manually enable laser (dangerous!!!).
- Put laser head to zero coordinates. If motors is disabled before command for move, firstly motors will be initialized to home point.
It will burn 50px (usually about 5mm length) line with selected burn time.
It can help you detect optimal burning time for your material.
The longer the burn time, the more contrast the resulting image will be. For each material, this value can vary greatly.
To find out what burn time is suitable for a particular material, find a small fragment on the material on which you can test by drawing a few lines.
Pressing the "Burn Line" button will start drawing a line with the specified settings a few centimeters to the right of the current laser position.\
- If the line is invisible, you can try more time.\
- If the line burns through the material, use less time.
Here you can arrange objects in project. You can add text, images or empty frame. Empty frame can help positioning image if needed. Next step is render it to get set of instructions. Rendered set of instructions can't be changed, moved.
When you rendered your project, review reconstruction for your set of instructions. Red lines if burning zones, blue lines is laser head movement. If everything OK, you can start engraving. Left panel shows progress of engraving.
Arduino Nano, main controller based on Atmega 328p.
Link: https://www.banggood.com/Geekcreit-ATmega328P-Nano-V3-Controller-Board-Improved-Version-Module-Development-Board-p-940937.html
board allows connect Arduino and motor drivers: CNC Shield V4 Expansion Board With Nano
Link: https://www.banggood.com/CNC-Shield-V4-Expansion-Board-With-Nano-and-3Pcs-Red-A4988-For-3D-Printer-p-1343033.html
12V 20W 450nm Laser module
Link: https://aliexpress.ru/item/1005003148619218.html
- Motor drivers TMC2208, silent.
Link: https://aliexpress.ru/item/4000869320068.html
CNC DIY Set with 2040 aluminium profiles
Link: https://aliexpress.ru/item/1005002058668194.html
MakerBot Endstops
Link: https://aliexpress.ru/item/4000602312490.html
NEMA17 Stepper motors
Link: https://aliexpress.ru/item/32665922113.html
- D2: X DIR: Direction signal for X stepper motor driver.
Can be inverted in
Global.h
in line definition. - D3: X DIR: Direction signal for Y stepper motor driver.
Can be inverted in
Global.h
in line definition. - D4: Z DIR: Direction signal for Z stepper motor driver. Not used in project. Needed only as CNC shield schematic.
- D5: X STEP: Step signal for X stepper motor driver.
One pulse is 1 step. It's recommended to use smallest possible steps for your driver (64 microstep).
Steps speed can be set in
Config.h
. - D6: Y STEP: Step signal for Y stepper motor driver.
One pulse is 1 step. It's recommended to use smallest possible steps for your driver (64 microstep).
Steps speed can be set in
Config.h
. - D7: Z STEP: Step signal for Z stepper motor driver. Not used in project. Needed only as CNC shield schematic.
- D8: EN: Enabled signal for X, Y, Z stepper motor driver. Sets when motors have to be enabled or disabled. HIGH is enabled, LOW is disabled. When motor enabled, it hold its position, you can't move it manually. When motor disabled, it allows you to manually move laser head.
- D9: LED: controls engraver backlight. HIGH is enabled, LOW is disabled.
- D12: LASER: controls laser. Uses PWM. HIGH is enabled, LOW is disabled.
- A7: END X-: reads endstop signal from X axis. Used to detect home position of laser head. Endstop is have to be installed in LEFT side of X axis (this is zero point). When HIGH, endstop is acticated. When LOW, endstop is released.
- A6: END Y-: reads endstop signal from X axis. Used to detect home position of laser head. Endstop is have to be installed in TOP side of Y axis (this is zero point). When HIGH, endstop is acticated. When LOW, endstop is released.
Check if all axises of your CNC is aligned and moves easily.
Check or replace your Arduino and USB cable.
Check if your arduino is alive, replace Arduino and check if you selected correct bootloader for your Arduino.
- Install Arduino IDE. I used Arduino 1.8.16. Link: https://www.arduino.cc/en/software ;
- Because Arduino IDE don't have drivers for CH340, you need to install drivers manually. You can find drivers enywhere over Internet. I found here: https://drive.google.com/file/d/1BqUo6f5WEd1vqdxt1UWzDh4OgjdQ7Mx1/view ;
- Additional libraries not needed.
- Open project and try to build it. If all steps done correctly, project will build successfully.
After successful build you can start configuring firmware by changing values in
Config.h
. When make first configurations, be ready to disconnect power immediately in case of unexpeted behaviour.
After successful build you can start configuring firmware by changing values in Config.h
.
Here are list of available configurations:
Line.h
>long MOTOR_DIVIDER
: Defines how much physical motor steps is counted as 1 pixel. Using this value you can adjust physical resolution of engraved image.
For example:
If divider for my engraver is 1 (1 pixel equals 1 step), resolution of my table is 36400px X 33600px. This is too much, so I adjusted resolution by dividing it by 7:
If divider for my engraver is 7 (1 pixel equels 7 steps), resolution of my table is 4800px X 5200px, giving me resolution of 583 DPI.
Value7
is optimal if you are using NEMA7 motors with 1/32 microstep.Line.h
>int precise_homing_steps
: Used only when laser head is going home. How much steps go forward after endstop is triggered.
Value has to be small, but enough to unclick endstop.Config.h
>int X_SIZE
: Defines width of working table in pixels.Config.h
>int Y_SIZE
: Defines height of working table in pixels.Config.h
>long speed
: Max speed of laser head movement. Unit is steps per second.
More is quicker, less is slower.
Value 10000 is acceptable to NEMA17 motor and 1\32 microstep.Config.h
>float startAccel
: Acceleration of motor.
The greater number - the quicker the acceleration. There is no measurement unit and maximum value for this number.
0 is no acceleration (all movement on minimal speed).
0.05 is optimal value for my engraver (NEMA17 motor and 1\32 microstep).Config.h
>float stopAccel
: Speed of breaking. Works differently from startAccel, optimal ranges also different.
There is no measurement unit and maximum value for this number.
The greater stopAccel - the quicker braking.
0 is moving laser head on minimum speed all the time.
0.5 is optimal value for my engraver (NEMA17 motor and 1\32 microstep).Config.h
>const int MAX_INSTRUCTIONS_COUNT
: Number of instructions stored in RAM memory of Arduino. This number is used only forupload
command. This number have to be the same in PC Software.
One instruction tooks 10 bytes of memory.
In my case I used 130 instructions.Config.h
>const int POS_UPDATE_FREQUENCY_MS
: Defines time (in ms) between sending position data to PC Software.
Very frequent updating leads to channel overloading and unstable motors movement.
In my case optimal value is 100ms.Config.h
pin definitions:
int X_DIR_PIN
- Where direction pin from X motor driver is connected.
int X_STP_PIN
- Where step pin from X motor driver is connected.
int X_END_APIN
- Number of analog pin where X endstop is connected. (A0=0, A1=1, A2=2...)
int X_EN_PIN
- Where enable pin from X motor driver is connected.
int Y_DIR_PIN
- Where direction pin from Y motor driver is connected.
int Y_STP_PIN
- Where step pin from Y motor driver is connected.
int Y_END_APIN
- Number of analog pin where Y endstop is connected. (A0=0, A1=1, A2=2...)
int Y_EN_PIN
- Where enable pin from Y motor driver is connected.
int LED_PIN
- Where connected switch for engraver backlight.
int LASER_PIN
- Signal pin for laser.Global.h
-Line lineX
-Invert direction
X motor direction inversion.Global.h
-Line lineY
-Invert direction
Y motor direction inversion.
Commands separated by ;
. Command arguments separated by ;
.
Engraver answers starts with !
, separated by \n
. Engraver arguments separated by ;
.
Baud is 115200.
Send from PC to Engraver to pause any process:
pause;
.
Send from PC to Engraver to resume paused process:
continue;
Command needed to check if engraver ready.
Send from PC to Engraver:
status;
Answer from Engraver to PC:
![STATUSOK]!
Run full-range mechanical self-test.
Laser head will move from home point to max point and back.
Send from PC to Engraver:
selftest;
Answer from Engraver to PC:
![TEST;PASS;PASS]!
![TEST;PASS;FAIL]!
"TEST", "PASS"/"FAIL" result for X axis, "PASS"/"FAIL" result for Y axis.
Run quick mechanical self-test.
Laser head will move from home point to some point and back.
Send from PC to Engraver:
selftestquick;
Answer from Engraver to PC:
![TEST;PASS;PASS]!
![TEST;PASS;FAIL]!
"TEST", "PASS"/"FAIL" result for X axis, "PASS"/"FAIL" result for Y axis.
Initialize engraver to starting point.
Send from PC to Engraver:
home;
Answer from Engraver to PC:
![OK]!
Get information about firmware version.
Send from PC to Engraver:
version;
Answer from Engraver to PC:
![FP myCNC v3, Compile date: Mar 18 2022 23:15:31, Free RAM: 503 bytes.]!
Get size of wirking zone in pixels. Data is collected from Config.h
file.
Answer contains width and height. This data is used to select project size.
Send from PC to Engraver:
size;
Answer from Engraver to PC:
![SIZE;2100;2100]!
Enable or disable engraver backlight.
Send from PC to Engraver:
ledoff;
or ledon;
Answer from Engraver to PC:
![OK]!
This commands sent form PC to Engraver start laser head movement.
Send from PC to Engraver:
rightslow;
- Start slow moving right.
rightfast;
- Start fast moving right.
leftslow;
- Start slow moving left.
leftfast;
- Start fast moving left.
upslow;
- Start slow moving up.
upfast;
- Start fast moving up.
downslow;
- Start slow moving down.
downfast;
- Start fast moving down.
While head is moving, engraver keep sending its actual position:
![POS;868;500]!
To stop moving head, send from PC to Engraver stop command:
stop;
Answer (from Engraver to PC) for stop command is:
![OK]!
To get current actual position of laser head.
Send from PC to Engraver:
pos;
Answer from Engraver to PC:
![POS;868;500]!
Disconnect motors from power.
Send from PC to Engraver:
release;
Answer from Engraver to PC:
![OK]!
Enable laser (DANGEROUS!)
Send from PC to Engraver:
laseron;
Answer from Engraver to PC:
![OK]!
To disable laser, send from PC to Engraver stop command:
stop;
Answer (from Engraver to PC) for stop command is:
![OK]!
Burn short line with selected burn time for pixel.
Send from PC to Engraver:
burntest;5;
Answer from Engraver to PC:
![OK]!
Manually move head to selected coordinates
Send from PC to Engraver:
goto;5;5;
Answer from Engraver to PC:
![OK]!
![POS;868;500]!
First stage of engraving: send commands to engraver and check if delivered normally.
Maximum number of commands for one upload: 130 (can be configured in Config.h
.
Send from PC to Engraver:
upload;5_20_600_50_600;end;
Description: Upload;command1;command2;...;end;
Command: burnTime_x1_y1_x2_y2 (Y2 is ignored)
Answer from Engraver to PC:
![CHKSUM;130;465;934;123]!
Description: ![chksum;number_of_commads;Ys_sum_mod1000;lengths_sum_mod1000;times_sum_mod1000]!
Examples:
upload;11_1400_1100_1600_1100;11_1400_1100_1600_1100;11_1400_1200_1600_1200;end;execute;
![CHKSUM;130;465;934;123]!
Second stage of engraving: execute commangs that was sent by upload
command.
While engraving is in progress, engraver is senging progress
and pos
answers.
When execution finished, engraver sends complete
answer and wait for next upload.
Send from PC to Engraver:
execute;
Answer from Engraver to PC:
![ENGRAVING]! ... ![PROGRESS;30]! ... ![POS;868;500]! ... ![COMPLETE;1]!
goto;2100;2100;home;
goto;1000;1000;goto;1200;1200;