Рассмотрим работу ИК в AVR на примере подключения ИК светодиодов к ATMega 16/32. Реализуем две программы: одну для приемника и одну для передатчика.
ИК-связь использует ИК (инфракрасные) волны электромагнитного спектра.
ИК-волны — это волны в диапазоне частот от 300 ГГц до 430 ТГц и имеющие длину волны в диапазоне от 700 нм до 1 мм.
Связь между пультом и телевизором является примером ИК-связи.
ИК-светодиод используется для беспроводной передачи данных в цифровом виде: 0 – светодиод выключен или 1 – светодиод включен.
Эти данные получает ИК-фотодиод или ИК-фототранзистор. ИК-фотодиод или ИК-фототранзистор дают разные значения тока в зависимости от интенсивности света.
Поскольку передаваемые данные имеют цифровую форму (светодиод горит или не горит), для декодирования этих данных можно использовать микроконтроллер.
Передаваемые данные можно модулировать, для этого существуют специальные ИК-приемники-декодеры, которые могут принимать модулированные данные.
Для получения дополнительной информации об ИК-связи см. статью ИК-порт в разделе Датчики и модули.
Давайте в качестве примера использования ИК в AVR, рассмотрим систему передачи данных на основе ИК-светодиода и ИК-приемника TSOP1738. Соединять их будем с микроконтроллером AVR ATmega16. В этом примере мы подключим клавиатуру на стороне передатчика и будем передавать нажатия кнопок. Приемник будет отображать принимаемые данные от передатчика. Схемы приемника и передатчика приведены ниже.
Схема передатчика ИК и ATmega16
- Подключите вывод последовательных данных PD1 (TXD) к базе транзистора Т1, а частоту 38кГц, генерируемую на выводе PD7, подключите к коллектору транзистора Т2.
- Транзистор Т1 действует как инвертор, а транзистор Т2 действует как переключатель. Выход транзистора Т2 представляет собой последовательную модуляцию данных на частоте 38кГц, как показано на рисунке выше.
- ИК-светодиод подключен последовательно с резистором 100 Ом к эммитеру транзистора Т2.
Схема приемника ИК и ATmega16
Пример программы передатчика ИК
В примере программы используется две библиотеки: Keypad.h и USART_RS232_H_file.h. С помощью прерывания от таймера на ножке PD7 генерируем частоту 38 кГц. Далее проверяем какая клавиша нажата и отправляем ее на приемник в инвертированном виде.
#define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "USART_RS232_H_file.h" #include "Keypad.h" char g=0; ISR(TIMER0_OVF_vect) { g = ~g; if (g!=0) PORTD |= (1<<7); if (g==0) PORTD &= ~(1<<7); TCNT0 = 0xF4; } void Timer_dalay() { TIMSK=(1<<TOIE0); TCNT0 = 0xF4; TCCR0 = (1<<CS01); } int main(void) { DDRD |= 0xFF; USART_Init(1200); sei(); Timer_dalay(); char j,d=0; while(1) { j = keyfind(); switch (j) { case ('1'): USART_TxChar('$'); USART_TxChar('1'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('2'): USART_TxChar('$'); USART_TxChar('2'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('3'): USART_TxChar('$'); USART_TxChar('3'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('4'): USART_TxChar('$'); USART_TxChar('4'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('5'): USART_TxChar('$'); USART_TxChar('5'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('6'): USART_TxChar('$'); USART_TxChar('6'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('7'): USART_TxChar('$'); USART_TxChar('7'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('8'): USART_TxChar('$'); USART_TxChar('8'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('9'): USART_TxChar('$'); USART_TxChar('9'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('0'): USART_TxChar('$'); USART_TxChar('0'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('*'): USART_TxChar('$'); USART_TxChar('*'); d = ~j; USART_TxChar(d); _delay_ms(10); break; case ('#'): USART_TxChar('$'); USART_TxChar('#'); d = ~j; USART_TxChar(d); _delay_ms(10); break; } } }
Пример программы приемника ИК
Алгоритм работы программы:
- Для работы с дисплеем используем библиотеку LCD16x2_4bit.h. Для приема данных используем библиотеку USART_Interrupt.h. Данные библиотеки приведены в исходных кодах программы внизу статьи в разделе Документация
- Прием данных осуществляется в прерывании USART.
- После получения данных, проверяем, что первый специальный символ — $, если да, то счетчик увеличивается на единицу.
- После этого, берем второй и третий байты, инвертируем и сохраняем в разных переменных.
- Далее проверяем полученные данные. Инвертируем второй символ и сравниваем с третьим, для этого используем логическую операцию ИЛИ. Если результат логической операции правильный, то отображаем полученные данные на LCD, иначе не отображаем.
#define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "USART_Interrupt.h" #include "LCD16x2_4bit.h" char check,data,invdata,count=0; ISR(USART_RXC_vect) { if(count == 0) { if (USART_RxChar() == '$') count++; else count=0; } if (count == 1) { data = USART_RxChar(); count++; } if (count == 2) { invdata = USART_RxChar(); if ((data | invdata)==0xFF) { lcd_gotoxy(0,0); lcddata(data); } count=0; } } int main(void) { lcdinit(); USART_Init(1200); lcd_clear(); sei(); while(1); }
Документация
- Даташит ATMega16
- Даташит TSOP1738
- Даташит IR LED
- Даташит BC547
- Исходный код приемника
- Исходный код передатчика
Где купить
- ATmega16 DIP-40
- ATmega16 TQFP-44
- Матричная клавиатура 4×4
- LCD16x2 Display
- LCD 16×2 I2C
- TSOP1738 Infrared Receivers
- Инфракрасный излучатель IR LED
- Набор IR приемников и излучателей
- Транзистор BC547 100 штук
- Набор транзисторов 10 видов по 20 штук