Понедельник, 02.12.2024, 02:22
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Архив - только для чтения
Простой инфракрасный бампер
SpaceДата: Воскресенье, 02.03.2008, 19:57 | Сообщение # 1








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Ну что, друзья с робофорума, а именно Fox89 сделал инфракрасный бампер и как я понимаю без Tsop. Я сам не проверял, но у него имеется видео, так что выложу ниже, а пока читаем, смотрим схему и прогу для ATmega8 на СИ.
Инфракрасный бампер позволит роботу определять наличие препятствия на пути. Благодаря тому, что сенсор аналоговый, то мы получаем возможность примерно оценивать расстояние до препятствия. Не абсолютно конечно, а относительно, так как уровень сигнала сильно зависит от объекта.
Итак, схема довольно проста:

Используется пара светодиод и фототранзистор (фототранзистор эффективнее фотодиода). Транзистор Q1 используется для усиления сигнала. При освещении фототранзистора через него начинает протекать ток, который через резистор R1 попадает на базу транзистора, транзистор приоткрывается, и напряжение на коллекторе начинает падать. Напряжение с коллектора мы отправляем на вход АЦП. Для управления светодиодом используется MOSFET, так как светодиод потребляет 50 мА, в то время как максимальная нагрузка на порт – не более 20 мА.
Работает так. Мы включаем светодиод и начинаем измерять ток через фототранзистор. Если препятствие близко, то часть ИК излучения отразится от него и попадет на фототранзистор, если же препятствия нет, то ИК излучение уйдет в пустоту. Затем мы выключаем светодиод и снова измеряем ток через фототранзистор. Если препятствие есть, то оно теперь не подсвечивается, что и вызовет разницу в токе между включенным и выключенным светодиодом. И именно благодаря работе с разностью освещенности бампер нечувствителен к общему уровню засветки. Единственное, что при ярком свете через фототранзистор будет протекать такой ток, что транзистор откроется полностью, и колебания тока будут за пределом области усиления. Сей недостаток устраняется введением некого подобия АРУ, например переключение резистора в базе транзистора на более высокие значения в случае яркого освещения.
В собранном виде это может выглядеть так:

Code
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7 beta 5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 24.02.2008
Author  : Spiritus Sancti
Company : licrym.org
Comments:

Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40

bit ADC_complete;
int gADC_result;

interrupt [ADC_INT] void adc_isr(void) //обработчик прерывания по завершению преобразования АЦП
{
unsigned int adc_data;
adc_data=ADCW;
gADC_result=adc_data; //отсылаем считанное значение в глобальную переменную и устанавливаем флаг
ADC_complete=1;
}

int poll_sensor(void){  //процедура опроса сенсора
int delta;
PORTB.0=1;         //включаем светодиод ИК подсветки
delay_ms(1);  //ждем пока разгорится
ADCSRA|=0x40;   //отсылаем бит, запускающий процедуру АЦП
while(ADC_complete!=1); //ждем пока не закончится АЦП
delta=gADC_result;
ADC_complete=0;  //сбрасываем флаг

PORTB.0=0;  //выключаем светодиод, и снова измеряем
delay_ms(1);
ADCSRA|=0x40;
while(ADC_complete!=1);
delta=gADC_result-delta;//вычисляем значение разности
ADC_complete=0;  //сбрасываем флаг
return delta;
}

void main(void)
{
int razn;
//инициализация портов и т.д.
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8B;

// Global enable interrupts
#asm("sei")

while (1)
       {
       razn=poll_sensor();
//пример использования сенсора. Присвоим переменной значение разности,
// и в зависимости от полученного значения будем зажигать светодиоды на порту D
//можно просто запускать какой либо процесс, если разность превышает определенный порог

       if(razn >10)  PORTD.0=1;
       if(razn >20) PORTD.1=1;
       if(razn >30) PORTD.2=1;
       if(razn >40) PORTD.3=1;
       if(razn >50) PORTD.4=1;
       if(razn >60) PORTD.5=1;
       if(razn >70) PORTD.6=1;
       if(razn >80) PORTD.7=1;
       delay_ms(1);
       PORTD=0;
       };
}

