Proxxon MF70 Miller CNC CONVERSION

The Y axis

he first thing to do is to dismantle the X/Y, first off you need to remove the nut from the far end of the lead screw. You have to watch out for the fact that the lead screw is a left hand thread and while easy to unbolt the nut at the end opposite the handle it is all too easy to tighten it and bend the screw. The screw thread should then be unscrewed from the block attaching it to the cross slide arrangement. Next slide the scale away from the handle and bag up the small roller baring that falls out. Now the hard part is to remove the handle from the end. It is fixed in with a cotter pin and it needs tapping out with a small pin punch. If you have the right size punch this is easy but without it you will struggle greatly as I did with the first two axis. The trick is to have a 2mm pin punch and the pin can be tapped out quite easily, However, I didn't have the right size at first and ended up drilling out the pin coupled by a lot of hammering with incorrect size pin punches. Eventually, in the later stages of the project, I turned a pin punch in a lathe I acquired and did the final axis quite easily. My design idea was to mount the motor on pillars, attache the pillars to a plate and bolt the plate to the front of the miller. I found four 25 mm plastic pillars in my junk box with built in stud and threaded hole, and along four 30 mm metal ones they made up the right length. The motor had short screws holding it together and I replaced those with longer ones so the thread protruded by a few mm. I screwed the plastic pillars into this and the metal ones on the end of that. I then made a plate out of Lexan with four holes for the pillars and a large central hole for the shaft. I also found a small brass collar with a threaded nut to act as a shaft stop. I reassembled it using small sealed ball race roller bearings, replacing the original thrust washers, from Bearingboys (MR126-2RS), they are 12mm OD, so they drop into the recesses the thrust washers occupied. The plate was fitted to the front of the miller by replacing the two self tapping screws with 4BA bolts. I know this is rather strange introducing this Imperial fastener into the mix but a M3 bolt was not big enough and an M4 was too big. I found that with 4BA I could simply run a tap down the channel and form a solid point to anchor the place on. In fact I did ruin the holes in attempting to use an M4 tap and had to turn the whole ting round and tap the other end. This caused some difficulty with the assembly as it is not actually symmetrical. Finally you need to couple the shaft of the motor to the lead screw. This is slightly tricky as one is 6mm and the other is 4.5mm diameter. So for this axis I used an Oldham coupler from Arc Euro Trade. You can get different hole size end pieces with a plastic centre piece. This allows the motor to transmit its power to the lead screw without being precisely in alignment and without transferring any misalignment stresses to the moor's bearings. A coupling of some sort is absolutely essential in this sort of work although some conversions I have seen have used solid couplers, I don't think they will last too long in use. Due to the length of the pillars and the motor shaft I had to saw a few m off the end of the lead screw. One last point, the front of the cross slid protrudes a bit so in order for the plate to fit flush I had to take a 2 mm step out of the plate. I did this with the milling machine itself operating it by hand and learned that if you take too much of the material off at one cut the plastic just melts and you don't get a good finish.

The MF70 with added stepping motors


CNC Mill conversion

Using an Arduino to make a CNC miller

The X axis

Armed with my experiences of the first axis I felt there was nothing for it but to acquire a lathe to make some shaft reduction couplers for the other two axis. Also the X axis lent itself to a different design approach. Due to the clearance I couldn't use a plate attached to the end of the compound slider so I had to use a U-shaped bracket to attach the motor. I got some 63 mm by 25 mm aluminium channel and bolted it to the compound slide using the same technique of replacing the self tapping screws with 4BA bolts. At the other end I made another Lexan plate to fasten the motor to, and fixed that to the bracket. The lower screws are difficult, if not impossible, to reach with a screwdriver so I machined the heads to be 4mm square so I could tighten them up with a spanner. I could have done that with a file but I used the original milling machine to make sure they were precise and exactly square. The shaft coupler for this axis is the spiral cut type, I got them from  I think this design is better than the Oldham couplings I used on the Y axis, However, these only come with a 6mm hole so I had to turn a small brass adaptor to couple this to the motor. Similarly a longer coupler was needed on the other end to match the lead screw to the coupler. In both cases M3 screws were used to clamp the shaft to the coupler.

The Z axis

