Общие сведения:
В данной статье описана информация, необходимая для работы с ИК-приёмником/передатчиком в рамках линейки «Дорожное движение». Ознакомиться с полной документацией Вы можете на нашей Wiki.
Trema модуль ИК-приёмник/передатчик, Flash-I2C позволяет передавать данные по ИК-каналу (с помощью инфракрасного света). В данном случае — получать данные от светофоров и знаков, установленных на трассе. Управление модулем ИК-приёмопередатчика осуществляется по шине I2C.
Для работы с Trema модулем ИК-приёмник/передатчик Flash-I2C предлагаем воспользоваться разработанной нами библиотекой iarduino_I2C_IR, позволяющей реализовать все возможности модуля. Подробнее про установку библиотеки читайте в нашей инструкции.
Характеристики:
- Напряжение питания: 3,3 В или 5 В, поддерживаются оба напряжения;
- Ток, потребляемый модулем: до 15 мА (при передаче данных);
- Дальность ИК-связи передатчика: от 20 см до 4 м (регулируется вручную);
- Интерфейс: I2C;
- Скорость шины I2C: 100 кбит/с;
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09);
- Уровень логической 1 на линиях шины I2C: Vcc (толерантны к 5 В);
- Рабочая температура: от -20°С до +70 °С;
- Габариты: 30 х 30 мм;
- Вес: 5 г.
Подключение:
По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09.
Перед подключением модуля к шине I2C необходимо в обязательном порядке предварительно изменить адрес модуля, после чего уже подключить его к шине.
Для установки адресов воспользуйтесь скетчем из меню Arduino IDE:
Файл / Примеры / iarduino I2C IR (модуль ИК-приёмник/передатчик) / NewAddress
Модуль подключается к плате-основе машинки следующим образом:

Если же Вы хотите подключить модуль отдельно к контроллеру, то можете сделать это напрямую или с помощью Trema Shield (рисунки ниже).
Модуль подключается по шине I2C, все выводы которой (GND, Vcc, SDA, SCL) размещены на одной колодке модуля.
- SCL — вход/выход линии тактирования шины I2C;
- SDA — вход/выход линии данных шины I2C;
- Vcc — вход питания 3,3 или 5 В;
- GND — общий вывод питания.

