Стенд «ИК-бампер»

 

Среди множества датчиков, которыми оснащается робот, особое место занимают датчики препятствий. Простейшим датчиком препятствий является контактный датчик (точнее, это датчик столкновения). Однако очень часто полезно бывает умение обнаруживать препятствия на некотором расстоянии от робота. Ниже речь пойдет именно о таком датчике, называемом инфракрасным бампером (ИК-бампером).

В отличие от активных датчиков, использующих излучение радиодиапазона или ультразвуковых систем, ИК-датчики являются достаточно дешевыми и простыми устройствами, подходящими для решения несложных задач, в которых не требуется ни особой точности, ни большой дальности обнаружения.

 

Итак, необходимо создать систему, которая могла бы определять наличие препятствие по отраженному от него ИК-сигналу. При этом расстояние, на котором обнаруживается препятствие составляет несколько десятков сантиметров. Кроме того, крайне желательно, чтобы система была устойчива к помехам (именно помехи в виде внешней засветки не позволяют, например, эффективно использовать видимый спектр). Начнем с приемника.

Приемник. В качестве приемного элемента проще всего использовать микросхему интегрального фотоприемника типа TSOP17, внешний вид которого и его схема приведены на рис.1.

 

 

Рис.9.1. Элемент TSOP. Внешний вид и его структурная схема

 

Суть этого устройства состоит в том, что этот фотоприемник предназначен для приема сложного сигнала, представляющего собой короткие пакеты (пачки) импульсов с определенной рабочей частотой - от 30 кГц до 56 кГц. Пакеты импульсов и паузы между ними необходимы для того, чтоб система смогла отфильтровать полезный сигнал и свести неизбежные при приеме помехи к минимуму.

Существует целы ряд таких элементов. Обозначаются они как TSOP17xx, где последние две цифры и обозначают рабочую частоту. Например, TSOP1736 - это фотоприемник с рабочей частотой 36 кГц, а TSOP1756 рассчитан на частоту 56 кГц.

Излучатель. Итак, чтобы избежать помех необходимо уметь генерировать сигналы сложной структуры. Излучающим элементом может быть любой ИК-диод, длина волны которого находится в районе 950 нм. На этот диод надо подавать пачки импульсов. Для увеличения мощности можно использовать транзисторный ключ.

Ниже представлена диаграмма излучателя и того сигнала, который получается на выходе элемента TSOP. Обратите внимание, что активный уровень выходного сигнала низкий: когда на вход приемника поступает пачка импульсов, на выходе получается низкий уровень. Второй особенностью, о которой не следует забывать, является то, что на выходе приемника будет не непрерывный сигнал, а огибающая пачек - импульсы.

 

Рис..2. Входной (от излучателя) и соответствующий выходной сигналы (приемник)

 

Генерировать пачки можно как аппаратно, так и программно. Для аппаратной реализации подобного рода генератора используются обычно специальные схемы. Например, такой генератор можно собрать на основе микросхемы NE556 (сдвоенный интегральный таймер. Один каскад задает несущую частоту, а другой – огибающую).

 

Мы же рассмотрим систему, собранную на контроллере на основе ATMega8.

 

ИК-бампер состоит из двух ИК-излучателей, приемника на элементе TSOP1736 и контроллера. Задача контроллера состоит в том, чтобы формировать пачки импульсов и подавать их на ИК-излучатели поочередно. После формирования очередной пачки контроллер принимает сигнал от TSOP. Если приемник регистрирует сигнал, то препятствие обнаружено. Бампер использует два излучателя для того, чтобы регистрировать сигналы по двум направлениям (двухзонный датчик).

ИК-бампер не определяет расстояния до препятствия. Зона действия бампера определяется лишь интенсивностью ИК-излучения, для чего подбираются параметры ограничивающих резисторов R3, R5 (см. схему на рис.1.).

 

Рис.1. Схема ИК-бампера

 

Внешний вид демонстрационной установки представлен на рис.2.

 

 

Рис.2. Внешний вид

 

Особое внимание при изготовлении подобного рода устройства следует обратить на систему излучатели-приемник. TSOP является очень чувствительным элементом, поэтому, помимо ограничения мощности излучения, следует хорошо экранировать излучатели и приемник. Это достигается установкой бленд из темного непрозрачного материала на излучатели. Кроме того, полезно установить по бокам приемника металлические стенки. Эти меры приведут к тому, что приемник не будет регистрировать боковые излучения ИК-диодов.

 

 

Рис.3. Излучатели и приемник

 

В Приложении 2 приведен листинг программы. Расчет параметров генератора импульсов представлен ниже:

 

Исходные данные

 

F, несущая, Гц

36 000

N, количество импульсов в пачке

20

S, скважность пачек

2

 

 

Расчетные данные

 

t, длительность импульса, мкс
t=(1/F)*1000000/2

13,89

Tp, длительность пачки, мкс
Tp=N*(t*2)

555,56

