Lithography Stepper V2 Build

Hardware Specs

Hardware Description

Our design was based on Sam Zeloof and Huygens Optics’ versions of this tool, which is essentially a projector connected to a microscope. We use a 10x objective for demagnification and a mechanical XYZ stage for positioning.

Stepper version 2 has greatly improved mechanical performance over V1 while using the same DLP chip from Texas Instruments. Several factors led to this improvement:

  1. Instead of an off the shelf projector with a flimsy plastic housing, we switched to the TI DLPDLCR471TPEVM evaluation board. This allows for a more robust physical connection to the projector housing, thus eliminating vibrations. It also has much better documentation.

  2. By swapping to a finite conjugate microscope objective, the optical path length is reduced from ~250 to 160 mm. This reduces the moment of inertia of the optics subassembly, therefore also reducing vibration.

  3. Swapping to LEDs instead of the broad spectrum mercury lamp removes the need to constantly swap filters, which introduced random perturbations from touching the optics. We replaced the stock blue LED with a 410 nm LED mounted on a custom PCB. The PCB design files can be found here.

  4. Mounting the projector horizontally means less structure is needed.

Tools Required

  • M3 and M4 taps

  • 3D printer

  • Pick-and-place machine

  • Reflow oven

  • Solder paste (preferably a syringe)

  • Calipers

Bill of Materials

Total Cost: $3,062.28 (doesnt' include computer and peripherals)

*Upload this CSV file to Thorlabs for all the optomechanical parts + beamsplitter.

Design File Summary

Note: the OnShape folder is organized poorly because it was our first time using it. Won't happen again, we promise!

Build Instructions

Provide detailed, step-by-step construction instructions for the submitted hardware:

  • Include all necessary information for reproducing it.

  • Explain and (when possible) characterize design decisions. Include any design alternatives you created.

  • Use visual instructions such as schematics, images and videos.

  • Clearly reference design files and component parts described in the Design file summary and the Bill of materials summary

  • Highlight any potential safety concerns.

  • Tips and tricks to simplify the assembly process

  • Possible errors that might occur during assembly and how to rectify them

Get the Metal Parts Made

There are several options for fabricating these two parts: the Base Plate and Adapter Plate. If you have access to a water jet, you may cut these parts from 1/4" aluminum plate, available on McMaster. Otherwise you can order the parts from SendCutSend, Xometry or another online CNC shop.

Option 1: Water Jet

The Base Plate is 15" long, so double check that your water jet is large enough.

When downloading the Adapter Plate DXF for water jetting, go to Config > Water jet to get the hole sizes right for tapping. The 2.2mm holes are clearance for M2, and the 2.5mm holes are M3 tapped and countersunk.

Option 2: CNC Shop

Click here for a SendCutSend shopping cart with the parts already uploaded and configured. This has not been tested yet.

Option 3: Manual Machining

Base Plate: Click here for a drawing to have open while drilling all the holes. Start with a center drill then use an appropriately sized drill bit for M4 and M6 holes. You may also switch to 8-32 and 1/4-20 if you already have the taps for those, and no other parts will change if you do so.

Adapter plate: This should be manually machineable but we haven't tried.

Solder the UV LED PCB

The PCB Gerber files for our UV LED can be found here. We provide a screenshot of the layout in Altium and a 3D render of the PCB below.

You can order it through your PCB manufacturer of choice (we used JLCPCB). However, note that the PCB is copper core. This is because the LEDs draw several amps of current in operation. To ensure that the PCB doesn't melt, you should use copper core to facilitate better heat flow.

We used 410 nm UV LEDs on this PCB. We found that two LEDs in series is sufficient to produce enough UV light for patterning. We also found connectors that are compatible with the cable in the TI DLP dev kit. (To do: insert links to parts for purchase.)

When assembling the UV LED PCB, it is easiest to use a solder syringe to carefully deposit the paste onto the LED pads and connector pads. If you try to use a stencil mask, it is very easy to smear the paste, so this is not recommended.

Once the paste is applied, you can use a pick and place machine to align the components with their pads. Keep in mind that you need to use a nozzle that is small enough to pick up the LEDs (to do: insert nozzle size). Finally, you can put the PCB into a reflow oven to solder the components to the board. (to do: insert oven parameters).

(Video showing PCB assembly in TechSpark yellow lab.)

Below is a completed version of the PCB - note the polarity:

Disassemble the TI DLP dev kit

Taking pictures after every step is key to ensuring you can put it back together properly.

  1. Test the projector before we completely take it apart :)

  1. Unplug all the connectors and remove the top PCB by unscrewing the standoffs.

  1. Remove the side PCB.

  1. Unscrew and remove the shroud by sliding it away from the rest of the optics.

  1. Unscrew and remove the heatsink for the front-most LED, which should be the blue one.

  1. Disconnect the LED PCB from the cable. Heat it slightly on a hot plate or with a hot air gun to soften the adhesive and remove the black plastic housing.

  2. Glue the black plastic piece to the DIY UV LED PCB, connect it to the blue cable, and reattach it to the optics housing. Put the heatsink back as well.

  1. Unscrew the projection lens. That one makes things bigger, but we're trying to make things smaller. It's got to go.

  1. Screw on the adapter plate with four countersunk M2 screws.

  1. Reassemble the rest of the projector, including the shroud and the PCBs.

