Автор Тема: инфракрасный детектор препятствия  (Прочитано 5926 раз)

0 Пользователей и 1 Гость просматривают эту тему.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
Поступило предложение сочинить датчик пресечения ИК луча.
Вкратце смысл ТЗ.
Устройство излучает сигнал ИК-светодиодом и принимает этот сигнал приемником типа 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);
}
}
}


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

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

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

фузы  заводские, только снять галку 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);}
}
}
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 941
(Нет темы)
« Ответ #1 : 12 Март 2013, 13:09:08 »
Спасиб,ток приехал с рынка ..прощью отпишусь

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #2 : 12 Март 2013, 14:16:03 »
вижу частоты 377144 и 357727

вот чуть добавил
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 941
(Нет темы)
« Ответ #3 : 12 Март 2013, 14:46:22 »
Думаю в пределах нормы?

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #4 : 12 Март 2013, 15:21:56 »
Цитата: "Speys"
в пределах нормы?
точнее не получится.
или то, или сё
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 941
(Нет темы)
« Ответ #5 : 12 Март 2013, 16:45:05 »
Выход приемника

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #6 : 12 Март 2013, 17:11:09 »
это что, получается на выходе тсопа импульс 300 мкс?
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 941
(Нет темы)
« Ответ #7 : 12 Март 2013, 17:19:46 »
Выходит так..циклично.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #8 : 12 Март 2013, 17:26:35 »
читаю про TSOP
пишут
Цитировать
1) минимальное количество импульсов в пачке - 15
2) максимальное количество импульсов в пачке - 50
3) минимальное время между пачками - 15*T
4) частота импульсов в пачке должна соответствовать основной частоте TSOP-приёмника
5) светодиод должен быть с длиной волны = 950 nm.
"T" - период "основной" частоты TSOP-приёмника.
получается что тупо одна несущаяя не катит.
надо по-любому как-то кодировать
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #9 : 12 Март 2013, 18:19:24 »
в общем привязка идет к ко-ву имп. несущей, значит бум это использовать
Сделаю счетчики импульсов по прерыванию таймера, и поглядим...
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 941
(Нет темы)
« Ответ #10 : 12 Март 2013, 19:16:43 »
Тут тебе виднее..Посмотри вроде как у нас принцип.Может приемник другой.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #11 : 13 Март 2013, 05:45:24 »
что-то не пойму я...

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

Почему на выходе ТСОПа у тебя импульс всего 300мкс?
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #12 : 13 Март 2013, 06:13:16 »
вот нашел http://www.electrosad.ru/Electronics/IR.htm
Цитировать
работает только в пакетном режиме при tпакета/T<0,4.
интересная картинка
чувствительность зависит от скважности пакета
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4773
(Нет темы)
« Ответ #13 : 13 Март 2013, 10:32:32 »
вот прошивка
 выдает пачки импульсов
20 имп - пауза 30 периодов - 20 имп - пауза 30 - и тд.
Покажи два канала: выход ТСОП и выход на светодиод.
Нужно посмотреть задержку срабатывания.
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 941
(Нет темы)
« Ответ #14 : 13 Март 2013, 12:45:22 »
Выглядит так.С право выход ТСОП