The MPCNC is now ready to be used in anger.
It took longer then I’d have liked but it’s all ready for serious cutting, albeit in wood:
Making the spoil-board up was a bit of a mission, mostly because I’m completely new to this kind of thing. I started with a 600mm by 1220mm by 18mm thick piece of MDF. The plan at the outset was to cut this down to about 400mm square and place it on the “bed”, which is another bit of MDF and is the workbench top.
I’m not really well versed in power tools, or woodwork generally. I’ve used power-drills many times but have very little experience elsewhere. I decided to buy a jigsaw to cut down the MDF. In retrospect a circular saw would probably have been a better choice for the straight cuts needed, but I figured a jigsaw would be more useful later. After a couple of practise cuts I successfully cut the spoil-board, one slightly wavy cut notwithstanding. After experimenting with clamping a fence to the workpiece I found the best approach was to follow a scribed line with the laser at the front of the jigsaw.
(If this experience with the MPCNC goes well I will have to give serious thought to buying more tools: a small circular saw, a random orbital sander, a decent collection of clamps and some hand tools are a must. I also need a dedicated bench.)
I want the spoil-board to be replaceable so it is attached with M8 threaded inserts. These inserts have a flange at the top so the hole for the inserts needed to be tapered. The spil-board was temporarily clamped to the workbench board and the four corner holes were drilled: through the spoil-board and then through the bench top. Next the holes in the bench top were widened slightly to accommodate the threaded insert. I was relieved that everything lined up when it came time to screw the board down with M8 button screws. I did have one problem where I over-tightened the screw and the insert worked itself out. I fixed this by re-screwing the insert with some superglue, something I should have probably done with all of them. An even better idea would have been to attach the inserts from the bottom, which would have made it impossible for the insert to work it’s way loose, but you live and learn.
Next it was time to level the spoil-board. This required creating a simple model in Fusion 360 consisting of a 1mm deep square hole, approximately 320mm by 320mm, and then creating the gcode from the pocketing option. My setup, with its small Dremel used as a spindle, is not really cut out for big cuts and it took about 20 minutes for each pass. I used a small flat ended burr, which again is not ideal for this kind of work, but the results were pretty good. It took two passes to get a deep enough level across the whole spoil-board and the second time the bit did not start off in quite the same place (there is no auto homing on my MPCNC) but the result is fine: a nice flat and parallel to the travel of the cutter, spoil-board.
The next job was to make holes for the threaded rods the hold down clamps. I chose M6 for the size, again using threaded inserts, this time into the spoil-board. Because the inserts do not meet the surface of the board – if this was the case then the cutting bit might hit one – the inserts have no flange and sit just above the bottom of the board, with about 5 mm clear at the top. The great thing about drilling the holes for the spoil board is I could use the MPCNC to do the drilling! The holes were only pilot drilled using it though; I had to remove the board and drill the holes out to the correct size and depth using a handheld electric drill. Again, when I do this next time I will attach the inserts from the bottom. And I’ll use flanged inserts to stop them coming back out via the top.
The hold down clamps and handle were both found on thingiverse. I tried out several alternatives but eventually found some satisfactory designs. Actually, the hold down clamps are excellent: sturdy and just the right size, at least after widening them to accommodate the M6 threaded rod.
The last thing to sort out was power. I chose a simple solution: screwing a power strip to the table and attaching the wires. It works well and gives me spare sockets eg. for a dust vacuum machine. I can also quickly turn off the power if there’s a problem.
I have done a few test engravings with reasonable results such as this one:
The “fuzziness” is mostly down to the extremely soft wood that was cut into, I believe.
I’ve also done some test cuts through to the bottom of the workpiece – all just MDF – to measure the accuracy of the machine:
Obviously this is, in the CAD, a 50mm by 50mm square. I’m happy with the accuracy achieved, though I suspect I can improve it further by re-tensioning the belts.
I have a fairly tame project in mind for my MPCNC: a new house number sign. For that I need to source a nice piece of hardwood, probably oak. I’ll then find out if the Dremel is up to the job. I suspect it won’t be and I will need to find a new spindle.
All told, I’m pretty happy with the MPCNC and I suspect it will prove very useful. It’s also fantastic from a tinkering point of view. I’m already wondering if there are alternatives to Marlin, for example. Not that Marlin is bad, but it is squarely tailored for 3D printers.
On the 68000 front, I’ve finished construction of the MINI000 board:
I am pleased that the MAX232 and dual RJ45 were both wired correctly. Both ports work perfectly.
I’ve also implemented, in the CPLD logic, the functionality needed for the buzzer. As per the previous 6809 boards, a write-only addressable register holds a pitch frequency (actually the interval), with a value 0 meaning silence. MINI000 now beeps at startup.
I have only just started on writing a monitor. Two routines have been completed: converting ASCII sequences of hexadecimal to and from their integer value. This screenshot shows a test exercising the two routines:
The ASCII buffer is turned into an integer inside the d0 register then converted back to ASCII. The routine counts up the number, from 1 to 8, of converted digits and uses this to indicate an error, in which case the number of digits is 0. The digit count (or error state) goes in the d1 register. Error checking in the 6809 code I previously wrote was basically non-existent so this is a nice improvement. These routines will form the core of the monitor: parsing digits input, and outputting them are the critical parts of what a machine-code monitor does.
Structurally the monitor will be very similar to the 6809 one I wrote previously since I was pretty much happy with the design. Especially the parser was quite effective. But I have in mind some small improvements to make extending it easier: commands will not need to validate their inputs, since the definition of a command will be extended to describe the inputs needed. For example the definition of the “dump” command will include:
- The command name (actually a pointer to the null-terminated string “dump”)
- The routine to run for that command (the routine address)
- A pointer to a list of input types needed by the command. In the case of dump this will be two longwords (the start address and the number of bytes to dump out)
In the MAXI09 monitor, the dump command routine itself validated the inputs. With many, many commands this was a lot of repetitious code.
There are other small improvements possible, like using a dot to represent the last address accessed by a command. Thus to dump out 10 (hex) bytes in blocks one would enter:
dump 1000 10 dump . 10 etc
In other 68000 news, I have decided that I will start on the design for a VGA display using a EPF10K10 (PDF), the same FPGA, in the same PLCC84 package, used in my MAXI09 board. I haven’t got very far, but I have started thinking about the number of pins that I’ll have available and what they will need to be used for. So far I’ve come up with the following list:
- 1 – MPU reset
- 8 – MPU data bus
- 4 – MPU address bus
- 2 – MPU Read and Write
- 1 – MPU Chip Select
- 8 – VRAM data bus
- 18 – VRAM address bus
- 2 – VRAM Read and Write
- 1 – Pixel clock
- 1 – Horizontal Sync output
- 1 – Vertical Sync output
- 12 – 4 bits of RGB output
This makes 59 pins, which gives me none at all spare of the 59 I/O pins available on a EPF10K10 in PLCC84.
The basic arrangement will be similar to the V9958 that I used in the MAXI09 board. The main system memory will not house the display memory, but rather it would be held on memory attached directly to the video controller. Thus accesses through to this memory would be via the controller. 18 bits of address gives 256 KBytes of video memory, which is sufficient for 640×480 at 4 bits per pixel, which will give a 16 colour display, the colours themselves will probably be resolved through a CLUT of 4096 colours (16 levels of each of red, green and blue). Alternatively the colour to display could be derived directly from the 4 bits of pixel data, yielding 8 colours, with regular and half brightness colours, the same as the ZX Spectrum. Yet another option exists: text mode, with each character square taking a byte of video memory, with 8 by 8 characters. Font data could be held in the 3 lots of 256 bytes of RAM bits in the FPGA, each 256 byte block holding 32 characters worth of font data. 32 times 3 is 96, which happens to the number of printable characters in the ASCII character set (plus one spare at 7F).
This is all very, very ambitious and far out of my comfort zone. But without a difficult project, it’s unlikely to be a fun project, and fun is by far the most important thing.
First things first though, I need to understand the intricacies of VGA signalling and actually generate a video signal, without memory or even the 68000 attached. Luckily I still have my old EPF10K10 setup on breadboard; it should be pretty easy to get it going again, attach some resistor DACs, and a 15pin DSUB SVGA connector, and see if I can get a picture on a monitor….