The Machine Works (Mostly)
Dylan, my modified 3D printer is up and running, creating pyro-graphic recreations of supplied images. The images are processed through a grasshopper algorithm which maps the brightness values of the image to time values for the burner to remain on the wood. While there are still some minor issues to work out, I think this is a promising start.
gCode: Generating gCode without a Slicer
Most times that I use a 3d printer, I model a solid object in Rhino, export to an STL, than use a slicer such as Prusa Slicer to generate the gCode which controls the movement of the printer. So controlling the printer manually, or without a solid object was completely new to me. Luckily, our wonderful professor, Ryan Hoover has already created a plugin for Grasshopper which converts curves in Rhino to into gCode moves. This plugin is called Xylinus.
I created the necessary geometry by drawing a few curves in rhino, than arraying and weaving those lists together in grasshopper, to form a single, consecutive list of curves. After some more troubleshooting and tests to insure that list was properly ordered, I added in entry and exit moves, and input those curves into the Xylinus “Crv to GC” component. This gave me the gCode for the basic motion, but I still needed a way to control the intensity of the wood burning.
While this took some work to get right, the concept is simple. The gCode command “G4 S(n)” instructs the printer to “dwell” at its current location for “n” seconds. The (n) values were generated using a “range” with a reasonable domain for test grayscales, and the rest of the command was formatted with the “concatenate” component to combine text fragments. When I began actually using pictures the handoff was easy, I just swapped these values for remapped brightness values using the Grasshopper definitions from our “Encoding environment” workshop.
In these pictures you can see how the picture is divided into a grid and sampled for the lightness values, then how that translates to the machine.
Since Xylinus conveniently formats each curve as a tree branch the dwell commands were than inserted into the end of each list. From there I added beginning and end code, before saving out to a text file.
Pronterface: Controlling the Printer
Pronterface is the software I chose to control the printer. This application acts as the in between from the gCode generated in Grasshopper to the printer’s control board. The Pronterface software can be used to control just about any function on the printer from homing, zeroing individual axis, running gCode files, running manual inputs from the command line, and running code from customizable buttons for repeated tasks.
The custom buttons came in especially helpful for my updated zeroing strategy which requires a few specific commands.
Printing: Greyscales and First Images
To determine the time domain and test the function if the printer, it was necessary to print a few greyscales so calibrate my code. This exercise also allowed me to determine the size of the dot, and thus, how big the grid needs to be.
After these tests I moved onto printing pictures, specifically a portrait of Joseph Prusa. I chose this portrait to honor the printer’s origin and show my appreciation for the amazing work that the Prusa company has done for the digital fabrication community. After learning from that print I made a few changes, resized my curves and arrays for a lager image, than sent the longest print yet, an 80mm, five hour long self portrait.