Assemble the Optics

See CAD for interactive assembly help (select option 3)

  1. Start with the beamsplitter cube. Unscrew the set screws, remove the holder, and clip in the beamsplitter. The text ("Thorlabs") should be facing the microscope objective and camera when the holder is reinserted. Keep track of this during assembly and fix it later if necessary.

  1. Assemble the DLP tube. From left to right, the parts in the first picture are 0.3" lens tube (SM1L03), 0.5" lens tube coupler (SM1CPL05), 0.5" adjustable lens tube (SM1V05), and 0.5" lens tube (SM1L05). You may want to remove any internal lens rings. The adjustable lens tube allows axial length adjustment and the coupler allows rotation about the optical axis.

  1. Screw the DLP tube into the beamsplitter cube. The correct orientation is shown above, and the arrow points to the side of the beamsplitter with the text (and optical coating).

  2. Assemble the camera tube, which similarly constructed. The parts are 1" lens tube (SM1L10), 1" lens tube coupler (SM1CPL10), 1" adjustable lens tube (SM1V10), another 1" lens tube (SM1L10), and C-mount SM1 adapter (SM1A9) (last two shown below).

  1. Make sure this camera tube is 82.3 mm long. We calculate this number by subtracting the various component lengths from the standard microscope objective back focal length of 160mm: 160 - 17.5 (c-mount camera) - 22.1 (objective tube) - 38.1 (beamsplitter cube).

  1. Screw on the C-mount SM1 adapter (SM1A9) to the camera and the 1" lens tube. Adjust the lens tube coupler to align the camera with the beamsplitter cube.

  1. Assemble the objective tube, which consists of a 0.5" lens tube (SM1L05), a 0.3" lens tube (SM1L03) an SM1 to RMS adapter (SM1A3), and the microscope objective.

  1. Temporarily loosen the top lens tube coupler in order to finally screw the entire assembly into the projector.

3D Print and Assemble the Stage

Print all of the parts in the table below. Black PLA is fine. You may need to re-orient them so they print well. The stepper mounts will all need small supports in the motor flange. The X and Y axes need other supports as well.

  1. Unscrew all the, micrometers, L-stops and stage locks from the micrometer stage. Separate the X, Y and Z axes. Throughout the assmebly process we will be replacing the stock screws with ~4mm longer ones as we reattach the various components to the stage. All 3d printed mounts are 4mm thick at the screw holes. Have your M2.5 screw kit handy!

  1. Press fit the three sliding shaft couplers onto the three micrometer handles until the knurled surface is fully covered. They should fit with significant force and maybe gentle hammering. Be careful - the micrometer handles may have different diameters so you may need to modify the CAD and reprint to get a correct fit.

  1. The shaft couplers should slide on the motor shafts with zero slop. Modify dimensions and re-print if this is not the case. Graphite lubricant may help decrese sliding friction, and the fit will get looser after repeated axial movement as the steel deforms and smooths the plastic.

  1. Screw the motor, coupler, and micrometer into the X axis motor mount as shown. Doing this step before attaching to the rest of the stage takes advantage of the slop in the micrometer mounting screws and aids alignment.

  1. Slide the Y axis motor mount onto the Y axis. You will need to remove some screws and push the stage to allow it to slide on.

  1. Attach the motor. Don't screw down the micrometer mount yet.

  1. While pushing the stage so the micrometer isn't touching the stop, fasten the micrometer mount. This avoids preloading the micrometer/motor assembly and improves shaft alignment.

  1. Reattach the X axis micrometer stop as well. You may need to adjust the screw length to get it to fit.

  1. Insert the Z axis motor mount to the Z axis. The easiest way to do this is to insert it upside down from the opposite side, then flip it while pushing the stage up, then slide it back so the holes line up. Basically it takes some fiddling.

  1. As with the other stages, attach the motor first, then secure the mounts. Tighten the set screw at the green arrow. Make sure the micrometer is flush with the mount at the yellow arrow. Again pushing upwards at the red arrow eliminates prelaod from the spring inside the stage and helps alignment.

  1. Tighten down the Z axis mount.

  1. Attach the X axis motor mount to the stage with the screws at the red arrows.

  1. Add additional screws on the X and Y axes to make sure the mounts are solidly attached. Ignore the spring in the above image.

  1. Attach the right angle bracket to the theta stage and the top of the Z stage.

  1. Screw the chip vacuum chuck onto the theta stage. The stage is finished.

Mechanical Integration

  1. Bolt the XYZ stage to the base plate using short screws so they don't protrude out the bottom. Ensure the stage is aligned with the tapped holes by pushing it forward while screwing it down.

  2. Screw in the four alignment screws for the projector. They don't need to go in all the way.

  1. Push the projector and optics against the four screws to ensure alignment.

  1. Plug in everything: power for the projector, locking USB cable for the camera, USB cable for the stage, power for the stage, HDMI for the projector, power for the pump, and vacuum tube for the chuck. Do not power the stage arduino shield without the motors connected, or you will burn out the drivers.

Install Software and Flash Firmware (WIP)

To install and run the software, you will need a Windows system that has two USB ports. The rest of this section describes how to install the following dependencies:

  1. Arduino GRBL firmware

  2. Python version 3.10 and Python libraries

  3. FLIR Blackfly S Camera Drivers & Viewer

After these are installed, you may clone and instantiate the stepper repository on your device. Optionally, you can develop your own driver for the Flir camera to allow a GUI-integrated live camera preview of the stage. Instructions for such are included below as well.

Arduino GRBL Installation

  1. Install Arduino IDE.

  2. Flash the Arduino with GRBL following the instructions in the Link below (it may display as "Not found", but we have found that the link works anyway). For more info about the CNC shield, see the original designer's page below.

  1. To test that the installation was successful, open Arduino IDE and open the serial monitor. You should see text indicating that a version of GRBL is running on your Arduino.

Python Version 3.10

At the time of development the latest Python version the Flir Spinnaker SDK supports is version 3.10. As such, you must install libraries and run the software for/from this version.

  1. We highly recommend using a Linux-based terminal on your Windows system for installation. One option is the official git terminal. The following instructions assume you are using this terminal environment.

  2. Open git terminal. Check if you have Python 3.10 already installed on your system by running py -3.10 -V. If no installation is present, download and install Python 3.10 from the official download link.

  3. Import necessary libraries with pip

    • pip install pillow, serial, opencv-python

    • TKinter should be bundled with the 3.10 download, but if not found, it must be installed with local package manager: not pip

    • PIL / Pillow -> pip install pillow

    • Serial -> pip install serial

    • cv2 -> pip install opencv-python

    • Do not install camera library with pip, as it will conflict with the Flir python library

FLIR Blackfly S Drivers & Viewer Installation

(WIP)

Stepper GUI Installation

  1. Open git terminal to the location where you want the Stepper GUI software to be downloaded. Then, run the following commands:

  • git clone https://github.com/hacker-fab/stepper .

  • cd stepper

  1. If you have access to the private Flir camera submodule repository, then also enter the following commands:

  • git submodule init

  • git submodule update

    Otherwise, disable the camera in the software. To do this, go to the stepper/litho/scripts/config.py file and toggle the necessary flags at the top (i.e. RUN_WITH_CAMERA = False). (Or, if are using a different camera, update config.py to select your camera instead. The camera must implement the CameraModule interface.)

  1. Run the software.

  • py -3.10 ./litho/scripts/Lithographer.py

  1. Run lithographer.py with Python 3.10:

    • py -3.10 ./litho/scripts/Lithographer.py

  2. For instructions on how to use the Stepper GUI software (including troubleshooting), please see the Standard Operating Procedures.

