So I've spun up the device a couple times(see project profile picture!), and it's showing definite promise. There are a few more issues to work through, though.
On the mechanical side, the slots for the motor sled still need to be moved (ie. I need to recut the base).
Provisions also need to be made for a spring tensioner to pull the motor sled back, keeping tension on the belt.
The pulley I laser cut for the motor is slipping on the motor shaft, and is also pretty worn, probably because of all of the issues already mentioned.
What that means, is the thing only works when a hand is pulling on the sled, maintaining tension. That's not appropriate for sitting unattended on a desk at all!
I buried the lede, somewhat. Here's South America:
You can see the magnet trigger on the left, hastily taped on.
It's pretty cool! It looks very trippy in person, I'll have to find something that can take video without the rolling shutter. And also just better pictures.
There are some issues, though. I'm not happy with the resolution, in either direction. For this PCB, there's not a lot that can be done about the vertical longitudinal resolution. I may revamp this in the future to use 0603 LEDs instead of 0805, and pack in 48 of them instead of only 20.
The horizontal (latitudinal) direction shouldn't be turning off like that in between transitions. It should be steady.
So, I've checked my code, and I don't think there's any issue in there directly. My suspicion is this:
My generated code that stores the image data is currently set to 8-bits per pixel. The driver chip, the TLC5947, takes 12-bit data for each channel. So I'm just passing 8-bits into my function that expects 12-bits, only turning on the LEDs at a fraction of their max brightness. In theory, that should be totally fine.
Crunching the numbers, though, with max value of 12-bits being 4096, and my current max value of 8-bit / 256, I'm only going up to about 6% brightness. And, because the driver modulates the LED "brightness" with a PWM signal, the LEDs are only on about 6% of the time, potentially leading to that "turn-off" you see in the image.
At least, I'm hoping that's the issue, because it's an easy fix. I didn't expect it to crop up because the internal frequency of the TLC5947 is 4MHz, but here we are. If that's not it, then I have to go in with a logic analyser on all of the data lines, and a scope on the LED outputs, and a signal generator on the input sensor... A huge pain.