Общие сведения:
В данной статье описана информация, необходимая для работы с ИК-приёмником/передатчиком в рамках линейки «Дорожное движение». Ознакомиться с полной документацией Вы можете на нашей 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
— можно, если нет помех. Последнее означает, что светофор «сломан» (постоянно мигает жёлтый) или разрешается поворот налево по основному зелёному сигналу светофора, у которого нет секции поворота налево.
Обсуждение