The experiment was a success! The results are in: it didn't work. The first issue is that the motor was not running right -- I don't know if it's a bad bearing or loose connection or what, but it just doesn't sound right, and the pilot reported issues with getting enough power. Moving the LEDs and electronics to a separate battery ruled that part out as a possible cause. The second issue is that it simply doesn't fly well. Adding the weight of the electronics and moving the wing to the bottom of the fuselage is making it too unstable to be controllable.
Back to the drawing board... first goal is getting a flying airplane, so I'll swap out the motor and see if I can get it running better, or maybe borrow Joe's glider since it has a beefier motor. Second goal is reducing weight... I'm going to pull the silicone sleeve off the LED strip since it's just dead weight and we don't need the water proofing. Third goal is better aerodynamics... Marlin suggested building a "spray bar" to hang under the plane so the wing can go back where it belongs. I ordered some rigid clear plastic tubes to try putting the LED strip inside them and mounting it under the plane where you can see all the LEDs well.
Marlin managed to get some good shots in between crash landings last night, but we're definitely not there yet:
Assembling everything last night, I discovered an issue that I hadn't encountered before. At high frame rates, the Teensy no longer has time to read the signals from the RC receiver. I'm using interrupts to measure pulse widths, but the Adafruit Neopixel library disables interrupts while bit-banging the WS2811 data. Somewhere around 20ms per frame (50Hz) the Teensy doesn't have time to read both sides of a pulse from the RC receiver between frames, which it really needs to be able to do in order to turn OFF the light pattern.
Thinking about this, I decided I could either rewrite the Adafruit Neopixel library to use timers/interrupts (ack) or add a processor that could turn the servo pulse widths into a simple digital signal. As it happens, I had one of the processors already, purpose-built for the occasion: it's called a receiver switch, and I use them for turning LEDs on and off. By wiring its output to the Teensy (with its switchable pulldown resistor!) I was able to check the status of the NAV switch with a simple digitalRead between frames, and everything started working much better.
From prior testing I was worried about noise in the remote control system caused by the RC transmitter trainer cable, but that seems to have resolved itself, possibly when I switched to using a battery pack instead of my laptop to power the uC.
It all fit back in the plane, so tonight's the night if the weather holds...
After much experimentation, the data link is working very well by using one servo channel as a "clock" (toggled between high and low to mark new data values, as well as a middle value for synchronization at the start of a message), and a second channel as "data" (set to one of 10 different levels, which I can distinguish fairly easily). A cycle of 300ms seems to be fairly reliable, so I can send one decimal digit 0-9 every 300ms. A simple protocol with a checksum lets me set one of 10 different variables to a value 0-99. The plane then blinks its new tail lights in green for a good receipt, or red for a failed receipt.
I was originally thinking that I would repeat all 4 parameters each time, but at 300ms per digit, it would take a while. Since I really only need to update one thing at a time, I now have the control pendant only sending out data for the currently-selected parameter. That way you can change it, hit the trainer button to send it, and wait for a green flash to confirm it was received.
I tested almost all of the electronics together last night -- the only thing missing from a full mockup would be the motor and ESC. I still want to test how range affects the quality of the data transmission, and there's some cleanup still to do, but in general things are looking good for Wednesday night's photo shoot.
So far I have it sending a 6-channel PPM signal via trainer cable to my TX, and successfully driving a servo with the resulting RX signal. Next step is to plug the RX back into the Teensy and add some debugging code so I can see how stable the signal is, then figure out how to encode data to send over the RC link. At the moment I'm thinking something like center=sync, high=1, low=0, but I need to do some testing to find out what size pulses I can reliably detect,. The goal is for the upload process to be self-synchronizing, error-detecting, and not take more than about a second, since the plane will be uncontrolled during it! (unless I wire up a nunchuck for flight controls during upload... it could happen!)
It would be awesome to have a full-time data channel available, but I don't see any easy way to do that short of opening up my TX and patching into the switch contacts, so I'll stick with the trainer idea for now.
First flight went better than I expected! The main lesson learned is that we need a real photographer involved, which will hopefully happen next week. Also some minor adjustments to be made to how the plane flies (centering the rudder better) and to the frame timing (20Hz is much too slow for the plane's speed)
I also had a brainwave about input devices for selecting images, adjusting timings, brightness, blanking periods, etc... I'm going to build a little pendant with a 3.5mm jack, which will connect via trainer cable to the RC transmitter. When I want to update settings on the main board, I just push the "upload" button, tell Joe to hit trainer mode for a second, and the digispark will push the new settings out via PPM over the RC link to the Teensy. This would be too cool for me to not try to make it work, so that's the goal over the next few days.
Initial commit... this project has been in the works for far too long, but I'm finally getting ready to put the pieces together. Tested so far: plane works with the wing on the bottom, for best visibility of the LED strips. Teensy is reading BMP files from the SD card and displaying them on the LED strip.
Next steps: hook up the receiver and read the two toggle switches, mount the whole thing on the plane, figure out how I'm going to do the photography side.
Bells and whistles: add some input other than the buttons for configuring timing, etc. while on the ground. I have a little OLED screen that would be perfect for a menu system, along with a 5-way joystick, or maybe try interfacing a Wii Nunchuck for a detachable ground-based input device.