ИК-приемник/передатчик, FLASH-I2C

Общие сведения:

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

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

Продукт в магазине

ИК-приемник/передатчик, FLASH-I2C (Роботраффик)

В магазин

Обсуждение

Гарантии и возврат. Используя сайт, Вы соглашаетесь с условиями.