For me this was the point of no return as it was when I finally made a change to the miller, so far I had just been modifying an extra X / Y compound table, so now was the time to open up the top of the miller. The Z axis is different from the other two in that there is only one point of fixing the lead screw, the other end is said to be floating.I started off by making two Lexan plates the exact size of the top and used long through hole screws to attach it firmly. Then where the lead screw comes through I had two different size holes, in the top plate the hole was big enough to let the bearing sit in the hole and on the bottom hole it was just big enough to let the lead screw through. Next I made three shaft couplers, one for the motor, rather the same as the Y axis, one for coupling the lead screw to the spiral drive coupler and finally a bush to stop the lead screw just pulling through the bearings. I was getting quite a dab hand with the lathe by now dissipate not having used one since I was at school.The whole assembly is supported on another U-channel bracket. However, unlike the other axis there is no plate on this one. Instead the motor is rotated through 45 degrees so that it is fixed by diagonally opposite screw holes. Two extra holes were drilled in the far side of the bracket to enable a screwdriver to be inserted to allow the tightening of the bracket to the Lexan plates. Note that these two holes are the same holes as are in the front of the Z axis pillar support.

All three axis needed several cycles assembly, disassembly, adjustment and reassembly. Or as we say in my part of the world "fettling". However, I got there in the end and the results were a bit better then I expected especially with regard to backlash and lack of binding throughout each revolution and towards the ends of travel.

So with the mechanics sorted it was time to turn my attention to the electronic control. In fact I didn't just complete the mechanics first as I had a motor drive circuit attached to my Arduino so I could test the alignment and smoothness of running as I worked on the mechanics.


So first off I got three motors, these were FL39T34-0654A from Motion Control and are bi-polar stepping motors with a 0.65A current rating and 7 ohm resistance per winding. The quoted torque is 1800 g-cm and is not underpowered for this application. Mind you I wasn't after the ultimate high speed machine, just a steady rate. I wanted to use them at 12 volts so they would be over voltaged and I would need a chopping regulated motor driver. The thread on the lead screws have a pitch of 1mm per turn and having a motor produce 200 steps per revolution gave me 0.005 mm per motor step. Any more resolution would be wasted but if finer control was needed then there is always the route of micro stepping the motor.


The basis of the controller was the RepRap controller based on the Arduino. However, this controller has moved on in a different direction and so my design is derived from an earlier version than the current one. Basically I wanted the communications to be RS232 rather than direct USB as this has two major advantages. It makes making a stand alone controller easer as I only have to incorporate RS232 inputs thus avoiding a pre made module or a very fiddley surface mount soldering job. Second RS232 is more robust in the face of noise and can travel longer distances than USB. So I have a USB to RS232 cable on the computer and it travels the rest of the way to the controller as RS232. I used a MAX202 driver chip to convert between the RS232 and the TTL levels the Arduino requires.

The software sketch I started from was for an Arduino clone the Sanguino and I adapted it for the Atmega 328 processor. That processor doesn't have enough input / output connections so the first thing I did was to attach some MCP23S17 port expanders. These interface with an SPI connection and so are much faster than the I2C expanders I have used in other projects. These expanders are addressable on a single buss so there is not difficulty in using two, this gave me more than sufficient I/O for the project and if you are cutting back you could get away with just one. I also wanted a display and managed to get a 40 character 2 line back lit LCD. Unlike the more usual LCDs this one has bright lettering on a dark background rather than the other way round. They are available in a number of colours but I thought orange gave the best retro neon type of look. Now LCDs are notoriously slow when it comes to display updates. This is mainly because of all the delays you have to put in to make sure the display is ready to receive the next byte of data. This is not helped by the fact that the standard Arduino LCD library does not use the facility to read back the status byte and just relies on the data sheet’s timing. So I modified the library to read the status byte and I also used direct port addressing and I managed to half the time it took to display a “Hello world” message. This has the disadvantage of needing an extra pin and also in fixing the pins you must use for the connection to the display.

Basically the wiring diagram of the system is shown here, and for a more zoomed in view you can download it here CNC controller wiring.jpg. The limit switches, motor drive pulses and remote handset are all run off the port expanders and leave 8 bits free for other stuff. If you don’t want the handset (and I have yet to implement it in the software) then you can eliminate one of the port expanders.

I decided to use pre built motor driver modules after attempting to prototype a surface mount chip on perforation board, it looked neat enough but was not stable enough for the chopping regulator. What a chopping regulator does is to allow you to use a higher voltage on your motors without burning them up. This in turn allows the current to get into the coil faster and so gives more torque at faster stepping speeds. The up shot is that the motors can run faster without stalling or dropping pulses. With the PC power supply I used, I was only able to over voltage the motors to 12V which is better than nothing but higher would have been better.

I built the whole thing on strip board but you could just as easily incorporate an actual arduino into the circuit in place of the processor and crystal. I also used the vero wiring system to make the wiring simple to do and neat to look at.

Note the small values of pull up resistors on the limit switches and the handset, there is a weak internal pull up on the port expanders but this extra pull up of 2K2 adds a bit more noise immunity to the circuit. I used two thick film resistor packs to minimise the space it takes up, these are the thin red lines you see either side of one of the port expanders in the photographs. Each of the port expanders has what they call an interrupt output, this output changes when ever there is a change of state on any of the inputs. This is so you don’t have to do a read of the whole device just to see if anything has changed. In this design I only use one set of these interrupt pins these are from the port expander I use for inputs. These don’t actually generate an interrupt but are used as a quick check.