Такой бампер также можно применять в различных схемах для определения препятствия, например в будильнике, выключающем сигнал, если над ним пронести руку.
Видео (DivX6 500кб) демонстрирующее работу бампера (в микроконтроллер прошит код выше)
http://licrym.org/images/wiki/irbump.avi - видео
Оригинал: http://www.licrym.org/wiki/index.php?wakka=SdelajjSam/ProstojjIKBamper
Прикрепления: 3818510.jpg (65.0 Kb) · 9758028.jpg (89.2 Kb)
 
GroverДата: Понедельник, 03.03.2008, 08:27 | Сообщение # 2








Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
Мне не нравится идея использования АЦП.
А если у меня 8 датчиков по периметру робота? - схема сильно усложнится и работать будет медленнее.
Мне кажется, что TSOP лучше.


--------
GroverSuper.ucoz.net - мои странички.
 
SpaceДата: Понедельник, 03.03.2008, 08:51 | Сообщение # 3








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Ну если много тогда да. А так для 2 подойдёт. Сейчас на робофоруме попробуют с двумя тогда в принципе посмотри, а то может динаково реагировать не будут dry
 
SpaceДата: Вторник, 15.04.2008, 20:38 | Сообщение # 4








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
http://licrym.org/wiki/index.php?wakka=SdelajjSam/ProstojjIKBamper - ссылка на этот бампер
 
DZHohnДата: Вторник, 15.07.2008, 20:00 | Сообщение # 5








Зарегистрирован 12.06.2008
Группа: Новички
Сообщений: 88
Город: Серноводск
Статус: Offline
а мегу в данном случае успользуют только для бампера, или еще и двигатели можно подключить?

Я верю в пацифизм, добро должно победить
Но как мне жить!? Как мне сейчас жить!?
Так надоело ждать, так надоел страх
Спасайся сам, а это значит
Возьми кирпич и дай им сдачи!
Бери кирпич и дай им!

деньги нужны всем

 
SpaceДата: Вторник, 15.07.2008, 20:04 | Сообщение # 6








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Только для бампера
 
DoniakДата: Среда, 16.07.2008, 09:04 | Сообщение # 7








Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
Quote (Grover)
Мне не нравится идея использования АЦП.
А если у меня 8 датчиков по периметру робота? - схема сильно усложнится и работать будет медленнее.
Мне кажется, что TSOP лучше.

к меге 8 можно прицыпить 7 таких датчиков ( 6 точно ). В отличии от тсопа, АЦП можно програмно регулировать.

Quote
а мегу в данном случае успользуют только для бампера, или еще и двигатели можно подключить?

можно и двигатели подключить там много свободных ног и памяти хватает.
 
CudiДата: Пятница, 16.07.2010, 13:13 | Сообщение # 8








Язык программированя: Асамблер
Зарегистрирован 17.03.2010
Группа: Новички
Сообщений: 49
Город: Ростов-н/Д
Статус: Offline
Quote (Doniak)
можно и двигатели подключить там много свободных ног и памяти хватает.

Не советывал бы я на прямую подключать моторы на атмегу. если мощные моторы то на мегу слишком много нагрузки поидет... Я всегда стараюсь или через аналог l293 подключить или через контроллер
 
DimsanДата: Пятница, 16.07.2010, 16:17 | Сообщение # 9








Язык программированя: Си, Делфи
Зарегистрирован 18.06.2009
Группа: Опытные
Сообщений: 252
Город: Херсон
Статус: Offline
А про "на прямую" речи и не было. Ясное дело, что через драйвер.
 
CudiДата: Четверг, 05.08.2010, 19:08 | Сообщение # 10








Язык программированя: Асамблер
Зарегистрирован 17.03.2010
Группа: Новички
Сообщений: 49
Город: Ростов-н/Д
Статус: Offline
собрал, не очень понравилось*( с ТСОПом 100% лучше
 
  • Страница 1 из 1
  • 1
Поиск: