инфракрасный детектор препятствия

инфракрасный детектор препятствия

Сообщение slav0n » 12 мар 2013, 11:34

Поступило предложение сочинить датчик пресечения ИК луча.
Вкратце смысл ТЗ.
Устройство излучает сигнал ИК-светодиодом и принимает этот сигнал приемником типа TSOPxx.
Наличие или отсутствие приема вызывает переключение логического уровня на выходе устройсва.
Реагирует только на свой сигнал. Сигналы от других источников не воспринимаются.

Можно применять:
в общем - как детектор при пересечении луча каким-либо препятствием, либо при отражении луча от препятствия.
в частности:
в охранных системах, в качестве датчика приближения,присутствия. Автоматическое включение,отключение света. И других системах, где необходим дистанционный контроль.

Немного погуглив эту тему, было найдено пару проектов некоего подобного. Но реализованы они как-то коряво. Передается не пойми-что, и принимается не пойми-как. Один даже додумался при помощи АЦП !!! измерять уровень сигнала с TSOPа.
В общем решил написать своё, правильное.
В итоге получился вот такой код

Код: Выделить всё
/****************************************************
made slav0n

Chip type           : ATtiny13
9.6 MHz
фузы  заводские, только снять галку CKDIV8
;Hfuse FF
;Lfuse 7A
****************************************************/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>     /* for _delay_ms() */
//#include "m8_128.h"


#define out_36kHz   PB1
#define swch_36_38    PB4
#define out_1      PB0
#define out_2      PB2
#define TSOP      PB3


#define SimbInPaket      15   //определяем длину пакета
#define PeriodPaket      64   //определяем период пакета
#define MaxErrPaket      0   //определяем ко-во допустимых ошибок


volatile unsigned char flg_err;

ISR(SIG_OUTPUT_COMPARE0B)
{
   static unsigned char timer_strob;
   static unsigned char timer_paket;
   static unsigned char cnt_err_paket;
   
   timer_strob++;

   if(timer_strob==66)//середина пачки
   {   
      if(timer_paket < SimbInPaket)      //находимся-ли в теле пакета?
      {
         //проверяем принял-ли TSOP сигнал и считаем ошибки в пакете
         if(PINB&(1<<TSOP) && TCCR0A&(1<<COM0B0))cnt_err_paket++;
         
         TCCR0A ^= (1<<COM0B0);         //изменяем сигнал на противоположный
      }
   }
   else
   if(timer_strob==66+66)               //достигли конца периода пачки
   {
      timer_strob =0;                  //обнуляем счетчик импульсов
      
      timer_paket++;
      if(timer_paket == PeriodPaket+1)   //достигли конца периода пакета
      {
         timer_paket =0;               //обнуляем счетчик периода пакета
         
         if(cnt_err_paket > MaxErrPaket)flg_err =1;//были-ли ошибки в пакете?
         else                     flg_err =0;
         
         cnt_err_paket =0;            //сбрасываем счетчик ошибок в пакете
      }
      
      if(timer_paket < SimbInPaket)      //находимся-ли в теле пакета?
      {   
         //конфигурация Галуа, рандомгенератор
         static unsigned char Q = 1;
         Q = (Q>>1) ^ (Q&1 ? 0b11010111 : 0);
         if(Q&1)TCCR0A |= (1<<COM0B0);   //передача единцы
         else   TCCR0A &=~(1<<COM0B0);   //передача нуля
      }
      else   TCCR0A &=~(1<<COM0B0);      //откл выход если пауза периода пакета
   }   
}

//============================================================

int __attribute__((naked)) main(void)
{
   PORTB    = (1<<swch_36_38)|(1<<TSOP);//подтяжка
   DDRB    = (1<<out_36kHz)|(1<<out_1)|(1<<out_2);//выходы

   TCCR0A   = (1<<COM0B0)|(1<<WGM01);   //на выходе меандр. сброс при совпадении
   TCCR0B   = 1;   //предделитель 1, запуск таймера
   //TCCR0B   = 0;   //стоп таймер
   
   TIMSK0 = (1<<OCIE0B);//разрешаем прерывание по совпадению В
   
   if(PINB & (1<<swch_36_38))OCR0A = 124; //38khz
   else                 OCR0A   = 131;    //36khz
   
   sei();

   while(1)
   {      
      if(flg_err)
      {
         PORTB |=(1<<out_1);
         PORTB &=~(1<<out_2);
         
         //длительность импульса сигнала ошибки
         //если не надо удлинять то закомментировать
         _delay_ms(500);      
      }
      else
      {
         PORTB &=~(1<<out_1);
         PORTB |=(1<<out_2);
      }
   }
}

main.zip
итоговая прошивка устройства
(511 байт) Скачиваний: 73


##############################################################################

Ну, а теперь посмотрим весь процесс создания сего устройства сначала:

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

фузы заводские, только снять галку CKDIV8
;Hfuse FF
;Lfuse 7A

Код: Выделить всё
/*
Chip type           : ATtiny13

9.6 MHz

фузы  заводские, только снять галку CKDIV8

;Hfuse FF
;Lfuse 7A
****************************************************/


#include <avr/io.h>
//#include <util/delay.h>     /* for _delay_ms() */

#include "m8_128.h"


#define out_36kHz   PB1
#define swch_36_38    PB4
#define out_1      PB0
#define out_2      PB2
#define TSOP      PB3

