Cnc Laser Turtorial

23
Step 1: Frame Design

description

CNC Laser

Transcript of Cnc Laser Turtorial

  • Step 1: 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

  • 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 ofaluminium (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 thelinear

    motion of the base plate.

  • Step 3: Frame Construction

  • The ballscrew supports and shaft supports are mounted on 50mm x 50mmhollow 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

    about2mm.

    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

  • 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

  • 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 potentiometeris 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

  • 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

    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 regularbitmap 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 canskip 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 intocomma 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):

    111111111111111111111111115555555555555555555555555555555555920,

    019201920192010101010101010101010101010101010101010101010101010,

    010101010101010101010101010101010101010101010101010101010101010,

    0101010101010101010101010192019201920,

    11594039403940394039403940303030303030303030303030303030303030,

    030303030303030303030303030303030303030303030303030303030303030,

    0303030303030303030303030303030394039403940394039403940,

    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 theinstruction file.

    You can get Processing from here: http://processing.org/

    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

    whenburning 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: http://bengler.no/grbl

    Grbl has been designed to control 3-axis CNC milling machines. It interpretsG-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 "Handshake.zip" file below.

    If you'd like to share your improvements or suggestions, send me a message (via Instructables or

    [email protected]), and I can upload them to this step.

    Step 11: 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:http://getburnt.weebly.com/gallery.html

  • 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

    Step 1: Frame DesignStep 2: Linear Motion MethodStep 3: Frame ConstructionStep 4: Stepper Motors + DriversStep 5: Laser Diode + DriverStep 6: Power SuppliesStep 7: Microcontroller + Electrical ConnectionsStep 8: Software (Raster Engraving)Step 9: Software (Vector Mode)Step 10: Improvements by the Instructables CommunityStep 11: Final Results and Conclusion