IR Beacon


This is a stand-alone IR Beacon useful for your robot to find its way around.

It can be configured to emit a different byte, so that you can have several of them meaning different points for the robot.

The following source code (programmed using AVR Studio) would make it send a consecutive byte every half a second, but you obviously can configure it to send the same byte every time, with whatever frequency you want.


/* The IR signal uses pulse distance encoding.
 * Each pulse (1T) is 21 cycles of a 38KHz carrier burst (about 560µs long).
 * A logic "1" is a 1T pulse followed by a 3T space and takes 2.25ms to transmit.
 * A logic "0" is a 1T pulse followed by a 1T space and takes 1.125ms.
 *
 * The AGC burst consists of a 4.5ms burst followed by 4.5ms space (8T pulse + 8T space).
 *
 *
 * Example output:
 *                                                      _____                                            _____                                        _____
 *    +-----Start-----+---------Byte1---------+---------Byte1---------+----------Byte2----------+--------Byte2--------+-------Byte3-------+-----------Byte3-----------+---Stop---+
 *    |               | LSB               MSB | LSB               MSB | LSB                 MSB | LSB             MSB | LSB           MSB | LSB                   MSB |          |
 *    |               |                       |_  _  _ _  _   _  _  _ |                         | _   _   _  _ _ _ _ _|                   | _  _  _   _  _  _   _   _ |          |
 *    |  AGC    Space | 1  0  1   1  0 0  1  0|1  0  1 1  0   0  1  0 |0 0 0  1   1   1   1   1 | 0   0   0  1 1 1 1 1|0  1  0 0  1  0 0 0| 0  1  0   0  1  0   0   0 |0   Space |
 *    +------+--------+---+-+---+---+-+-+---+-+-+---+-+-+---+---+-+---+-+-+-+---+---+---+---+---+---+---+---+-+-+-+-+-+-+---+-+-+---+-+-+-+---+-+---+---+-+---+---+---+-+--------+
 *
 *    ########        #   # #   #   # # #   # # #   # # #   #   # #   # # # #   #   #   #   #   #   #   #   # # # # # # #   # # #   # # # #   # #   #   # #   #   #   #
 * ___########________#___#_#___#___#_#_#___#_#_#___#_#_#___#___#_#___#_#_#_#___#___#___#___#___#___#___#___#_#_#_#_#_#_#___#_#_#___#_#_#_#___#_#___#___#_#___#___#___#_____________
 *
*/

#include <avr/io.h>
#include <util/delay.h>

#define IR_BIT 3
#define LED_BIT 4
#define PORT PORTB

// Infrared signal parameters
#define CARRIER_FREQ 38000  // IR carrier frequency
#define CYCLES_PER_PULSE 21  // width of 1T IR carrier pulse
#define US_PER_SECOND 1e6  // microseconds per second for freq. period conversion
// Carrier frequency adjustment.  Will need to be adjusted depending on
// actual uC/temperature/voltage/clock settings.
#define CARRIER_ADJ -0.8  // in microseconds to adjust 38KHz signal period.

const long DELAY = (US_PER_SECOND / (CARRIER_FREQ * 2)) + CARRIER_ADJ;

void on(){
 PORT = PORT | (1 << IR_BIT) | (1 << LED_BIT);
}

void off(){
 PORT = 0;
}

/*
 * Generate a 1T carrier frequency IR pulse
 *
 * Parameters: state is output level of IR pulse: HIGH or LOW
 */
void onePulse( uint8_t state){
 for( uint8_t i = 0; i < CYCLES_PER_PULSE; i++){
 // 50% duty cycle carrier
 if(state) on();
 _delay_us(DELAY);
 off();
 _delay_us(DELAY);
 }
}

/*
 * Encode a single data byte into IR pulses
 *
 * Parameters: byte is the data to encode
 */
void sendByte( uint8_t byte) {
 //START
 for( uint8_t i = 0; i < 8; i++) onePulse(1);
 for( uint8_t i = 0; i < 8; i++) onePulse(0);

 // BYTE data
 for( uint8_t i = 0; i < 8; i++)    {
 // "1" = 1T on + 3T off; "0" = 1T on + 1T off
 onePulse(1);
 for( uint8_t i = 0; i < ((byte & 0x01) ? 3 : 1); i++) onePulse(0);
 byte >>= 1;  // get the next most significant bit
 }
 // END
 onePulse(1);
}

int main(void){
 DDRB = (1 << IR_BIT) | (1 << LED_BIT);

 while(1){
 for(int i=0; i<255; i++){
 sendByte(i);
 _delay_ms(500);
 }
 }

 return 1;
}

3 Responses to IR Beacon

  1. Pingback: ATtiny Hacks: Infrared guidance and navigation « FOOTBALL, SEX & ALCOHOL

  2. Pingback: ATtiny Hacks: Infrared guidance and navigation - Hack a Day

  3. Pingback: IR Remote (Syma s026) dedicated board – V2 « Robotics / Electronics / Physical Computing

Leave a comment