//============================================================

int __attribute__((naked)) main(void)
{

   PORTB    = (1<<swch_36_38);
   DDRB    = (1<<out_36kHz)|(1<<out_1)|(1<<out_2);

   TCCR0A   = (1<<COM0B0)|(1<<WGM01); //на выходе меандр. сброс при совпадении
   TCCR0B   = 1;   //предделитель на 1, запуск таймера
   //TCCR0B   = 0;   //стоп таймер


   while(1)
   {   
      if(PINB & (1<<swch_36_38))OCR0A = 125; //38khz
      else                 OCR0A   = 132;    //36khz
      
      if(PINB & (1<<TSOP)){PORTB |=(1<<out_1);PORTB &=~(1<<out_2);}
      else            {PORTB |=(1<<out_2);PORTB &=~(1<<out_1);}
   }
}
Вложения
tsop_radar.GIF
main.zip
(256 байт) Скачиваний: 69
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 12 мар 2013, 14:09

Спасиб,ток приехал с рынка ..прощью отпишусь
Вложения
1a.jpg
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

Сообщение slav0n » 12 мар 2013, 15:16

вижу частоты 377144 и 357727

вот чуть добавил
Вложения
main.zip
(255 байт) Скачиваний: 42
1a.jpg
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 12 мар 2013, 15:46

Думаю в пределах нормы?
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

Сообщение slav0n » 12 мар 2013, 16:21

Speys писал(а):в пределах нормы?

точнее не получится.
или то, или сё
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 12 мар 2013, 17:45

Выход приемника
Вложения
3.jpg
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

Сообщение slav0n » 12 мар 2013, 18:11

это что, получается на выходе тсопа импульс 300 мкс?
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 12 мар 2013, 18:19

Выходит так..циклично.
Вложения
TSOP4836.pdf
(121.75 Кб) Скачиваний: 57
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

Сообщение slav0n » 12 мар 2013, 18:26

читаю про TSOP
пишут
1) минимальное количество импульсов в пачке - 15
2) максимальное количество импульсов в пачке - 50
3) минимальное время между пачками - 15*T
4) частота импульсов в пачке должна соответствовать основной частоте TSOP-приёмника
5) светодиод должен быть с длиной волны = 950 nm.
"T" - период "основной" частоты TSOP-приёмника.

получается что тупо одна несущаяя не катит.
надо по-любому как-то кодировать
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение slav0n » 12 мар 2013, 19:19

в общем привязка идет к ко-ву имп. несущей, значит бум это использовать
Сделаю счетчики импульсов по прерыванию таймера, и поглядим...
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 12 мар 2013, 20:16

Тут тебе виднее..Посмотри вроде как у нас принцип.Может приемник другой.
Вложения
222.rar
(804.68 Кб) Скачиваний: 68
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

Сообщение slav0n » 13 мар 2013, 06:45

что-то не пойму я...

минимальное количество импульсов в пачке - 15. умножаем на период
15 * 27мкс = 405 мкс
тоже самое делаем для максимальное количество импульсов в пачке - 50
50 * 27мкс = 1350 мкс

Почему на выходе ТСОПа у тебя импульс всего 300мкс?
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение slav0n » 13 мар 2013, 07:13

вот нашел http://www.electrosad.ru/Electronics/IR.htm
работает только в пакетном режиме при tпакета/T<0,4.

интересная картинка
чувствительность зависит от скважности пакета
Вложения
qq.gif
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение slav0n » 13 мар 2013, 11:32

вот прошивка
выдает пачки импульсов
20 имп - пауза 30 периодов - 20 имп - пауза 30 - и тд.
Покажи два канала: выход ТСОП и выход на светодиод.
Нужно посмотреть задержку срабатывания.
Вложения
main.zip
(332 байт) Скачиваний: 45
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 13 мар 2013, 13:45

Выглядит так.С право выход ТСОП
Вложения
3.jpg
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

Сообщение slav0n » 13 мар 2013, 14:55

у тебя же двухканальный осцилл.
сделай два сигнала оновременно
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение slav0n » 13 мар 2013, 15:23

хотя уже кое-что вырисовывается
Имеем задержку сработки примерно 400мкс и всё тот же странный импульс 300мкс.
Было бы неплохо попробовать разные ТСОПы.
Вложения
tt.jpg
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 13 мар 2013, 19:12

Луча два,рук не хватает.Щупы держать,нажать на осциле сохранить.
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

Сообщение slav0n » 14 мар 2013, 11:25

вот прошивка с таймингами пачки по стандарту RC-5

ИзображениеИзображение
вот так выглядит
пачка
strob.gif

пакет-15пачек
15str.gif

пакеты
paket.gif
Вложения
main.zip
(383 байт) Скачиваний: 40
while(1||!1);
зберігай спокій
slav0n
Site Admin
 
Сообщения: 4977
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 35 раз.
Поблагодарили: 449 раз.

Сообщение Speys » 14 мар 2013, 11:46

вот картинка
Вложения
1a.jpg
Аватара пользователя
Speys
супермодератор
 
Сообщения: 877
Зарегистрирован: 18 ноя 2009, 02:31
Благодарил (а): 20 раз.
Поблагодарили: 25 раз.

След.

Вернуться в Самодельные электронные устройства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2