Introduction: Ember Printer: How a Voxel Grows
When using your Ember 3D printer, have you ever wondered how a voxel grows during the printing process? Now that it's possible to control individual micromirrors in Ember's projector using pattern mode, you can examine that process in detail. This Instructable shows how to make a movie, like the one above, of a voxel's growth with increasing exposure to the near-UV light from its projector.
Step 1: Create the Slices
Since we can't see through the black PR-57 resin while a voxel is being exposed (nor is it easy to distinguish the cured parts of the resin from the uncured pool surrounding it, even with clear resin), we'll instead print a series of separate voxels with increasing amounts of exposure. Then after removing the surrounding uncured resin, we can photograph the results and combine them into a movie.
The total exposure (or energy dose) received by a voxel is given by the intensity (or power) of the light it receives, multiplied by the time that it's exposed to that light. To vary the exposure, we'll use a progression of gray values (intensities) with a constant exposure time. That way, we can generate all the frames of the movie in a single layer of a print, in which all the pixels are exposed for the same amount of time.
This movie is therefore based on the assumption that, for example, a 1 s exposure of a 50% gray pixel has about the same effect on the resin as a 0.5 s exposure of a 100% white pixel.
In order to register the individual frames of our movie, we'll need something like the sprocket holes used in movie film to align its frames. But instead of holes, we'll use voxels that receive the full exposure from a white pixel.
The attached Processing sketch (voxelGrowth.pde) generates the needed frames and sprockets as a series of pixels with the appropriate gray values in a single slice image (layer 86). White pixels spaced 5 pixels apart provide the sprockets, with gray pixels centered between them providing the subject of the movie. The magnified partial view above of slice 86 shows the first several gray pixels (with their values labeled here in red) between the white sprockets.
Each pixel in an Ember slice image can have one of 256 possible gray values (0 for black through 255 for white). However, Ember can only actually display 64 different gray levels. (That's in pattern mode -- in video mode it can only display 32 gray levels!) So the sketch generates all the displayable gray values, 0 through 252, in steps of 4.
Since we'll expose that slice for 6.3 s, the exposure (dose) received for each of the gray pixels is proportional to its gray level divided by 252, times 6.3 s. For example, the pixel with gray value 20 provides a dose equivalent to that provided by a white pixel exposed for only (20 / 252) * 6.3 s = 0.5 s. Each of the gray levels here, with a step of 4 between them, produces an exposure effectively (4 / 252) * 6.3 s = 0.1 s greater than the one that precedes it. Thus our series of 64 gray pixels shows how a voxel generated by a white pixel would grow over an exposure time ranging from 0 to 6.3 s, in increments of 0.1 s.
The Processing sketch also generates a chamfered base plate for those voxels, to make them easier to handle, and places them along a 3-pixel-wide wall at the edge of the base plate that's 5 layers high, to make them easy to see. It also includes guard rails on each side and a sacrificial wall in front of the voxels that rises another 14 layers above them, to help protect them during post processing. A 3D rendering of the image stack is shown above (in which the voxel progression is just barely visible).
Step 2: Print the Voxel Series
The attached print data file contains the slice images generated in the previous step, along with a printsettings file with the defaults for PR57-K and with "UsePatternMode" set. It also contains a layersettings.csv file that simply overrides the exposure for layer 86, setting it to 6.3 s instead of the usual 1.8 s. That higher value allows for some voxel growth even at low gray levels (and indeed, the ideal exposure is probably greater for an isolated voxel than it would be for a typical slice consisting of many adjacent voxels).
This can only be printed on an Ember set up to support pattern mode. In video mode, individual pixels in the slice image become a group of pixels in the projected image, and the size of the voxel they print varies with its location in the image. That variation will swamp the effects of the exposure variations that we're examining here. Only in pattern mode does each individual pixel in the slice image drive an individual micromirror in the projector, to create a voxel whose size depends only on the exposure it receives (intensity * exposure time).
Once the print is completed, remove it from the build plate and rinse it in clean IPA for about 5 minutes, being careful not to abrade the edge where the voxels are. To harden the voxels, post-cure the print in Nitrogen under UV lamps for about 5 minutes.
When you're ready to photograph the print under a microscope, break off the sacrificial wall that's separated from the voxels of interest by a small gap.
The photo above shows what the left half of the print looks like, with the row of alternating sprockets and subject voxels along its top.
Step 3: Photograph the Voxels
The voxel series should be photographed with a microscope at sufficient magnification to clearly show the growing voxels, but low enough to show several steps in each photo, with enough overlap between successive photos to identify where in the series each one starts and stops.
If needed, the photos can be straightened using Photoshop, GIMP, or other image processing software. Then use GraphClick to digitize the corners at the base of each sprocket, starting with the right hand side of the first sprocket, as shown above. Export those measured coordinates to a text file, with the same base name as the image file.
The images and coordinate files are then run through the attached Processing sketch (extractFrames.pde) by placing them in an "input" subfolder. It extracts the images of the growing voxel between the sprocket coordinates and saves each one in an "output" subfolder. I've also attached my input micrographs and associated coordinate files and the movie frames created from them by the sketch.
You'll probably need to adjust the Width, Height, and Offset variables to accommodate the resolution of your own micrographs. The Width should be narrow enough to exclude the sprockets, and both the Width and Height should be large enough to contain a fully exposed voxel plus some of the base layers they're growing from. The Offset defines how much of that base is shown. The frame dimensions I used are illustrated with a red rectangle in the photo above.
Also above are three representative frames at full size, with their gray values and effective exposure times as noted.
Step 4: Assemble the Frames Into a Movie
The separate image frames can now be combined into a movie, using your favorite movie editing software. I used Adobe Premiere Elements and specified the format as 640x480 at 60 frames per second, with each image shown for 6 frames (set with Elements' "Time Stretch..." dialog). That results in an effective frame rate of 10 fps, corresponding to the 0.1 s increment between the gray steps that we determined in step 1. Thus when you play the attached movie, it's like watching a voxel grow in real time over the course of 6.3 seconds of exposure to a white pixel.
Now it's time to get out the popcorn, sit back, and enjoy the show.
Some things to note:
- Nothing appears at all until a threshold is reached, at around 2 s. Below that exposure, any resin that may have cured was either not attached to the previous layer, or was not cured well enough to avoid being washed away in the IPA bath.
- The voxel grows both downward from the previous layer and outward in width. This dependence of the size of a voxel on the gray level to which it's exposed is what allows Ember to locate printed features with sub-voxel precision and to provide smooth antialiased surfaces.
- Though this print used black resin, the voxels are so small that they're almost transparent. For scale purposes, remember that the width of the fully grown voxel is only about 50 µm.
Step 5: Using Actual Exposure Time Steps
We assumed above that reducing the intensity (gray value) of a pixel has the same effect as reducing the exposure time for a full intensity (white) pixel, as long as the same dose of energy is delivered. However, Leah Brickson has found that lower intensities are less effective at curing the resin, even when the exposure time is increased enough to provide an equivalent dose.
In order to see that difference, we need to generate voxels with the same 64 dosage steps as before but using white pixels with actual exposure time differences. That can be done by placing each voxel on a different layer and using per-layer settings to provide a different exposure time for each of those layers. The attached Processing sketch (voxelGrowthTrueTimeSteps.pde) generates those layers in a sort of staircase, with a single isolated white pixel on each step. The layersettings.csv file included in the attached print data file ("voxel growth true time steps.zip") sets the exposure of each one from 0.1 s to 6.3 s, in 0.1 s steps. (There’s also a black pixel in the corresponding position on the first step, for the initial 0 s exposure.)
Part of the resulting print is shown above. That print was also photographed at higher magnification and those images were again straightened before extracting frames for the movie. For this approach, instead of surrounding each of the voxels of interest with full-dose “sprockets”, the corner of each step provides those registration points, after being digitized with GraphClick as shown in the screenshot above.
Then a new version of the Processing sketch extractFrames.pde was used to grab the movie frames from these micrographs, based on the coordinates of the adjacent corners. The attached “input micrographs and output frames for true time steps.zip” contains that sketch and its data.
Again Premiere Elements was used to generate the attached QuickTime movie “voxel growth true time.mov” from those frames. (Some debris fell on the print at the location for frame 5, so it was replaced with a duplicate of frame 2, since there was no voxel growth until frame 14 anyway.)
The other movie attached here (“grayscale vs. time steps.mov”) combines those frames (at bottom) with the frames from the previous approach (at top), so that you can compare the differences. Note that whereas the first voxel growth based on grayscale steps appears on top at the 2 s mark, when full intensity white pixels and true exposure time differences are used, the first growth appears at an actual exposure time of only 1.4 s at the bottom.