ИК бампер на микроконтроллере

Ранее в блоге я писал про идею собрать ИК бампер, вот как бы видно настало время описать то, что у меня получилось.

Как всегда путь к результату был тернист, с кучей остановок и не нужных поворотов.
За основу был взят микроконтроллер ATmega8. Суть устройства следующая:
- есть излучатель ИК сигналов, я решил его построить на транзисторе КТ315 и ИК диоде, который был подобран как раз на частотный диапазон датчика ИК сигналов TSOP1736.
- и есть приемник ИК сигналов TSOP1736.
Облучаем приемник сигналом передатчика и смотрим характеристики.

Первые попытки получить отклик на выходе TSOP1736 не дали результата. Как все оказалось проблема была в транзисторе, в самом первом эксперименте я использовал планарный n-p-n транзистор производства Phillips BC547. По паспорту он должен был выдержать ток, по сему сразу остановился на нем, потому что он был в наличии)))

После первого же запуска стало понятно что фиг что выйдет, так как транзистор BC547 непонятно почему начал греться. После еще нескольких попыток решил использовать старый добрый КТ315! И о чудо!
С криками "ХАЛЕЛЛУЙЯ" все заработало как надо.
Настройка и проверка работы устройства усложнялась еще тем, что ИК лучи не видимы для человеческого глаза, они находятся в невидимой для человека части спектра радиосигнала.

Для экспериментов был собран на скорую руку стенд:
стенд для проверки ИК бампера

Схема устройства очень простая, представлена на рисунке ниже:
Схема ИК бампера на TSOP1736

Для генерации несущей частоты в 36 кГц я решил использовать таймер, и сделать все аппаратно.

  1. //Подключаем библиотеки
  2. #include <avr/io.h> //Библиотека ввода/вывода
  3. #include <avr/interrupt.h> //Библиотека прерываний
  4.  
  5. //Перечисляем наши переменные
  6. int x, s; //Переменные
  7. #define R_division 1 //константа делителя для АЦП
  8. unsigned int u=0; //Глобальная переменная с содержимым преобразования
  9. #define nop() {asm("nop");} //Функция из ассемблера для задержки
  10.  
  11. //Перечисляем прототипы функций
  12. void delay(int t); //Функция задержки
  13. unsigned int getADC(); //Функция извлечения значения с АЦП
  14.  
  15.  
  16. //Функция задержки
  17. void delay(int t)
  18. {
  19. for (x=t; x>0 ;x--)
  20. nop ();
  21. }
  22.  
  23. //Считывание АЦП
  24. unsigned int getADC(void)
  25. {
  26. unsigned int v;
  27. ADCSRA|=(1<<ADSC); //Начать преобразование
  28. while ((ADCSRA&_BV(ADIF))==0x00); //Дождатся окончания преобразования
  29. v=(ADCL|ADCH<<8);
  30. return v;
  31. }
  32.  
  33. //Главная функция программы
  34. int main (void)
  35. {
  36. DDRB = 0b11110011; //Конфигурирование направления данных портов
  37. PORTB = 0xFE; //Присваиваем начальное значение порту
  38.  
  39. //Настройка таймера на генерацию сигнала 36кГц
  40. TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
  41. TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10);
  42. OCR1A = 111;
  43. ICR1 = 222;
  44.  
  45. //Конфигурирование АЦП микроконтроллера
  46. ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);
  47. //Включаем АЦП, тактовая частота бреобразователя =/8 от тактовой микроконтроллера
  48. ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);
  49. //Внутренний источник опорного напряжения Vref=2,56, входом АЦП является PC0
  50.  
  51. sei(); //Глобальное разрешение прерываний
  52.  
  53. //Вечный цикл
  54. while(1)
  55. {
  56. cli(); //Запрещение прерываний на время выполнения кода ниже
  57. double voltage=0; //Переменная для напряжения на входе АЦП
  58. u = getADC(); //Присваиваем переменной результат выполнения функции получения данных с АЦП
  59.  
  60. voltage= R_division*2.56*u*1.024; //Расчет напряжения
  61.  
  62. if(voltage>4) //Если напряжение выше 4Вольт
  63. {PORTB = 0x00;} //тушим порт
  64. else //Если нет
  65. /*
  66. if(voltage>2)
  67. {PORTB = 0x30;}
  68. else
  69. if(voltage>3)
  70. {PORTB = 0x70;}
  71. else*/
  72. {PORTB = 0xF0;} //Зажигаем порт
  73.  
  74. }
  75. sei(); //Разрешаем глобально прерывания
  76.  
  77. }

Для измерения интенсивности принятого излучения был использован внутренний в микроконтроллере Atmega8 АЦП(аналогово-цифровой преобразователь). При наличии сигнала на ИК приемнике TSOP1736 он передает высокий уровень на АЦП микроконтроллера и загорается светодиод подключенный к порту B микроконтроллера.

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

Видео работы устройства:

Пояснения к видео:
1. На видео я подношу руку ближе к датчику ИК лучей. ИК диод излучает ИК сигнал, который отбивается от моей руки и направляется на датчик TSOP1736, который в свою очередь регистрирует наличие сигнала. О чем говорит затухание красных светодиодов в левом верхнем углу.
2. Я подношу мышку черного цвета, чтобы показать, что ИК лучи очень плохо отражаются от черных и темных предметов. Как видно красные светодиоды не тухнут, значит приемник ИК лучей не регистрирует наличие ИК сигнала.

Скачать файлы проекта "ИК бампер на микроконтроллере"

Хм, а как вы подаете до 6

Хм, а как вы подаете до 6 вольт на ADC, если опорное напряжение всего 2.56в?

