In the following images, the scan direction is along the x-axis direction. Lines are projected parallel to this direction. As such, the error in the y-axis represents the cross scan error. Substrate is solar-fotopapier, 20 blatt, format 14x19 cm. Using a scissor I cut a good sized rectangle (4x4 cm) Each line is exposed four times at a rate of 3000 RPM, i.e. 12000 facets per minute. Laser current is assumed to be 500 mA.
Using all four facets
Using a single facet
With a single facet lines are much sharper and 75 micron seems achievable. Stitching between lanes is a challenge as well. Odd lane (backward) have an other offset than even lanes (stage moves forward). Gravis pointed out that potentially, an algorithm, which takes the facet number into account could correct for the cross scan error. This is easy to imagine and can be executed, it is just hard to do so. Patterns is created via python, see crosscantest in https://github.com/hstarmans/hexastorm/blob/master/src/hexastorm/interpolator/patterns/create.py . In the pictures, on the left axis you see the lane width. There are ten lines per group where width and spacing are equal to the number denoted e.g. 50 microns. On the x-axis the distance between 0 and 10, is 10 mm. It just measures actual distance along x axis.
The polygon mirror (PM) is often used for fast scanning applications due to its superior scanning speed and large scanning angle. However, PM-based laser scanning systems are prone to cross-scan errors, restricting scanning precision. The facet tilt and scanhead dynamics are considered as two primary sources contributing to cross-scan errors. A treaty of cross scan error in polygon mirrors can be found here https://www.acin.tuwien.ac.at/file/publications/iat/pre_post_print/2024_cong_aim.pdf .
Luckily, cross scan error is zero in a laser prism scanner with two cylindrical lenses.
In a prism scanner, the laser diode is first collimated with an aspherical lens. The bundle is then focused by a cylindrical lens in a direction parallel to the prism. The bundle is deflected by refracting it through a tilted transparent plate. The bundle is finally focused by a second cylindrical lens orthogonal to the scan line. This has two advantages; the bundle is circularized (cylinder lenses have different focal lengths) and the cross scan error is removed (explained hereafter). Scanhead dynamics introduce noise into the system BUT the refracted laser bundle remains parallel to the incoming laser bundle as this is always the case for a planar prism. As such, the second cylinder lens removes the cross scan caused by vibrations as all parallel rays are focused in the same point. This is a fundamental advantage of prism laser scanning, minimal cross scan error. In polygon mirror systems this is solved by active compensation via a galvo scanner, see https://repositum.tuwien.at/handle/20.500.12708/213517. In a polygon mirror system the outgoing rays are not parallel to the incoming rays so the cylindrical lens trick doesn't work as well.
Below we see a side view of the new laser head and a camera with neutral density filters. If you look carefully, you can see a two cylinder lenses. The one between the laser and the prism is the hardest to see.
Cross scan measurement is shown below, a line which is around 12 pixels wide implying around 36 microns error. Camera has a pixel size of 3 micron, see https://hackaday.io/project/21933-prism-laser-scanner/log/217210-cross-scan-error-measurements-new-bearing two cylinder lenses, one channel, current 80 a.u. (scale 1-255), 4 facets, polygon speed 2000 rpm, exposure time is set to minimize overexposure and have a stable image
An exposure without cylinder lenses is shown below. Here you can clearly see the individual lines produced by the facets which are removed by the cylinder lens.
The boards sponsored by PCBWay are shown below. Progress in the last days has been good. Following things are working: prism motor (spins), laserdiode (can turn on & pogo pin system works), TMC2209 communications work, ESP32 and ICEUP5K (FPGA) work.
Progress has been as follows:
- 9 december: received boards
- 14 december boards populated & compute board working
numbers of some parts where wrong, which required extra shipment from mouser
- 19 december extension board populated (after receipt parts)
I encountered a bug.
- 30 december bug has been resolved
Two issues: - schema error (5V connected to 3.3V, this has been mitigated with soldering tricks)
- stepper motors communicate via UART1 which can create issues with UART0 (micropython repl)
this is a bug upstream but can be mitigated by a trick in the boot.py script.
- 2 january Destroyed laptop (applied 12V over USB input)
- 6 january Mounted motor, encountered issues moved to different board
- 7,8 january Changed code, ESP32 communicates with FPGA, spinning of prism work - 9 january Laser works (forward diode voltage of 2.5V) - 13 january Laser can be calibrated while on (pogo sytem works good) Laser diode prism test --> pass - 14 january Stability test / Mounting on machine laser reaches stability criterion mirror position without cylinder lens does work mirror position for cylinder does not work (cylinder lens might work, mirror position not optimal, needs testing) - 18 january x and y motor work, homing switches work spi unreliable (fails every 100_000 writes) - 21 january spi issue fixed; (bad soldered bord + incorrect setting) - 22 January test exposure works (resoldered x-dir pin) - 2 february micropython code optimized, check added to ensure micropython can feed data fast enough to the laserhead - 13 february all buttons are functional, only print remains now
Current challenges remaining - fine tuning optics & test exposure with microdot webserver
I'm thrilled to announce that PCBWay is sponsoring the PCBs for my next version of the laser direct imaging head! Their generous support will help me push the boundaries of this exciting technology and create something truly innovative.
I'm incredibly grateful for their commitment to supporting the open hardware community. Be sure to check out PCBWay for all your PCB needs!
The laser head, version 0.1, is compatible with a brushless motor. While the PCB motor is also supported, it won't be the default configuration. To accurately visualize the mirror motor, a more detailed render was necessary. The NBC3111 mirror motor and a cad model in freecad is depicted below. Below a head is shown which supports the prism or mirror which is spinning.
The extension module is mounted on top of a compute module. The female 20 pin header is not shown. Power is supplied via a USB-C connection requiring a 12V charger. An on-board converter (large black chip) reduces this to 5V for the compute board.
The board has three stepper drivers TMC2208 and three end stops. A 20-pin connector interfaces with the laser head. Another 20 pin connector is free to use. The laserhead needs to move less than a FFF printer due to the polygon, as such not a lot of current for the stepper motors is required. It is assumed this is less than 1 Amp.
Note: A USB-C connection with an FPGA for the laser head was initially considered but is currently postponed.
I have initiated the next design cycle. The core component is the compute module, housing an ESP32 microcontroller and a UP5K FPGA. It's equipped with a reset/boot switch and a single control LEDs for the ESP32 and FPGA. A small memory module dedicated to storing the FPGA bootloader is also integrated. The ICE V module loads the FPGA directly from the ESP32. I keep it , as I might want to use this memory as a buffer for storing instructions to the laserhead. Board is 2 layer with mostly SMT components to keep costs low.
I did not post in quite some time. Luckily software part is now largely finished. You can test some of the code locally in cpython. The webserver is quite different from Octoprint, see FLOSS weekly episode 778. I use Micropython instead of Python, furthermore I rely on microdot and not Flask. Taken together, I need much less resources which greatly reducing costs and deployment complexity.