The whole thing was built around a PC power supply I acquired, I used the 5V for the electronics and the 12V for the motors. The power supply actually provides many times more power than I needed but part of a good project, I believe, is building with what you have. So the box was bought to fit the supply and the controller was built on some strip board at its side. One thing I wanted to do was to make sure that the circuit board was not wired into the box, that is all the connections to the board would go through sockets and headers. That way I could remove the board completely for while I was developing it. For the motor control I use three Stepper Motor Driver A4983 boards from Cool Components and again mounted them on headers. . I used a row of DIP switches to allow me to easily set the stepping size on the motor drivers although I ended up using full steps. Finally the motor outputs were connected to the outside world with some 4 pin XLR connectors. These are designed for audio applications but they make good heavy duty connectors.

The firmware has the job of reading G-code command lines one at a time from the computer and moving the three stepping motors accordingly. When it is ready for the next command it sends an “ok” back to the computer which then sends the next G-code command. The display shows the absolute co-ordinates of all three axis on the top line in hex in the units of stepping pulses. I used this to test the system while I was developing the system but it is still a useful thing to display. The bottom line shows the last command received. To make things quicker I did not blank the whole display so there might be the odd few junk characters from a previous command seen at end of the current command. If you are not familiar with G-code then you can read about it here:- not all the commands are implemented by my controller, just the basic moves in a straight line and in circular arcs. Basically you have a start and end co-ordinate for each of the axis, knowing how many steps per millimetre for each axis you can work out which axis needs the greatest number of steps. That is the one you step every time. The other two then need a step every so often and that is expressed as a decimal number less than one. Then there is a loop where after the appropriate delay, based on the maximum permitted motor speed, the axis with furthest to go is pulsed. Then the fractional parts of the other two axis are accumulated and if they exceed one they are pulsed as well. In that way all three axis arrive at their destination at the same time. Before each step is made the limit switches are checked to make sure you haven’t gone further than the actual limits of the machine. I haven't actually fitted these on my conversion yet but once or twice I have sent the motor turning into the end stops so I really must get round to fitting them. Download the Arduino code here.

In order for the whole system to function you need an application to load in a Gcode file and feed it to the controller one line at a time. Here I was hoping to use ReplacatorG unfortunately it never worked properly and despite the authors interventions I couldn't get it to work reliably on even simple files. It has the intention of being a universal application but it is increasingly specialising towards 3D printing and people were more interested in getting impressive features implemented than in getting the fundamental application stable. So with not much else available for the Mac I decided to write my own, in Processing.

Fundamentally this has to do two things, feed the Gcode to the miller controller and allow the miller controller to be set to a known reference point. The first thing you must do is to edit the code so that it is looking for your named serial device, if you don’t do this it will default to the last device it sees in the list which is almost guaranteed to be wrong. Next attach the Arduino controller board any command sent by the software will wait for an acknowledgment string of “ok” to be returned from the miller, if you have not got a miller attached it will appear to freeze at this point as it waits forever for the string to be returned.

The printout at the bottom of the processing window shows you what serial port it is attached to as well as echoing the commands sent to the hardware.

Moving and aligning the miller is handled with a jog control type of display. First of all you need to set the step size with the radio buttons, and then you can use the arrow buttons to jog the miller in the direction you want. The coordinates of the current position are shown in yellow in the upper right corner. When you have got the tool’s X, Y and Z coordinates to the right point on your work then clicking on the “zero” box will set that point to be zero. In practice I found it was helpful if I split these into parts, X and Y zero and Z zero. This allowed me to get very fine control over the tool height, something you need when milling PCBs.

When you load in a Gcode file the program looks at it to see the maximum and minimum excursions on each axis and displays them, there is a “Go To” button for each corner of the file which lifts the tool clear and then moves it to the extreme point so you can see you are still within the bounds of the machine and material.

When you are all set up then you need to turn on the miller and hit the “Go Mill” button.  As added extras the software also puts in a speed command at the start of each milling run, as well as displaying the first comment in the Gcode file which should be a text description of what the file is going to do. Finally there is a big red STOP button, this is a panic button and stops the miller by the simple act of disconnecting the serial port and connecting it up again. This causes the electronics to reset and so to instantly stop all axis movement. Of course the router is still spinning as that is only controlled by a manual switch. You can download the processing sketch here A number of ancillary processing application allowed me to generate useful Gcode see this page.

Learning how to use a CNC miller well, is almost as time consuming as building one in the first place, and I am just starting to do that. Here is a video of it milling a PCB for an RFID coil.