"The minimum value represents GND and the maximum value represents the voltage on the AREF pin minus 1 LSB." - из даташита.

В данном случае как я понял AREF программно соединен с внутренним источником, соответственно входное напряжение должно быть от 0 до 2.56?

leon

Правда а почему нельзя было выложить уже откомпилированный файл прошивки??? Скомпилировать то самостоятельно не каждый может. А даже если и разбираться то хз какой компилятор нужен..... Уважаемый автор выложите откомпилированную hex. Прошивку. Будем благодарны!)))

Данное устройство само по

Данное устройство само по себе никаких полезных функций не выполняет. Его хорошо использовать совместно с другими модулями описанными на сайте. Соответственно проект в AVR Studio для данного устройства выкладывается именно для того, чтобы посетитель скачал, добавил свой код или код с другого проекта с сайта и получил устройство с определенным, нужным ему функционалом. По поводу компилятора, читаем статью: Получаем hex файл прошивки

проект некомпилируется

проэкт некомпилируется - просит макефайл....
где его взять?

Попробуй скопировать все в

Попробуй скопировать все в тектостовый документ, сделать заново проект и засунь в него в чистый проект программу.
Должно работать.

а можно сделать

а можно сделать автоматическую подачу жидкого мыла
поднес руку - порция мыла выдавилась, следующая "доза" не ранее чем через 30 секунд ))
просто и практично )) особенно в общественных местах

прикольно

можно авто-кран воды сделать , поднес руки - включился, убрал -выключился ))

Можно

Легко, все реально просто надо сесть и покрутить код!

вчера гуглил на предмет

вчера гуглил на предмет кранов - хрен там, ниче не нашел. буду благодарен, если покажете где такие вентили продаются...

электроклапан

можно взять электроклапан от стиральной машинки, он там на подаче холодной воды стоит, он на 220 вольт, простой как молоток )

поставить таких 2 перед смесителем, смесителем установить нужный расход и температуру, а затем клапанами-автоматикой просто октрывать и закрывать

минусы конечно есть, расход будет менятся со временем, в зависимости от давления, и температура будет менятся

но если просто на кран с холодной водой поставить то самое то )

а не проще ли уже два движка

а не проще ли уже два движка поставить на кран?? Закрывать / открывать )))

да, можно и так, но тогда все

да, можно и так, но тогда все усложнится
надо обратную связь по углу поворота или по расходу воды

а так, да можно два двигателя с редукторами и реверсом на два крана и датчик расхода воды и температуры, и будет полностью автомат с плавной регулировкой температуры и расхода, да и таймеры всякие можно добавить ))

вроде как - контрастный душ и кнопка "авто" ))

Я если честно побаиваюсь

Я если честно побаиваюсь что-то сам делать если дело идет о напряжении 220 Вольт и воде :-)
Мало ли там что-то не так сделаю а потом когото убьет.

поищите устройство клапана,

поищите устройство клапана, поймете , что там все очень просто и надежно, 220 с водой никак не соприкасается

но все равно, как минимум, кран нужно надежно заземлить, а устройство управление и цепи на 220 вольт поставить защиту от превышения тока, хотябы предохранитель

тогда при кз на воду, на кране ничего не будет а предохранитель сгорит

ыы ну стиральные машинки же

ыы
ну стиральные машинки же работают)
вятка-автомат какая-нибудь)
а что, есть альтернатива? мудрить низковольтный электроредуктор на обычный кран?

если хочется низковольтного,

если хочется низковольтного, то имхо нужно смотреть в сторону механизмов от автомобилей

например электропривод крана отопителя салона, ну или форсунка впрыска - надежный клапан высокого давления, б/у стоят копейки

в авто все на 12 вольт, безопасно ))

+1 за идею, та же мысль была

+1 за идею, та же мысль была по поводу двигателя стеклоподъемника, мощи хоть отбавляй а напряжение мизерное.

А я бы взял один, но с

А я бы взял один, но с редуктором, вроде так грамотно делать )

опять же, бывают в свободной

опять же, бывают в свободной продаже?
про клапан от стиральной машины - интересно, спасибо)

Что мешает взять кран,

Что мешает взять кран, редуктор и двигатель, да собрать вкучу? :)
Насчет купить все готовое - однозначно будет дорого

а кран, редуктор и двигатель

а кран, редуктор и двигатель - будет колхоз))
который скорее всего и с надежностью будет хромать (поему-то кажется у самопала больше шансов, что выйдет из строя, чем у готовой инженерной продукции)

Смотря как сделать

Смотря как сделать

выход МК - PB1

когда он открывает транзистор работает как вход с подтягивающим резистором?

с питанем не совсем понятно

в одном месте земля - на ик приемнике
в другом месте, на транзисторе -5в
из этих обозначений получается, что питание двуполярное +5 и - 5 вольт, того 10 вольт
но ведь это не так :)

Спасибо, исправил

Спасибо, исправил

резистор желателен

советую поставить в базу транзистора резистор ом 300-500, иначе выгорит нога контроллера
да и транзистор BC547 похоже грелся по перегрузке базового тока(не ограничен резистором)
а кт315 дубовей, поэтому может выгореть нога мк :)

тоже не встречал трехногих аналоговых приемников

верно, ультразвук испльзуют в стандартных паркинг системах

ик видят вотоаппараты и камеры

И точно,проверил на камере

И точно,проверил на камере телефона вижу свет при нажатии кнопки на пульте ДУ)))

AVRus

не знал что ТСОП выдает аналоговый сигнал, думал строгие 0 и 1...
Подправте плиз схемку то - внесите сигнализирующие светодиоды :)
И кстати манипулирование PORTB при подключенному к нему ик-светодиоду, это разьве хорошо ?