Питание:
Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания) подаётся на выводы Vcc и GND.
Получение данных от модулей линейки «Дорожное движение»
Пример выводит номер знака, команду встречного автомобиля или разрешённые светофором направления при обнаружении данных от соответствующих модулей линейки «дорожное движение». Дополнительно в примере реализована постоянная отправка данных как от автомобиля трассы для информирования других автомобилей о своём присутствии.
#include <iarduino_I2C_IR.h> // Подключаем библиотеку для работы с Trema модулями ИК-приёмник/передатчик I2C-flash
iarduino_I2C_IR ir(0x09); // Объявляем объект ir для работы с функциями и методами библиотеки iarduino_I2C_IR, указывая адрес модуля на шине I2C
// Если объявить объект без указания адреса (iarduino_I2C_IR ir;), то адрес будет найден автоматически
void setup(){ //
Serial.begin(9600); // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек
ir.begin(); // Инициируем работу с ИК-приёмником/передатчиком I2C-flash
ir.setProtocol(IR_IARDUINO); // Указываем протокол для приёма/передачи данных по ИК-каналу
// Отправляем данные другим автомобилям: //
// ir.setInterval_TX(200, true); // Указываем модулю использовать интервал между пакетами передаваемых данных в 200 мс, разрешая менять его при передаче в пределах ±50 %
// ir.autoSend(MODUL_CAR, 10); // Указываем модулю постоянно отправлять данные с адресом MODUL_CAR и командой 10, пока не будет вызван метод ir.autoStop()
} // В качестве команды автомобиля (вместо 10) можно указывать любое число от 0 до 255
void loop(){
// Если приняты данные:
if( ir.check(true) ){
// Если данные приняты от автомобиля:
if( ir.device==MODUL_CAR ){
Serial.print("Автомобиль: принята команда ");
Serial.print(ir.command); // Выводим номер команды.
Serial.println(".");
}
// Если данные приняты от дорожного знака:
if( ir.device==MODUL_SIGN ){
Serial.print("Дорожный знак: ");
Serial.print(ir.sign_str); // Выводим строку с номером знака.
if( ir.sign_tab ){
Serial.print(", под знаком есть табличка - ");
if( ir.sign_tab==SIGN_CAR_TRUCK ){ Serial.print("грузовые автомобили"); }
if( ir.sign_tab==SIGN_CAR_LIGHT ){ Serial.print("легковые автомобили"); }
if( ir.sign_tab==SIGN_DISTANCE_050 ){ Serial.print("50 метров"); }
if( ir.sign_tab==SIGN_DISTANCE_100 ){ Serial.print("100 метров"); }
if( ir.sign_tab==SIGN_DISTANCE_150 ){ Serial.print("150 метров"); }
if( ir.sign_tab==SIGN_DISTANCE_200 ){ Serial.print("200 метров"); }
if( ir.sign_tab==SIGN_DISTANCE_250 ){ Serial.print("250 метров"); }
}
Serial.println(".");
}
// Если данные приняты от светофора:
if( ir.device==MODUL_TLIGHT ){
Serial.print("Светофор: регулирует перекрёсток c движением ");
if( ir.track_L ){ Serial.print("налево, " ); }
if( ir.track_R ){ Serial.print("направо, " ); }
if( ir.track_F ){ Serial.print("прямо, " ); }
Serial.print("сейчас сигналы светофора указывают");
Serial.print(": прямо ");
switch(ir.forvard){
case 0: Serial.print("нельзя" ); break;
case 1: Serial.print("можно" ); break;
case 2: Serial.print("можно, если нет помех"); break;
}
Serial.print(", направо ");
switch(ir.right){
case 0: Serial.print("нельзя" ); break;
case 1: Serial.print("можно" ); break;
case 2: Serial.print("можно, если нет помех"); break;
}
Serial.print(", налево ");
switch(ir.left){
case 0: Serial.print("нельзя" ); break;
case 1: Serial.print("можно" ); break;
case 2: Serial.print("можно, если нет помех"); break;
}
Serial.println(".");
}
}
}
В коде Setup() данного скетча происходит инициализация модуля и указание протокола приёма/передачи данных. Библиотека поддерживает 9 ИК-протоколов: IR_NEC, IR_SAMSUNG, IR_SHARP, IR_SIRC12, IR_SIRC15, IR_RC5, IR_RC5X, IR_RC6 и IR_IARDUINO.
Далее следуют две закомментированные строки. Если их раскомментировать, то автомобиль будет постоянно передавать адрес команду десяти другим автомобилям.
Обращением к функции setInterval_TX() настраивается интервал между отправляемыми ИК-пакетами, а обращением к функции autoSend() отправляются данные (адрес MODUL_CAR и команда 10). Так как в примере нет функции autoStop(), то данные будут отправляться модулем постоянно. Допускается менять отправляемые данные новыми обращениями к функции autoSend() без вызова функции autoStop().
В качестве команд, отправляемых автомобилями, можно указывать значения от 0 до 255. Вы сами можете придумать, какая команда что значит («внимание», «уступи дорогу», «остановись», «уступаю дорогу», «поворачиваю влево», «еду прямо», «еду быстро», «еду медленно» и т.д.).
В коде loop() постоянно выполняется проверка получения данных по ИК-каналу if( ir.check(true) ). Если данные получены, то выполняются проверки: не отправлены ли эти данные автомобилем if( ir.device==MODUL_CAR ), не отправлены ли эти данные модулем «дорожный знак» if( ir.device==MODUL_SIGN ), не отправлены ли эти данные модулем «светофор» if( ir.device==MODUL_TLIGHT ). Если пройдена любая из указанных проверок, то выводятся соответствующие данные:
Автомобиль: принята команда 10 Дорожный знак: 2.4, под знаком есть табличка — грузовые автомобили Светофор: регулирует перекрёсток c движением направо, прямо. Сейчас сигналы светофора указывают: прямо нельзя, направо можно, налево нельзя.
Переменные ir.forvard, ir.right и ir.left, разрешающие движение на светофоре, могут принимать значения: 0 — движение запрещено, 1 — движение разрешено, или 2 — можно, если нет помех. Последнее означает, что светофор «сломан» (постоянно мигает жёлтый) или разрешается поворот налево по основному зелёному сигналу светофора, у которого нет секции поворота налево.
Обсуждение