To keep Blimpduino as cheap and simple as possible, it navigates by looking for signals from a ground-based IR beacons in any one of four directions. There are four IR detectors (N,S,E,W) on the blimp and the ground-based beacons are nothing more than an IR LED transmitting random 1s and 0s at 56KHZ. This being IR, they bounce all over the room and there is loads of IR noise from other sources, but the IR receiver that records the highest number of 1s (highest signal-to-noise ratio) is considered the direction that the beacon is transmitting directly from and we steer accordingly. (This is also the way the Pololu IR beacon/transceiver pairs work)
That's easy for one beacon. But when we want to introduce multiple beacons, each with a unique ID, it gets more complicated. We can't transmit at different light frequencies, because we'd need to add matching IR receivers on the blimp for each beacon we added. We can't use TV remote control codes, because then we can't tell where they're coming from (it's the ratio of signal to noise that tells us direction, but the codes are all signal and work as well if they're bouncing off a wall as when they're aimed directly).
Our instinct is to have a central beacon controller (another Arduino--see diagram above) and sequence them so that you'd be able to tell which beacon is transmitting by when in the beacon sequence you got the signal. But that requires us to synchronize the blimp and the beacons to a common clock, and we're debating how to do that.
My proposal is to do the following, 10 times a second:
- For the first 1-50ms in each cycle: all beacons go on for 30ms, then all off for 20ms ("clock sync pulse").
- 50-60ms: Beacon 1 on
- 60-70ms: Beacon 2 on
- 70-80ms: Beacon 3 on
- 80-90ms: Beacon 4 on
- 90-100ms: Beacon 5 on
- Repeat...
The beacon hub controller would just schedule that sequence. The blimp, meanwhile, would have to detect both the direction of signals and how long they're on. If they're on for 30ms and then off for 20ms, that's the start of a cycle. Then depending on when in the cycle it detects the next signals, it knows which beacon that is.
Jordi's not convinced this will work, and thinks we'll need an RF link to communicate between blimp and beacons, which strikes me as expensive, complicated and unnecessary. What do you guys think?
Is there a better way to have a blimp distinguish between different IR beacons?
Comments
I assume this method would indeed require a central beacon scheduling microprocessor to avoid different beacons transmitting at the same time.
Thanks very much--that's really helpful. The question is whether we'll still be able to determine direction (highest s/n ratio) if we're modulating with the intention of actually reading the data, as you suggest. We've found the two requirements to be in opposition.
In the interim, you should be able to test a beacon ID scheme by cutting the trace from RC5 to Q1 and add a timer circuit (555 or equivalent) and switch to modulate the IR LED output. The timing pattern will ideally produce a relatively short ON pulse and longer OFF pulse to minimize overlap between different beacons. On the receiving side, you won't need anything nearly as complex as an FFT to extract the modulation frequency.
This (scroll down) is the schematic for the Pololu IR transceiver, which we're using as a test beacon. If we make our own, we'll probably use an Arduino rather than a PIC, and we would only need the transmitting bits (IR LEDs), not the receivers,
I was looking for the IR beacon circuit, not the receiver, just to consider how it might be easily modified.
There are some interesting suggestions above. They need to take into consideration that the underlying modulation frequency for the IR emitters of 36kHz (or 38kHz) is fixed (the IR receivers need this to filter out background noise), so any signaling schemes will be on top of that fixed frequency. In any case, transmitting different burst widths from each beacon will probably be easiest to decode.
_---_--^-__-^-_-^-_____-^---_
Note the 5 peaks. the lower peak is noise in the environment. If it sees one, it should expect that the following detectors sees it in relatively the same place, only shifted in the directtion on the cartesian plane that the blimp is moving or the ID (hopefully). If a peak doens't give an ID over hte lapse of a certain time, it is then decidedly ignored. Once the ID peaks are all identified and the blimp filters out the noise, you should get what you want.
_______*____*___*_______*____
if you save their locations (direction technically, until you get 2 or three readings from different angles, then cross the direction of the peak and the intersection will the be location, though not accurate) on an absolute cartesian plane, and move your blimp around on it, you get to have your ID and your location too. I guess the only things you would need to add is a regular motor with a rotation sensor.
then again, i am not sure of the detection angle and quality of your IR, soooo...yeah...
I presume you mean 200 samples/sec, not 200k. Yes?