The idea of a CNC plotter has always been an interest of mine. The first plotter I actually encountered was in middle school, in my “communications” class, where one component of our education was actually drafting! (This was also my first experience with a CAD software.) Later, during my architectural education, I learned that the algorithms that drove that machine were similar to the same ones we were using on our laser cutter, foam cutter, and even 3D printers. Now, I’m very close to being able to understand how to program my own version of this with my own built components! This is very exciting for me. But I must first walk before running.
The most interesting idea about a CNC plotter that still doesn’t quite exist would be to create a freestanding object that sits on the sheet of paper, not some machine that you load the paper into. This is unique angle really excited me and made it impossible to think of any other projects.
I thought of numerous ways I might be able to achieve this but ultimately settled on a highly unconventional way of moving the printhead: force-feedback motors from old Xbox 360 controllers. I figured between inkjets, laser printers, and any CNC plotter on Instructables, we’ve got precision down pretty good. Maybe it would be more interesting to have a drawing machine that draws poorly or shakily and in weird patterns.
After messing around with a prototype I built out of leftover pieces from my fabrication project, I found that the motors induced movement in what seemed like a fairly predictable way. If I could learn how to channel this, I could potentially make something that plotted graphics on a sheet of paper.
Using this as a foundation I set about designing a printhead that would have three force-feedback motors mounted on it and one servo motor. The force-feedback motors would push the head left or right and down. The servo would control a wheel attached to a scotch yoke that would raise and lower the pen.
Overall the pieces came together fairly well. I dealt with a few snafus that were the result of irregular acrylic dimensions but managed to recut the broken pieces and move into the software component of the project. While I intend to make a wireless version of this, this version had solid-core wires coming out of the top via an “antenna.”
The initial idea for the interface was to have the webcam take a picture, translate it into a grid of dots of varying thicknesses based on the brightness of the pixels in the image, and send that to the print head using a serial handshake. The pseudocode is as follows:
- p5 checks brightness at each pixel
- p5 assigns a value to each pixel based on brightness between 0 and 255
- p5 sends that value to the printhead
- Printhead receives the value
- Printhead lowers the pen a given depth based on the value received and then raises the pen
- Printhead moves a given increment over
- Printhead sends p5 a “ready” message
I managed to get this to begin working using a series of LEDs. This showed that my algorithm worked! Each LED stands for a different motor with the white one standing for the servo.
I then started testing it with the actual printhead. During this phase, I used an image of randomly generated circles arrayed in a grid to work this out with the intention to eventually move to a webcam interface or image upload.
The above video uses solid-core wires which are very stiff. I switched to stranded wires and the results were better, but still not what I’m looking for.
Hmmm… Not the result I was hoping for.The printhead didn’t behave exactly as I was hoping. The motors moved the printhead slightly, but I was concerned that the printhead was being constrained by the solid-core wires that were inflexible. I replaced them with stranded wires and found that while dramatically improving the ease of movement, it still produced less than ideal movements. There are a number of different directions I can look towards in order to refine the accuracy of this device:
- Look at providing counterbalancing weights
- Refine the feet to provide more frictionless movement
- Explore the timing of the firing of the motors; fire multiple motors simultaneously
- Locate the motors in different orientations or in different places on the printhead
- Abandon force-feedback motors and switch to stepper/servo motors altogether
While the last direction probably will produce the strongest results, I’m considering putting a bit more time into fixing this guy to work better.