Optional: Flir Spinnaker SDK (for software developers)

The Stepper V2 build uses a Teledyne Flir camera and custom software written for it. The Stepper software uses the Flir Spinnaker SDK to integrate a live camera preview of the stepper's stage. Since the SDK and its derivative software are closed-source components, we currently do not possess the legal authority to grant access to our custom Flir camera driver to third parties. The following steps describe how to install the Flir Spinnaker SDK and how to develop your own driver. Please carefully review all terms, agreements, and licensing requirements. Follow the steps below.

  1. Create an account on the Flir website (https://www.flir.com/), or, if you already have one, sign in.

  2. Download the Flir Spinnaker SDK (https://www.flir.com/products/spinnaker-sdk/) for Windows.

  3. Decompress your download if necessary. Open the README.txt file in the (decompressed) download and follow the installation instructions inside.

  4. Test that the installation was successful by running an example program. To do this, first make sure your Flir camera is connected. Then, open git terminal in the "Examples" folder. Then, choose any example .py script and run it by entering py -3.10 NameOfYourScript.py. Ensure that the program output reports connection and communication with your Flir camera.

  5. To write a Flir camera driver compatible with the rest of the software, you must conform to the stepper's CameraModule API. Follow the example(s) in stepper/litho/scripts/camera to implement an interface for your purposes. Within your custom "FlirCamera" class, which should be defined as a subclass of CameraModule and a Flir event handler, we recommend implementing at least the following functions:

    • def __init__(self)

    • def setStreamCaptureCallback(self, callback)

    • def streamImageReady(self); returns True if live image is available

    • def getStreamCaptureImage(self); returns a tuple of (numpy ND image array, shape of that array, and an image format string ("rgb888" or "mono8")), or False if the image is invalid

    • def isOpen(self); returns True if the camera is active

    • def open(self); returns True on success

    • def close(self); returns True on success

    • def startStreamCapture(self); returns True on success

    • def stopStreamCapture(self); returns True on success

    • a Flir image event handler

    We also suggest optimizing live preview performance by selecting a low-overhead color processing scheme and by displaying only the most recently acquired image (i.e. newest first). The Flir SDK code examples show how you might do this.

  6. In config.py, assign "camera" to an instance of your FlirCamera class. For instance:

RUN_WITH_CAMERA: bool = True # set to True to test camera preview 
RUN_WITH_STAGE: bool = False # set to True if controlling the stage from GUI
if(RUN_WITH_CAMERA):
  # ...
  import camera.flir.flir_camera as flir # in camera/flir/flir_camera.py...
  camera = flir.FlirCamera() # instantiate a FlirCamera
  # the camera variable is imported and used by the remaining stepper code.

Final Alignment (WIP)

Once the stepper is connected to a computer and the live camera feed is visible, proceed with final alignment. The goal is to adjust the tube length between the DLP housing and the beamsplitter cube such that both the projected image and the chip are in focus.

  1. Place a chip with a visible pattern on it. Cracked glass or extremely dirty chips are good options.

  2. Project a mostly red image with some fine marks for determining focus.

  3. Using the Z axis (focus) of the stage, focus onto the chip surface. Disregard the projected pattern for now.

  1. Loosen the clamp that connects the two parts of the DLP-beamsplitter tube so that they freely rotate. (update picture)

  2. Loosen the locking ring on the adjustable lens tube.

  3. Screw the adjustable lens tube in/out while periodically checking to see if the projected image gets more or less in focus. You may need to push the optics into the coupler to ensure planarity.

  4. Once both images are in focus at the same time, tighten the locking ring on the adjustable lens tune as well as the coupler. (insert image)

Safety

Wear UV-blocking glasses whenever light leakage from the projector is possible.

Validation and Characterization (WIP)

Demonstrate the operation of the hardware and characterize its performance for a specific application.

  • Highlight a relevant use case.

  • If possible, characterize performance of the hardware over operational parameters.

  • Create a bulleted list describing the capabilities (and limitations) of the hardware. For example, load and operation time, spin speed, coefficient of variation, accuracy, precision, etc

Appendix

Last updated