Td, задержка между пачками, мкс
Td=Tp*(S-1)

555,56

Tsop, период пачек, мкс
Тsop = Tp+Td

1 111,11

Fsop, частота пачек, Гц
Fsop = 1/Tsop*1000000

900

 

Обратите внимание на то, что при генерации пачек в программе используется не «штатная», расчетная задержка, а очень большая задержка в 50 мс. Это сделано для создания необходимой инерционности датчика. Такая инерционность полезна при обнаружении препятствий - у робота будет возможность успеть прореагировать на сигнал. Разумеется, если необходимо отслеживать очень быстрые процессы, то эту задержку надо уменьшать.

 

На основе ИК-бампера вполне можно создать и систему маяков. Для этого необходимо одно устройство использовать как излучатель (маяк). При этом излучать должна не пара диодов, а большее количество – 6-8 шт. для создания круговой диаграммы. Причем излучать они должны не поочередно, а синхронно.

Рис.4. Излучающие диоды передатчика

 

Второй устройство, снабженное TSOP, будет служить приемником. В этом случае необходимо ограничить зону приема ИК-излучения, изготовив диафрагму для приемника.

 

ИК-бампер использует простейшую форму сигнала. Помехозащищенность такой системы не слишком высока. К тому же, очень сложно заставит работать в комплексе несколько таких устройств (они начинают мешать друг другу). В реальных системах используются не простые пачки импульсов, а сложные помехозащищенные последовательности – т.н. ортогональные коды (М-последовательности, коды Баркера и проч.). Их реализация возможна на программном уровне, что делает рассмотренный ИК-бампер неким экспериментальным базисом, на основе которого можно создавать более защищенные и развитые каналы связи.

 

Приложение 1. Печатная плата

 


Приложение 2. Листинг программы

 

/*****************************************************

Project : ИК-бампер

 

Chip type           : ATmega8

Program type        : Application

Clock frequency     : 7,372800 MHz

Memory model        : Small

External SRAM size  : 0

Data Stack size     : 256

*****************************************************/

 

#include <mega8.h>

#include <delay.h>

 

void Init(void)

// Функция инициализации контроллера

{

  PORTB=0x00;

  DDRB=0x01;

 

  PORTC=0x00;

  DDRC=0x30;

 

  PORTD=0x04;

  DDRD=0x80;

 

  // Timer/Counter 0

  TCCR0=0x00;

  TCNT0=0x00;

 

  // Timer/Counter 1

  TCCR1A=0x00;

  TCCR1B=0x00;

  TCNT1H=0x00;

  TCNT1L=0x00;

  ICR1H=0x00;

  ICR1L=0x00;

  OCR1AH=0x00;

  OCR1AL=0x00;

  OCR1BH=0x00;

  OCR1BL=0x00;

 

  // Timer/Counter 2

  ASSR=0x00;

  TCCR2=0x00;

  TCNT2=0x00;

  OCR2=0x00;

 

  // External Interrupt(s)

  // INT0: Off

  // INT1: Off

  MCUCR=0x00;

 

  // Timer(s)/Counter(s) Interrupt(s)

  TIMSK=0x00;

 

  // Analog Comparator

  ACSR=0x80;

  SFIOR=0x00;

}

 

#define INP  PIND.2 // Сигнал TSOP

// ИК-излучатели

#define IRD1 PORTD.7

#define IRD2 PORTB.0

 

// Выходы (индикация)

#define INDIC1 PORTC.4

#define INDIC2 PORTC.5

 

//----------------------------------------------------------

// Исходные данные

#define F 36000.0  // F, несущая, Гц

#define N 20L      // N, количество импульсов в пачке

#define S 2L       // S, скважность пачек

 

// Расчетные данные

#define t (unsigned long)((1/F)*1000000.0/2.0)  // t, длительность импульса, мкс

#define Tp (unsigned long)(N*(t*2))    // Tp, длительность пачки, мкс

#define Td (unsigned long)(Tp*(S-1))   // Td, задержка между пачками, мкс

 

void main(void)

{

  int i;

  Init(); // Инициализация контроллера

  // Основной цикл

  while (1)

  {

    // Формируем пачки

 

    // Излучатель IRD1

    for(i=0;i<N;i++)

    {          

      IRD1 = 1;

      delay_us(t);

      IRD1 = 0;

      delay_us(t);

    }

    // Пробуем принять

    INDIC1 = !(INP);

 

    delay_us(Td); // Штатная задержка

    delay_ms(50); // Эта задержка добавит датчику необходимую инерционность в 50 мс

 

    // Излучатель IRD2

    for(i=0;i<N;i++)

    {          

      IRD2 = 1;

      delay_us(t);

      IRD2 = 0;

      delay_us(t);

    }

   

    // Пробуем принять

    INDIC2 = !(INP);

 

    delay_us(Td); // Штатная задержка

    delay_ms(50); // Эта задержка добавит датчику необходимую инерционность в 50 мс

  }

}