Introduction (this article is under construction)
Having been impressed by the bond film, Goldfinger, many years ago I have decided to try to make a laser cutter. (Actually, I had access to a laser cutter some time ago and found it a very useful piece of kit. For example, I used it to cut the customised instrument panels for my TR7-V8 project.) Also, many years ago, I had been fascinated by home-made laser projects described in the The Amateur Scientist pages of the Scientific American (at the time, pre 2001, when it was a really good mag). Sadly, making a CO2 laser is probably beyond me now (it require glass blowing, vacuum technology etc.) but I should be able to have a decent stab at a cutter if the numerous YouTube videos describing how it can be done are anything to go by.
Below are some things I did when I had access to a laser cutter. It could cut 3mm Perspex and MDF easily but would not touch metal. Top left: The basic arrangement of a laser cutter with a stepper motor for each axis (X & Y). Top right: I designed the parts for the TR7 switch panel on CorelDraw. A printer driver for the laser cutter was loaded on my laptop and transferring the design to the cutter was as simple as any print job. Below, middle left: The logos for the switches which were glued into the black panel with corresponding cut outs. Below, middle right: The panel installed in the car. Below, bottom left: Triumph logo for Nardi steering wheel. Below, bottom right: Illuminated TR7 V8 logo in panel on centre console. The logos were illuminated by LEDS glued to the back of the panel (I describe this in more detail on my old site, www.mr-r.co.uk).
It strikes me that a laser cutter is in some ways easy to build, compared to, say, A CNC milling machine which has to have enough strength to press a rotating cutting tool against a piece of work and also move a heavy motor around in three dimensions. The laser cutter just needs to move some mirrors and a lens around in two dimensions. Hence the motion can be controlled by a toothed belt rather than a lead screw and nut. There is, of course the difficulty of lining up and focussing an invisible beam of light with the potential to blind or start a fire!
As far as I can see, all laser cutters are XY, Cartesian coordinate type machines. Not being averse to a left field solution, what other configurations are there that will be able to cover every point on a rectangular area? For example, something like the human arm pivoting at the shoulder and elbow would be possible. The business end is only supported by the levers and the two pivots which would have to be very rigid and free from play. Also I’m not sure how the laser mirrors would be arranged. Another configuration could be the delta arrangement used on some 3D printers. I’m not sure how the mirrors could work with this either. So Cartesian X-Y it is!
It would seem that by far the most popular way of making a laser cutter or similar is to make use of aluminium extrusions developed by OpenBuilds which feature V-edged grooves which can guide sliding carriages running on specially profiled wheels. These extrusions come in various different multiples of a basic 20x20mm base configuration. I have chosen 20x40mm versions as the carriages will run on the 40mm side providing a more accurate location than a 20x20mm extrusion. They will also be more rigid.
There seem to be two ways to cause a stepper motor to drive a carriage across an extrusion (see above). One way is to mount the stepper motor at the end of the extrusion and have a loop of drive belt the lenth of the extrusion with an idler wheel at the opposite end to the motor. The carriage is fixed to the belt at one point and is pulled back and forth as the bet moves. The other method places the motor on the carriage with a fixed belt which acts as a sort of rack to the drive wheel on the motor’s pinion. The belt passes under the wheels of the carriage and up (or possibly down) round the drive wheel on the motor making sure that sufficient teeth are in contact to ensure a secure drive. Which is better? (Answers on a postcard…)
The principle behind a stepper motor is quite simple; some electromagnets are turned on and off so as to drag magnets round and round. (I made a YouTube video – see below- which demonstrates this simple principle. However, the details of driving the coils of the electromagnets at speed is a different matter and the theory of driving quite high current pulses into inductances might have been accessible to me when I was at college many years ago but now… not so much!
More complexity involves fractional steps, when the magnets are not just dragged round to be exactly opposite one pole but are somewhere in between two. There may be up to 32 fractional steps. A half step is easy, adjacent poles are turned on so the magnet hovers halfway in between but 1/32 from one pole and 31/32 from the next must be tricky for the electronics driving the coils! Fortunately, clever ICs have been developed and Pololu (who seem to have a big share of the market) have incorporated them onto small breakout boards which can easily be incorporated into other circuitry.
Choosing the right Stepper Motor
I’m not sure how to choose the right stepper motors. The loads are light, so nothing very large should be necessary. NEMA 17 seems to be appropriate. The 17 in NEMA 17 – (National Electrical Manufacturers Association), just seems to refer to the diagonal distance between the fixing holes, in this case 1.7 inches. I am using Motech Motor type MT-1704HSM168A supplied by Ooznest. These are 0.9 degree per step motors (400 steps / revolution). Most seem to be 1.8 degrees (200 steps). The more steps, the better the resolution but, perhaps, the slower the speed? Time will tell whether I have made the right choice!
Electronics and Software etc.
2D and 3D CAD programs (my laser cutter will only need 2D design) will output vector graphics designs as files in svg or dxf format. These will have to be converted to a G-code file which contains instructions for the movement of stepper motors etc. tailored to the CNC machine being used. The CNC machine needs its own computer with software which can read the G-code instructions and send the required pulses to the stepper motor driver circuits.
Arduino Uno provides the Brains
At this stage, this is how I see the electronics and software for this project developing. I am going down the open source route. I intend to use an Arduino Uno flashed with GRBL motion control software. An Arduino CNC Shield will sit on the Uno and provide sockets for the Pololu stepper drivers and various jumpers which can be used to customise the operation of the whole kit and caboodle (see picture above – the Uno is under the CNC shield).
Not so Banggood
As an aside, I really feel for the guy who originated the CNC Shield. This is a quote from his site: “Due to Chinese Clones being sold for less than $5 and pricing me completely out of the market (and them not contributing to the project) I have decided to not publish future versions (of) design files.” And its true, on sites like Banggood you can find shields with clones of the Pololu drivers for peanuts. Apart from a lack of manufacturer’s logo, they look absolutely identical.
Of course, this is everywhere. Arduinos and similar have been cloned for years. I once bought a cloned Ethernet Shield, it was about £10 cheaper than a genuine item and I have felt (a bit) guilty ever since. This is, perhaps, the one area, the stealing of intellectual property, where I have a bit of sympathy for Trump. Did I just write that? UGH!
Add in a Raspberry Pi
I hope use a Raspberry Pi to send G-code to the Uno via a USB/serial connection. The Pi will run bCNC “Swiss army knife for all your CNC/g-code needs”. (Universal Gcode Sender is, I believe, an alternative.) Also, keeping things Pi-based, I could use Inkscape running on the Pi to do the required CAD work (but it’s probably going to struggle) or I could send files to the Pi from my PC over SSH etc. If required, I can monitor/control the Pi remotely from my PC using VNC.
Testing GRBL , the CNC Shield & Drivers
While waiting for some parts to arrive, I started to load some software. Flashing GRBL to the Arduino proved to be straightforward following these instructions and I was able to issue some G-code instructions (for example: G0 X100 or G1 Y-50 F100)) using the Arduino IDE Serial Monitor (set the baud rate to 115200 or it won’t work!) and see a stepper motor run. The “running” did not seem totally right – sometimes it would seem to stop before it’s allotted number of steps had been run. Then I guessed that the DRV8825 might be overheating and shutting down while it cooled off. (As a person who had to use a pair of pliers to conduct the heat away for the leads of germanium transistors while soldering to prevent them being permanently cooked, I still can’t quite believe semiconductors can get so hot and still work!)
The problem was, I believe, A failure on my part to set the current limit. The easiest way to do this is to measure the voltage at a through hole connection on the Pololu PCB. I put a piece of 30 gauge wire through the hole to make contact and measure between this and ground. Twiddle the preset potentiometer on the board until the numerical value of the voltage is half the numerical value of the desired current limit (see picture below).
Next, I installed bCNC on the Raspberry Pi 4. This is a Python package utilising Tkinter. Installing a Python package is not completely straightforward for those who just dabble in Python like me! There are details here. According to someone on a blog (I can’t remember the reference!) you need the following installed first before installing bCNC: pip, numpy, scipy, tk, wheel, serial, setuptools PIL, and opencv. The last two allow X-Y alignment using a USB web-cam on the gantry. I’m not sure if this will be useful for laser cutting. Anyway, with some difficulty, I installed opencv using the instructions on this page. This also showed me how to install all these bits and pieces within a virtual environment which seems to be a good thing.
The otherwise perfect description of the opencv installation process seems to leave out a couple of points. Under “Step #4”, add the following lines to your ~/.profile:
export WORKON_HOME=$HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv source /usr/local/bin/virtualenvwrapper.sh export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin
Without the last line, I got the error /home/pi/.virtualenvs/cv does not contain an activate script. Also, to ensure that the virtual environmet works when you close the original shell and open another, you have to add these lines to ~/.bashrc:
export WORKON_HOME=~/.virtualenvs VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3' source /usr/local/bin/virtualenvwrapper.sh
Then you have to source ~/.bashrc to activale the changes.
Initial testing of bCNC
So having finally got bCNC installed on a Rpi, I connected the Arduino/CNC Shield with a USB lead and started bCNC (open a terminal window and enter workon cv – cv being the name of my virtual environment – then enter bCNC return).. I selected the correct port by trial and error (it was /dev/tty/ACM0) and was able to run both the X and Y axis motors by clicking on the “Move Gantry” button, moving the cursor on the drawing board (is that what it’s called?) and clicking.
Some parts arrived from Ooznest, so I was able to start construction. For now, I am concentrating on building a two-axis, CNC-controlled (in effect) plotter. If I can get that working, I will then invest in a 40 Watt CO2 laser.
V-slot makes it easy
The use of Openbuilds type parts seems to be universal for self-build projects and that is the route I am taking. I have bought enough 20/40mm V-slot extrusion to make a rectangular frame and a gantry to move up and down it. As I mentioned above, 20/40 seems to be the right dimension of extrusion for a machine in the region of 900 x 500 mm. I relied on Ooznest to cut the extrusions to length. It’s really important they are cut really accurately and exactly square and they have the right saw to do it. I have seen videos of mitre saws being used and it is true that almost any type of blade can cut aluminium (without, in my experience, getting rapidly blunted – as a child, I used woodworking brace and bit augers to cut holes in aluminium to mount valve or vacuum tube bases and they are still fine after fifty odd years with only the occasional sharpening). However, most setups will not be as accurate as is required in my view.
Bits & bobs
I bought a job lot of angle brackets, a bag of 5mm T-slot nuts and 8mm button-head stainless steel socket-head screws from Ebay and Amazon and assembled a frame. I had never used T-slot extrusions before but I was impressed with how quickly it all goes together. Put the screw through the bracket, start the nut on the screw, push it through the slot, turn the screw with a ball-headed Allen key and the nut spins round and jams at ninety degrees before it finally tightens up. Voila! Job done!
Having, therefore, got a frame and a bar which would act as the Y gantry, I purchased three V-slot gantry plates (with Delrin wheels which slide along the V-slot), some 2GT Gates Open Timing Belt (6mm wide) three 2GT Pulleys – 30 Tooth (for 6mm belt – 5mm bore to fit the steppers) and a couple of 2GT 20 – toothed Idlers – again from Ooznest.
Then I needed to make up a lot of brackets and similar bits and bobs to hold the stepper motors, tension the drive belts and attach limit switches etc. I made these mostly out of 3mm (or 3.2mm) aluminium plate or angle.
Accurate drilling (hopefully!)
In order to accurately place holes and in the absence of a CNC drill/mill (perhaps this is what I should be making?) I used my 3D printer to make patterns with the holes in the right places. The patterns had 2mm holes for pilot drills which were then enlarged. The problem with this method is that the patterns only last one time as the holes in the PLA are quickly enlarged.
Fortunately, the accuracy of operation of the finished machine depends on the accuracy of the stepper motors and the Grbl software driving them (and the belts and pulleys, perhaps). For the most part, a lack of accuracy in the construction of a few tenths of a millimetre on my part will not be a problem.
When enlarging the pilot holes, it pays to clamp the work down to the drill table as just holding it “loose” with a machine vice inevitably leads the hole to wander out of true. This problem increases as the diameter of the hole increases – for example, the hole for the location of the stepper motor (22mm diameter) for which I used a stepped drill (from Aldi!). I scribe a 22mm diameter circle with dividers first so that I am reasonably confident the hole is in the right place as the hole increases in size.
Below, left: A 3D printed drilling pattern. Below, right: Belt tensioner for the Y gantry (still needs a bit of finishing!)
Below, left: The Y axis tensioner – the screws marked by the arrows adjust the tesion with clamping screws on the slots. Below, right: The X axis version.
Below, left: The Y drive arrangement. Below, right: The X drive arrangement. Here I’ve had to space the motor out from the gantry plate with two thicknesses of 3.2 mm aluminium plate to get the drive pulley over the centre of the slot. As you can see, I’ve used both the drive arrangements described at the beginning of this page.
Below: The basic arrangement completed (sort of!) For the time being it’s just resting on blocks of wood.
In addition to the X and Y limit switches at bottom left which will be connected to the CNC Shield to establish the home position, I fitted four other switches to detect out of range movement of the gantry; two each at max. and min. X and Y movement. (For the moment, I am not considering any possible Z movement – at this stage I don’t know how this will work out.)
Safety limit switch circuit
I am connecting these four limit switches to an independent circuit which will cut out power to the stepper motors (and the laser). (I am aware grbl could do this but I want the extra safety of being grbl-independent.) The circuit is a bi-stable latch arrangement using my old friend the 555 IC (see above drawing). This will switch a couple of relays (Panasonic ALE1PB05, 277VAC, 30VDC, 16A, 5V coil from Farnell, 1712521) which will control power to the steppers and laser as just mentioned. On the 555, taking pin 2 low switches the output high and taking pin 6 high switches the output low. The 555 output drives the relays via a couple of transistors to provide the current. Pin 6 is connected to an inverting transistor so that taking the base connection of the transistor low will take pin 6 high. This enables the limit switches to short to ground rather than 5 volts. (This seemed like a good idea but I can’t exactly say why!)
As usual the pcb provides plenty of “prototyping” pads for components I have forgotten to include at the design stage. The pcb layout does not show the 0.1uF capacitors across the limit switches and reset switch as I incorporated these after I had designed the pcb and they had to be soldered on the track side (I found the inputs could be triggered by just touching them with something metallic which isn’t good!) The layout also doesn’t show the LED which lights on power up and when the limits are triggered. Also the 22uF and 0.1uF bypass capacitors are not shown. Also there are some minor changes to resistor values which reflect what came to hand (resistor values are mostly non-critical – except when they are!)
The 5 volts comes from the Raspberry Pi via the USB lead. I worry that switching pulses for the relays will feed back into the Pi and the Arduino and upset things but so far, this has not happened. (Incidentally, the power for the three stepper motors is coming from a 15 volt power supply I made many years ago. It has a large mains transformer and a hefty smoothing capacitor. I understand this is desirable to smooth out high transient currents derived from pulsing the steppers. I will construct a new power supply in the fullness of time – probably!)
Safe at start up
The 555 has its reset pin (4) taken to 5 volts via a resistor and to ground via a 0.1 uF capacitor. This ensures that on power up, the 555 is in a reset state i.e. the output (pin 3) is low. That means that on power up the supplies to the motors and laser are disconnected. The power is enabled by taking pin 2 low with a push button switch. (So the machine does not start up if mains power, say, is unexpectedly applied.)
Above, left: This shows the limit switches for min. Y. The bottom switch is to establish the Y home position, the top switch works with circuit described above. The picture above, right shows the CNC shield (with the Arduino Uno underneath) and the safety limit circuit with its two relays, 555 etc. plus a whole mess of wires which will (hopefully) be tidied up as the project progresses. For convenience the electronics are screwed to a piece of Tufnol attached to the V-slot. They will probably be repositioned as the project progresses.
By pure luck, the safety limit switches trigger a fraction after the homing limit switches (probably because of slight variations in the bend of the lever) which means that homing does not trigger the safety cut out. If this had not been the case, I would have had to kept the reset button pressed during homing (the red reset button can be seen hanging from the circuit in a temporary configuration).
Before I could do any testing, I had to get the machine to “home” on just the x and y axes. You have to edit the config.h file in the Grbl distribution, the recompile Grbl on your Arduino Uno. Probably a good idea save the original config.h to a location where it can’t be found during the compilation process otherwise you will get errors.
Comment out the line:
#define HOMING_CYCLE_0 (1<<Z_AXIS) // REQUIRED: First move Z to clear workspace.
Then uncomment lines:
#define HOMING_CYCLE_0 (1<<X_AXIS) // COREXY COMPATIBLE: First home X
#define HOMING_CYCLE_1 (1<<Y_AXIS) // COREXY COMPATIBLE: Then home Y
During recompilation, I noticed that various Grbl settings were retained. I assume these are not overwritten with the generic values when Grbl is recompiled if changes are detected? Perhaps theses are stored in EEPROM memory, if you want to really start from scratch, this should be erased first. See https://www.arduino.cc/en/Tutorial/EEPROMClear.
Having done this, I started bCNC on the Raspberry Pi and connected to the Arduino by clicking on the appropriate button. Initially, as a safety measure, the system starts in an alarm condition so the “unlock” button needs to be clicked on. Then I could click on “Home” and watch the gantry do its thing!
Next, I used the “jog” arrows to move the gantry beyond its limits to test the appropriate limit switches connected to my 555 circuit. The motors cut out as expected.
Then I was in a position to calibrate the X and Y movements in terms of steps per mm. Set the jog to move 10 mm and measure the actual movement with a vernier gauge (see picture above). Allow the carriage to push the vernier gauge then measure how much it has been moved. Calculate the revised number of steps and enter the value in the Grbl settings. New step value = old value * 10 / measured movement. I used the Serial Monitor facility on the Arduino IDE to input the values (set the baud rate to 115200 or it won’t work! $100 sets the X value, $101, the Y value.) Then test again. Repeat until the gantry moves as it should. Set the gantry to move 100 mm and test again, repeating until the movement is correct. I got very slightly different values for X and Y despite the fact the motors and drive pulleys are the same. Perhaps this is down to belt tension. I will (perhaps!) test this out in the future.
Testing by drawing
Next, I tried to determine whether the gantry would actually move according to some sort of GCODE file (the language of CNC machines). The free Illustrator – like program Inkscape can output 2D GCODE files and I used this with a drawing of a simple gear wheel. (I actually drew this on my ancient version of Corel Draw (with which I am very familiar) and exported/opened this as a .cdr file in Inkscape.
There is some sort of bug in this process as the drawing appears larger than it should. I understand this may be related to a confusion on the program’s part between pixels and points as unit of length. It appears that a scaling factor of 35% will bring it back to the correct size (although I would want to look into this a bit more if I was using the machine in anger).
In order to generate GCODE, I took the following steps. First, from the Layer menu, I added a layer, then, from the Path menu, I clicked on Object to Path. Finally in the Extensions menu I went to Gcodetools, Path to gcode. I accepted all the defaults and ignored all the warnings which produced an .ngc file which is a text file comprising GCODE commands. I then transferred the file to the Raspberry Pi using Win SCP.
I clamped a pencil to the gantry, loaded the file into bCNC and started it up. I was rewarded by a rather neat drawing of a cog! (Below, left: The cog on bCNC. Below, right: The machine drawing said cog.)
More calibration attempts
Finally, in this phase, I drew a 50 x 50 mm square in Inkscape, outputted the GCODE to bCNC and ran it on the machine. While it was running I nudged a vernier gauge in both the X and Y directions. I found an error of about 0.3 mm in the Y direction over this distance. This seemed to show that I had been wrong with my initial calibration when I seemed to detect the need for very slightly different values in steps/mm for X and Y. I fiddled around with the values for $100 and $101 to improve matters. The current provisional value is 107.2 steps / mm for both X and Y.
Next I made a stepper motor – enabled “drawing head” to test my abilities to control the Z-axis (see picture below). The motor, which is fitted with a lead screw to provide linear motion, lifts a pencil lead up and down. The motor pivots so that the pressure on the lead on the paper is governed by the weight of the motor. (Later, I added a weak spring to increase this pressure.) The motor sends the pencil lead down till it hits the paper. Once that happens, it swings on the pivot on the pivot until a microswitch is triggered which sets the home position. That’s the theory, anyway!
First, I had to recompile Grbl with the Z axis homing included in config.h. Then I adjusted the Z axis maximum rate to 50mm / min ($112) – although, later I found that 500mm / minute worked fine!.
I had bought the stepper motor years ago in connection with a project to control engine idle speed automatically and I had no idea of its spec. I figured that any motor is capable of half steps so I set the jumpers on the Pololu board to that. It sounds a bit rattly but works ok.
With that done I tested the Z setup by jogging and roughly calibrated the movement of the lead screw. ($102 = 25). I had a lot of trouble trying to get the Z axis to home and went down all sorts of rabbit holes until I discovered that as of grbl 0.9, the Z limit signal pin (D11 on the Arduino) has been swapped with spin-enable (D12) so that’s where the switch should be plugged!
While trying to get the Z axis to work, I tried to get real-time status reports which might inform me about the limit switch positions (? in grbl). This involves setting $10 which is a 5-bit mask (I think!). A value of 1 signifies machine position: a 2, work position: 4, planner buffer (?): 8, RX buffer (?): 16, limit pins. It seems that bCNC depends on the machine position report in some way and if the 1 position is not set, it goes a bit haywire and claims bCNC is not connected though it is, as you can jog and, as far as I can remember, still home. So any number you set for $10 must be odd!
My aim at this stage was to home the pencil resting on the paper. How it gets lifted off during the execution of a GCODE file, I don’t know yet! At first I intended to use limit 3 to home the pencil. The idea was that the motor would start of with the pencil lifted off the paper so that switch 3 would be closed (the NC contacts, though, would be open). As the motor caused the pencil to hit the paper, the switch would open and the NC contacts would close. This did not work, however, I think, because there is not enough space for the limit switch pull off routine to work as it should. (By good fortune, however, I found later that I could put switch 3 to good use after all – see below.)
I reverted to limits 1 and 2 (connected in parallel). This worked once I had allowed enough maximum travel on the Z axis ($132 = 20). I connected the motor to move up on homing so the top microswitch registers that position with the pencil lead clear of the paper.
To get the pencil lead in contact with the paper, I need to use the Probe facility. This needs a switch or contact between the Arduino A5/SCL pin and ground (this will have been setup by Grbl as a digital input pin, I presume). Having connected switch 3 to do this, I started by jogging down in steps of 0.1mm. When the tip hits the paper, the swinging arm moves until a point is reached when limit three is released and the NC contact closes. This is registered on bCNC by the status readout Idle (P) on completion of the jog, signifying that the probe has been triggered.
The Gcode G38.2 probes towards the workpiece, stops on contact and signals an error on failure. So the command: G38.2 Z-1 F1 sends the pencil down to the paper. When I tested this, Z went from -19 (home – I assume 19 is related to the 20 maximum allowed movement I have set in Grbl for Z) to -6.84 which reflects the dimensions of the Z components of the machine, distance from the bed, thickness of the paper etc. A command such as: G1 Z-16 F1 moves the pencil to coordinate -16 which is clear of the paper. There is a place in Inkscape / Extensions / Path to Gcode which allows a safe distance to be entered.
(I wanted to build these commands into two of the user-configurable buttons on bCNC. I was able to do this but, so far, I have been unable to save them – the heading Buttons in the .bCNC file located in /home/pi, remains blank.)
This is the procedure for drawing a file/picture:
- Home the machine
- Set the work position to the machine position (-19.0 in this case)
- Put the pencil down to the probe contact position
- Jog +Z 3mm to clear the probe contact microswitch (allows the pencil to keep contact with the paper better)
- Zero the work position
- Run the file
The Gcode I have produced runs the paths twice. I need to understand how to stop this happening. (I could just edit out the second runs in the Gcode file but that would be cheating?)
The picture above shows another instance of the picture of the gear, this time made with the stepper motor-equipped drawing head. You can see the spring (actually two hooked together) which I fitted to increase the pressure of the pencil on the paper.
Cables under control
Cable trunking was now on the agenda. I didn’t know quite what size to pick, so I chose 18 x 37 which when I actually got it looked rather large. Still better too large than too small as long as the stepper motors can haul it along!
I tried the trunking in various positions, pivoting in the horizontal and the vertical planes. In the end it seemed there was no alternative to the position shown in the picture above.
In order to support the trunking, I tried attaching a roller support hung off the gantry plate which held up the trunking as the gantry plate moved along. However, a neater solution was to fit a plate the length of the gantry plate (see arrow on the picture above) supported off the gantry at either end so that the movement of the gantry plate was not impeded. The trunking connecting to the gantry similarly will be supported by a plate which will be attached to the machine’s frame.
Now I need to repeat the exercise on the right hand side of the frame, probably underneath the drive belt. This will mean raising up the machine with the next stage of the construction… Then I will have to redo a fair number of the cables as they are too short at present!
Raise up the frame!
The machine goes up in the world with four legs 300mm long (see picture above – the 20×20 extrusion looks a bit spindly but, hopefully, it will be all right). There will be a bottom frame under these legs, probably 1000 x 540mm. (Remember I’m designing this as I go along!)
(NB. The picture above doesn’t show the support plate for the trunking.)
Making it up as I go along!
Inside this skeleton box will sit the bed (aluminium honeycomb or, perhaps, ni-chrome, or similar, wire mesh) which will be raised and lowered by four stepper motors fitted with 8mm lead screws. I’m thinking it would be easier to use four motors rather than one with belt drive, bearings etc. etc. However I will need four Pololu drivers and a perhaps a CNC shield but driven by an Arduino running basic software (not Grbl). I envisage pressing a button, the bed descends to its home position, then rises till the work on the bed encounters a probe on the laser head, plus controls to manually raise and lower. The question remains as to whether I shall need guide rods with linear bearings etc. in addition to the lead screws (which will have some sort of top bearing). Obviously, I don’t want the bed to wobble when the laser is doing its work!
I envisage all this being inside a sealed box with the usual hinged lid for access all sitting on a table under which would be all the other gubbins needed (extractor, air pump, chiller, power supplies etc.)
Back to bed
Back to raising and lowering the bed, I thought long and hard about how to design in an accurate vertical motion. One of the problems, it seems to me, is ensuring that the bed can move smoothly up and down without significant slackness from side to side requiring linear bearings of some sort with very little play. This requires quite accurate construction of the framing etc. to which these bearings are attached. Although the position of bearings etc. can be made adjustable, the squareness of a frame can be tricky to achieve and needs a lot of fiddling with try-squares etc.
Doesn’t fall flat – unfortunately
More difficult, I think, is making sure a large rectangular frame, say, is flat. You can build your structure on a piece of block-board or thick MDF which will be pretty flat but will flex a little if the table or trestles on which the surface is not flat and so on. I have a self-levelling optical level which I am going to use eventually when I am doing the final alignment. This should be able to measure “flatness” to a fraction of a mm. Hopefully it will be enough! Or, perhaps, the vertical dimension of a laser cutter is not that critical (relatively) compared to, say, a milling machine or 3D printer. Time will tell (again, you have to remember, I am making this up as I go along!)
I get a bit square
Anyway, I contented myself at this point, by getting the frame as square as possible. First, it is a good start to have all the frame members the right length. This is where having the supplier cut the pieces with their expensive special saws pays dividends! Getting the frame square involves loosening joints and sliding them here and there and checking measurements with a tape, vernier gauge etc. as appropriate.
I toyed with the idea of raising the bed on three screws as opposed to four. Three would be (obviously) cheaper and less likely to jam if things got out of hand (a three-legged stool never wobbles etc.) In the end, I went down the conventional route (four) which better supports the bed.
I looked at stepper motors directly connected to Acme lead screws and nuts and the prices from Banggood seemed attractive. However the chances of receiving them without any bends caused by poor transit arrangements militated against this choice. In the end I opted for four cheap stepper motors from Ebay (they don’t have to be very powerful, fast, high resolution etc. I hope). I am coupling this up with lead screws made from M8 brass studding (easy to cut and machine and needs a minimum of lubrication).
Motor mounting plates
The first thing to do is make the mounting plates for the four stepper motors. It’s quite important here to drill the holes for the motor in the right place for the motor to fit and also correct relative to the edges of the plate. I 3D-printed another pattern/template which I used to drill 2.5mm pilot holes in the first plate. I used this plate as a pattern for the other three plates. I then enlarged the holes as required. For the 22 mm stepper motor location hole I used my stepper drill (from Aldi!). This produces a round hole in thin material (thin relative to the diameter of the hole), whereas a conventional twist drill may leave a hexagonal hole (in thin material).
I located the plate by drilling the first “step”, then clamped the plate on the drill press (as shown in the picture above) before running through the “steps” up to 22 mm. Lubrication with something like WD40 is necessary with all drilling in aluminium alloy. Nevertheless, there is always an annoying burr which I normally cut off with a wood working chisel.
Clamping when drilling a large hole is essential to ensure the hole is reasonably close to where you want it. Also clamping is a great for safety. If you are holding the work with your hand and the drill bitcatches the work will flail around with potentially serious consequences for your hand! Even a small piece of work can fail to break through cleanly and run up the drill bit at the very least messing up the hole, particularly in something soft like aluminium. On the other hand if you have many small holes to drill life is too short (perhaps) to clamp every one…
A little disappointment
Disappointingly, I had to enlarge the four 3 mm holes to get the stepper motors to fit. I suppose the 22 mm hole wandered up to 0.5 mm as I drilled it. This could be due to play in the drill press shaft. Probably a better way would have been to drill the 22 mm hole first, then use a 3D-printed pattern/jig with a flange which located into the hole and subsequently drill the four 3 mm holes using this pattern.
Progress on the bed
My next task was to fit the Delrin guide wheels on the rear member of the bed (see sketch above). I know that the centres for each pair of wheels need to be 40 mm apart (for a 20 mm extrusion). Not only do I need to be able to drill these holes accurately, I also need to space the pairs of wheels to match the dimensions of the frame.
First I rechecked the separation of the rear uprights top and bottom and made further slight adjustments to get them as square as possible. Then I marked the positions of the uprights on the angle which will become the aforementioned rear member of the frame. I then set out the positions of the holes for the guide wheels.
I expected that inaccuracies would creep in and that I would have to elongate some of the holes (or use the eccentric mounting bushes which I used on the gantry plates etc. In the event, I got lucky and the holes I drilled positioned the wheels accurately enough to allow the bed member to move up and down with pretty much zero detectable play.
Next were two 12 x 12 mm bars with M8 female threads at the separation of the stepper motors. To get as good a positioning for the holes as possible, I made a gauge consisting of three pieces of 12 x 3 mm bar, two with 5 mm holes to fit over the motor spindles and one to link them together. While fitted to the motor spindles, I clamped the third piece in place and then drilled holes to bolt the pieces together. Then I clamped the gauge onto the 12 x 12 bar and drilled 5 mm pilot holes which I enlarged to 6.5 mm ready for tapping out to M8 thread.
Above, left: The three pieces of 12 mm wide alloy fitted over the motor spindles and clamped together. Above, right: The parts of the gauge bolted together and clamped on the 12 x 12 bar ready for drilling.
Turn, turn, turn
The next task was to turn down one end of the four pieces of M8 brass studding (threaded rod) to 6 mm to fit a flexible coupling that I will be using to connect it to the stepper motor (picture below).
Temporary bed setup
The picture above shows the four stepper motors and the lead screws temporarily in place screwed into the 12 x 12 mm support bar (2). Aluminium angle (2) rests in place temporarily. It will be bolted to the front and rear members to complete the frame which will support the aluminium honeycomb bed.
The pictures above show details of the lead screws. On the right, I have fitted a nyloc nut to the top of the lead screw to make it easier to manually adjust the corners of the the bed when getting it level, with the outer case in place.
Driving the motors
Next, I bread boarded the circuit to drive the stepper motors using the usual Pololu drivers. I originally used an Uno to produce the step pulses, the enable, direction inputs to the driver and coordinate inputs from the various controls and limit switches. However, as far as I can see, all I need is a pulse generator and some logic gates / inverters so I have gone with the circuit shown below.
How the circuit works
The switch, bottom left, marked “up / down” is a centre off change over switch. When the switch is off, the inputs to the top 7400 NAND gate are high (courtesy of the two 1k resistors). The second NAND has its inputs connected together to give an inverter, so the output to the Enable on the driver is high and the motor is disconnected. At the same time the low output of the first NAND is linked to the 555 timer (which is wired to produce equal mark/space pulses) reset pin, thus preventing pulses from being generated.
When the switch is operated, the inputs to the NAND are unequal and the output to the driver’s enable pin is driven low, the 555 reset pin goes high producing pulses and the motor runs. One of the poles of the switch is linked to the direction pin on the driver (via the NANDs wired as buffers) so the motor direction changes according to the switch position. Limit switches prevent the bed being moved into the wrong position etc.
The speed of the motor can be set by adjusting the variable resistor on the 555 circuit. The link to the reset pin on the 555 also connects to a ZTX450 transistor which will be connected to the previously described relay board to trip the supplies to the gantry, laser etc. when the bed is being raised or lowered.
The picture above shows the final circuit breadboard. It’s the usual mess!
PCB design – not my best work!
The layout for the bed raising motors is shown above. It is not amongst my best work! It contains masses of wired links. Maybe I should try auto routing? (I made one or two alterations in the final version, cutting the link to half stepping and allowing other modes to be set. I also incorporated the fixed resistor – 33k in series with the variable resistor – on the pcb.)
Above, top left: The pcb before drilling. Above, top right: Testing the square wave generating section. I monitored the waveform on my BitScope oscilloscope running on a Raspberry Pi (above, bottom right). Above, bottom left: The pcb with the Pololu circuit boards plugged in.
Completion of the trunking
Above, you can see the trunking from the gantry to the fixed electronics etc. on the frame. The plate on which the trunking runs can also be seen.
Now I need some plastic conduit to tidy up and protect the rest of all those wires. (Or perhaps it should be metal conduit, grounded to shield all those wires. This brings me to the frame itself. It should probably be grounded but the extrusions are anodised which is an insulating layer. So, perhaps, wires should be attached to the various parts with the anodising scraped off where this contact is made and taken to ground at one point. I’ll leave this till later!)
I read that copper mirrors are good for infra red beams and that they can be made in a home workshop, so, here goes!
I purchased a 25mm diameter bar of copper and sliced off three 11mm sections on my band saw. I rotated the bar (against the motion of the saw – don’t let the saw drag the bar round – this makes a big mess) to try and get as accurate a cut as possible. During this process, I managed to jam the blade on numerous occasions which results in the blade coming off the wheels followed by fiddling to open the case to replace it accompanied by some cursing!
Then I put the pieces in the three-jaw chuck on my mini lathe and cleaned up the cut leaving the pieces about 10mm thick.
I made a 3D printed clamp with six index holes (at 60 degree intervals) to enable me to drill three holes (separated by 120 degrees) which would then be threaded to take the screws which spring load the mirror onto its bracket.
Having drilled the holes, I tapped them out to M3 with the mirror blank in a drill vice and the taps (starter, number two and bottom) in a drill stand chuck (with the drive disconnected). The helps ensure the holes remain at right angles to the future mirror surface.
I cut another (thinner slice) of the copper bar, fitted it in the clamp and drilled six holes to use as a guide to drilling the holes in the mirror bracket.