Общие сведения:
Модуль светофор из линейки «Дорожное движение» - состоит из светофора (три основных секции со светодиодами и две боковые), основания и крестовины. На плате основания расположен ИК-светодиод, с помощью которого модуль способен передавать информацию о своём состоянии, на расстоянии, по ИК-каналу. Дальность передачи данных по ИК-каналу можно регулировать подстроечным резистором, расположенным с обратной стороны платы основания. Дополнительно к светофору можно установить шлагбаум.
Модуль способен работать как под управлением по шине I2С, так и автономно, при подключении батарейного отсека. Принимать передаваемые модулем данные можно при помощи модуля ИК-приемник/передатчик, FLASH-I2C.
Видео:
Редактируется...
Спецификация:
- Напряжение питания: 3,3 В или 5 В, поддерживаются оба напряжения.
- Питание от батарейного отсека: 3,3...4,2 В.
- Ток потребляемый модулем: до 400 мА (при управлении шлагбаумом).
- Дальность ИК-связи: от 20 см до 4 м (регулируется вручную).
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: Vcc (толерантны к 5 В).
- Рабочая температура: от -20 до +70 °С.
- Габариты светофора: 33 x 100 мм. (без секций разрешающих поворот).
- Габариты одной секции разрешающей поворот: 33 x 24 мм.
- Габариты основания: 24 х 66 мм.
- Габариты крестовины: 71 х 71 x 12 мм.
- Вес: 35 г (без шлагбаума).
- Габариты крепления шлагбаума: 35 x 74 мм.
- Габариты шлагбаума: 216 x 15 мм. + знак ø36 мм.
- Длина шлагбаума от оси вращения: 200 мм.
- Вес модуля шлагбаум для светофора: 25 г.
Подключение:
Модуль подключается к аппаратной или программной шине I2C Arduino.
Для удобства подключения, предлагаем воспользоваться TremaShield.
Модуль удобно подключать 2 способами, в зависимости от ситуации:
Способ - 1: Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.
Способ - 2: Используя проводной шлейф и Shield
Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
Способ - 3: Подключение к программной шине I2C
При использовании программной шины I2C, модуль можно подключить к любым выводам Arduino, но потребуется дополнительно установить библиотеку iarduino_I2C_Software.h, для создания программной шины I2C, указав номера выбранных вами выводов. О том как это сделать читайте ниже в разделе «Подключение библиотеки», а так же на странице Wiki - Расширенные возможности библиотек iarduino для шины I2C.
Питание:
Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания), подаётся на выводы Vcc и GND.
Светофор может работать в автономном режиме, для чего удобно использовать батарейный отсек, устанавливаемый на плате основания.
Подробнее о модуле:
Модуль построен на базе, микроконтроллера STM32F030F4, снабжён ИК-светодиодом, светодиодом информирующем о передаче данных, регулятором дальности ИК-связи, транзисторными сборками Дарлингтона (для управления светодиодами светофора и зуммером шлагбаума), и снабжён собственным стабилизатором напряжения. В верхней части платы основания имеется двухрядная колодка для подключения секций светофора или дорожных знаков, а в нижней части платы расположена колодка шины I2C.
Модуль способен передавать данные по ИК-каналу используя протоколы: NEC, SAMSUNG, SHARP, SIRC12, SIRC15, RC5, RC5X, RC6 и IARDUINO. Все перечисленные протоколы используют пакетную передачу данных, данные в пакете представлены в виде адреса ИК-устройства (не путать с адресом устройства на шине I2C) и команды для него. Принимать данные отправленные по ИК-каналу можно при помощи модуля ИК-приемник/передатчик, FLASH-I2C, который поддерживает все перечисленные выше протоколы.
Модуль светофор позволяет:
- Менять свой адрес на шине I2C.
- Управлять внутренней подтяжкой линий шины I2C (по умолчанию включена).
- Узнать версию прошивки модуля.
- Однократно отправить данные о текущем состоянии светофора по ИК-каналу.
- Отслеживать момент завершения отправки данных по ИК-каналу.
- Работать в режиме постоянной отправки данных по ИК-каналу с заданным интервалом. По умолчанию модуль меняет интервал между отправкой данных в диапазоне ±50% от заданного, что позволяет устанавливать несколько модулей передающих данные по ИК-каналу, в одном направлении, одновременно.
- Выбрать один из 9 доступных протоколов для передачи данных по ИК-каналу.
- Разрешать/запрещать работу светодиода информирующего о передаче данных по ИК-каналу.
- Работать в автоматическом режиме, светофор самостоятельно переключается.
- Менять состояние цветов и шлагбаума в ручном и полуавтоматическом режиме.
- Работать в автономном режиме, без подключения к шине I2C.
- Задавать скорость работы шлагбаума и позиции его крайних положений.
Для работы с модулем светофор, предлагаем воспользоваться разработанной нами библиотекой iarduino_I2C_Track позволяющей реализовать все возможности модуля.
Подробнее про установку библиотеки читайте в нашей инструкции.
Смена адреса модуля на шине I2C:
По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09. Если вы планируете подключать более 1 модуля на шину I2C, необходимо изменить адреса модулей таким образом, чтобы каждый из них был уникальным. Более подробно о том, как изменить адрес, а также о многом другом, что касается работы FLASH-I2C модулей, вы можете прочесть в этой статье.
В первой строке скетча необходимо записать в переменную newAddress адрес, который будет присвоен модулю. После этого подключите модуль к контроллеру и загрузите скетч. Адрес может быть от 0х07 до 0х7F.
uint8_t newAddress = 0x09; // Назначаемый модулю адрес (0x07 < адрес < 0x7F). // #include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Track. #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулями трассы I2C-flash. iarduino_I2C_Track tlight; // Создаём объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track. // Если при объявлении объекта указать адрес, например, iarduino_I2C_Track tlight(0xBB), то пример будет работать с тем модулем, адрес которого был указан. void setup(){ // Serial.begin(9600); // if( tlight.begin(&Wire) ){ // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). Serial.print("Найден модуль 0x"); // Serial.println( tlight.getAddress(), HEX ); // Выводим текущий адрес модуля. if( tlight.changeAddress(newAddress) ){ // Меняем адрес модуля на newAddress. Serial.print("Адрес изменён на 0x"); // Serial.println(tlight.getAddress(),HEX); // Выводим текущий адрес модуля. }else{ // Serial.println("Адрес не изменён!"); // } // }else{ // Serial.println("Модуль не найден!"); // } // } // // void loop(){} //
Данный пример использует библиотеку iarduino_I2C_Track, которая работает только с модулями трассы, а значит позволяет менять только их адреса.
Смена и сортировка адресов на шине I2C:
Изменить адрес любого I2C модуля серии «Flash» можно аппаратно, используя установщик адресов FLASH-I2C. Это модуль подключаемый к шине I2C, на плате которого размещён дисплей и кнопки управления, при помощи которых можно узнать количество любых устройств на шине I2C, и менять адреса модулей Flash-I2C не отключая их от шины, что значительно сократит время сборки ваших проектов. Модуль оснащён разъемом USB через который можно запитать как сам модуль, так и шину I2C, или можно запитать шину I2C без использования разъема USB на плате модуля. Установщик адресов пригодиться в проектах с большим количеством модулей Flash-I2C.
Изменить адрес любого I2C модуля серии «Flash» можно программно, о том как это сделать рассказано в статье Wiki - Программная установка адресов модулей FLASH-I2C. В этой статье рассмотрены примеры с использованием библиотеки iarduino_I2C_Address, которая позволяет получать адреса любых устройств на шине I2C, менять адреса модулей Flash-I2C не отключая их от шины, получать название, номер модели, версию прошивки модулей Flash-I2C, а главное - автоматически сортировать адреса модулей Flash-I2C даже если на шине есть устройства с одинаковыми адресами.
Примеры:
В данном разделе раскрыты примеры управления модулем светофор с использованием библиотеки iarduino_I2C_Track. Сама библиотека содержит больше примеров, доступных из меню Arduino IDE: Файл / Примеры / iarduino_I2C_Track.
Отправка информации о состоянии светофора по ИК-каналу:
Пример отправляет информацию о состоянии светофора по ИК-каналу каждые 200 мс.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Track. #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулями трассы I2C-flash. iarduino_I2C_Track tlight(0x09); // Создаём объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_Track tlight;), то адрес будет найден автоматически. void setup(){ // tlight.begin(&Wire, MODUL_TLIGHT_AUTO, TRACK_F ); // Инициируем работу по аппаратной шине I2C, с автоматическим светофором без секций поворотов, дорога только прямо. // tlight.begin(&Wire, MODUL_TLIGHT_AUTO, TRACK_LRF, SECTION_LR ); // Инициируем работу по аппаратной шине I2C, с автоматическим светофором с двумя секциями поворотов, дорога прямо, налево и направо. // tlight.begin(&Wire, MODUL_TLIGHT , TRACK_FR, ); // Инициируем работу по аппаратной шине I2C, со светофором без секций поворотов, дорога прямо и направо. // tlight.begin(&Wire, MODUL_TLIGHT , TRACK_LR, SECTION_L ); // Инициируем работу по аппаратной шине I2C, со светофором с секцией поворота влево, дорога налево и направо. tlight.timing(5, 3, 10); // Указываем время свечения зелёного (5сек), жёлтого или мигающего зелёного (3сек) и красного (10сек) цветов для автоматического светофора. tlight.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tlight.indicator(true); // Разрешаем работу светодиода информирующего об отправке данных. } // // void loop(){ // tlight.irSend(); // Выполняем отправку одного пакета данных по ИК-каналу. В одном пакете есть вся информация о состоянии светофора. // tlight.irWait(); // Ждём завершения отправки пакета данных по ИК-каналу. Отправка одного пакета данных в кодировке IARDUINO занимает 26,5 мс. delay(200); // Ждём 200 мс. } //
В коде Setup()
данного скетча можно оставить только функцию begin()
, так как параметры определяемые остальными функциями хранятся в памяти модуля и загружаются автоматически.
Функция begin()
, для светофоров, вызывается с параметром MODUL_TLIGHT_AUTO
или MODUL_TLIGHT
, в первом случае светофор будет самостоятельно переключать цвета. Вторым параметром функции указывается тип регулируемого перекрёстка TRACK_LRF
, где последние буквы указывают на наличие L
-поворота влево, R
-поворота вправо, F
-движения прямо. Третьим параметром указывается наличие дополнительных секций у светофора SECTION_LRG
, где последние буквы указывают на наличие L
-секции левого поворота, R
-секции правого поворота, G
-шлагбаума.
В коде loop()
постоянно выполняются функции irSend()
и delay(200)
. Первая отправляет один пакет данных по ИК-каналу, а вторая приостанавливает выполнение скетча на 200мс. Отправка одного пакета по ИК-каналу, в кодировке IR_IARDUINO
, занимает 26,5мс.
Функция irSend()
указывает модулю отправить данные по ИК-каналу, но не ждёт их отправки. Значит пакет будет полностью отправлен по ИК-каналу только через 26,5мс после того как скетч уже начал выполнять функцию delay(200)
. Значит пауза между пакетами данных отправляемых по ИК-каналу составит 200-26,5=173,5мс.
Если раскомментировать строку с функцией irWait()
, то пауза между ИК-пакетами станет равна паузе указанной в качестве параметра функции delay()
, так как функция irWait()
приостановит скетч на время отправки пакета по ИК-каналу. Стоит отметить что время отправки пакета по ИК-каналу зависит от используемого протокола, а для некоторых протоколов время отправки пакета зависит от данных передаваемых по ИК-каналу.
Данные передаваемые светофором по ИК-каналу включают не только его текущее состояние, но и указанный при инициализации тип перекрёстка (доступные направления движения) и наличие секций поворотов. Это позволяет автомобилям трассы выбрать дальнейшее направление и остановиться перед светофором в ожидании разрешающего сигнала.
Постоянная отправка информации о состоянии светофора по ИК-каналу:
Пример отправляет информацию о состоянии светофора по ИК-каналу не используя ресурсы микроконтроллера.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Track. #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулями трассы I2C-flash. iarduino_I2C_Track tlight(0x09); // Создаём объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_Track tlight;), то адрес будет найден автоматически. void setup(){ // tlight.begin(&Wire, MODUL_TLIGHT_AUTO, TRACK_F ); // Инициируем работу по аппаратной шине I2C, с автоматическим светофором без секций поворотов, дорога только прямо. // tlight.begin(&Wire, MODUL_TLIGHT_AUTO, TRACK_LRF, SECTION_LR ); // Инициируем работу по аппаратной шине I2C, с автоматическим светофором с двумя секциями поворотов, дорога прямо, налево и направо. // tlight.begin(&Wire, MODUL_TLIGHT , TRACK_FR, ); // Инициируем работу по аппаратной шине I2C, со светофором без секций поворотов, дорога прямо и направо. // tlight.begin(&Wire, MODUL_TLIGHT , TRACK_LR, SECTION_L ); // Инициируем работу по аппаратной шине I2C, со светофором с секцией поворота влево, дорога налево и направо. tlight.timing(5, 3, 10); // Указываем время свечения зелёного (5сек), жёлтого или мигающего зелёного (3сек) и красного (10сек) цветов для автоматического светофора. tlight.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tlight.indicator(true); // Разрешаем работу светодиода информирующего об отправке данных. tlight.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами определённой ИК протоколом по умолчанию ±50%. // tlight.irAutoSend(100); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами в 100 мс ±50%. // tlight.offline(true); // Указываем модулю сохранить все полученные настройки в энергонезависимую память и работать в автономном режиме. } // Отключить автономный режим можно функцией offline() с параметром false. // void loop(){} //
Данный пример отличается от предыдущего тем, что для отправки данных используется функция автоматический отправки данных по ИК-каналу irAutoSend()
вместо функции однократной отправки irSend()
. Остановить автоматическую отправку данных можно при помощи функции irStop()
.
Функция irAutoSend()
указывает модулю начать постоянную отправку пакетов данных с информацией о состоянии светофора. Если в качестве параметра указать число от 15 до 255 мс, то средняя пауза между отправляемыми по ИК-каналу пакетами будет равна указанному числу миллисекунд. Реальная пауза между отправляемыми пакетами устанавливается хаотично в диапазоне ±50% от указанного числа, что позволяет поставить несколько модулей в одном направлении.
Если раскомментировать строку с функцией offline(true)
, то скетч можно запустить однократно. Модуль запомнит полученные настройки, сохранив их в энергонезависимую память. После этого модуль будет работать автономно (сразу после подачи питания), даже если он не подключён к шине I2C, так, как будто он вновь получил все команды кода Setup()
. Для работы в автономном режиме удобно использовать батарейный отсек подключаемый к основанию светофора. Для отключения автономного режима достаточно однократного обращения к функции offline(false)
.
Управление светофором в ручном режиме:
Пример управляет каждой секцией светофора в коде loop()
, а в коде setup()
светофору указано автоматически отправлять информацию о своём состоянии по ИК-каналу.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Track. #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулями трассы I2C-flash. iarduino_I2C_Track tlight(0x09); // Создаём объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_Track tlight;), то адрес будет найден автоматически. void setup(){ // tlight.begin(&Wire, MODUL_TLIGHT, TRACK_LFR, SECTION_LR ); // Инициируем работу по аппаратной шине I2C, со светофором с секциями поворота влево и вправо, на перекрёстке есть дорога прямо, налево и направо. tlight.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tlight.indicator(true); // Разрешаем работу светодиода информирующего об отправке данных. tlight.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами определённой ИК протоколом по умолчанию ±50%. // tlight.irAutoSend(100); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами в 100 мс ±50%. tlight.set(TL_ALL, false); // Отключаем все секции светофора. } // // void loop(){ // tlight.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0); delay(5000); // Включаем зелёный, отключаем желтый и красный (горит только зелёный). tlight.set(TL_RIGHT,1); delay(5000); // Включаем стрелку направо (горит зелёный и стрелка направо). tlight.set(TL_GREEN,2, TL_RIGHT,2); delay(5000); // Указываем мигать зелёным и стрелкой направо (мигают зелёный и стрелка направо). tlight.set(TL_GREEN,0, TL_RIGHT,0, TL_YELLOW,1); delay(5000); // Отключаем зелёный и стрелку направо, включаем жёлтый (горит только жёлтый). tlight.set(TL_YELLOW,0, TL_RED,1, TL_LEFT,1); delay(5000); // Отключаем жёлтый, включаем красный и стрелку налево (горит красный и стрелка налево). tlight.set(TL_LEFT,2); delay(5000); // Указываем мигать стрелкой налево (горит красный и мигает стрелка налево). tlight.set(TL_LEFT,0, TL_YELLOW,1); delay(5000); // Отключаем стрелку налево и включаем жёлтый (горит красный и жёлтый). } //
Данный пример отличается от предыдущих тем, что переключение состояний светофора осуществляется в коде loop()
обращением к функции set()
которая может принять до 7 пар параметров, первый параметр пары указывает сегмент, а второй определяет его состояние: 0
- выключить, 1
- включить, 2
- мигать. В примере использованы сегменты: TL_GREEN
- зелёный, TL_YELLOW
- жёлтый, TL_RED
- красный, TL_LEFT
- секция разрешающая поворот влево, TL_RIGHT
- секция разрешающая поворот вправо. Дополнительно можно использовать TL_BEEP
- звук и TL_GATE
- шлагбаум.
Примечание: Для работы со шлагбаумом, необходимо указать его наличие при инициализации светофора функцией begin()
. Для этого вместо SECTION_LR
укажите SECTION_LRG
.
Управление светофором в полуавтоматическом режиме:
Пример выполняет те же действия, что и предыдущий.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Track. #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулями трассы I2C-flash. iarduino_I2C_Track tlight(0x09); // Создаём объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_Track tlight;), то адрес будет найден автоматически. void setup(){ // tlight.begin(&Wire, MODUL_TLIGHT, TRACK_LFR, SECTION_LR ); // Инициируем работу по аппаратной шине I2C, со светофором, с секциями поворота влево и вправо, на перекрёстке есть дорога прямо, налево и направо. tlight.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tlight.indicator(true); // Разрешаем работу светодиода информирующего об отправке данных. tlight.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек. tlight.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами определённой ИК протоколом по умолчанию ±50%. // tlight.irAutoSend(100); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами в 100 мс ±50%. tlight.set(TL_ALL, false); // Отключаем все секции светофора. } // // void loop(){ // tlight.set(TL_FORWARD_ON); delay( 5000); // Разрешаем движение в прямом направлении. tlight.set(TL_RIGHT_ON); delay( 5000); // Разрешаем движение направо. tlight.set(TL_FORWARD_OFF, TL_RIGHT_OFF); delay(10000); // Запрещаем движение в прямом направлении и направо. tlight.set(TL_LEFT_ON); delay( 5000); // Разрешаем движение налево. tlight.set(TL_LEFT_OFF); delay( 5000); // Запрещаем движение налево. tlight.set(TL_FORWARD_ON); delay( 5000); // Разрешаем движение в прямом направлении. } //
Код тела setup()
данного примера отличается от предыдущего наличием функции timing()
, а в коде loop()
функция set()
использует не пары параметров, а параметры полуавтоматического управления светофором. В таком режиме светофор сам определяет нужно ли включать жёлтый, мигать зелёным. Время включения жёлтого и мигающего зёленого берётся из указанного функцией timing()
.
Работа с несколькими светофорами:
Пример управляет 4 светофорами и указывает им отправлять информацию о себе по ИК-каналу. Код скетча подразумевает что светофоры 1,2 стоят перпендикулярно к светофорам 3,4.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Track. #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулями трассы I2C-flash. iarduino_I2C_Track tlight_1(0x11); // Создаём объект tlight_1 для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. iarduino_I2C_Track tlight_2(0x12); // Создаём объект tlight_2 для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. iarduino_I2C_Track tlight_3(0x13); // Создаём объект tlight_3 для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. iarduino_I2C_Track tlight_4(0x14); // Создаём объект tlight_4 для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. // void setup(){ // tlight_1.begin(&Wire, MODUL_TLIGHT, TRACK_LFR); // Инициируем работу по аппаратной шине I2C, со светофором без секций поворотов, на перекрёстке есть дорога прямо, налево и направо. tlight_2.begin(&Wire, MODUL_TLIGHT, TRACK_LFR); // Инициируем работу по аппаратной шине I2C, со светофором без секций поворотов, на перекрёстке есть дорога прямо, налево и направо. tlight_3.begin(&Wire, MODUL_TLIGHT, TRACK_LFR); // Инициируем работу по аппаратной шине I2C, со светофором без секций поворотов, на перекрёстке есть дорога прямо, налево и направо. tlight_4.begin(&Wire, MODUL_TLIGHT, TRACK_LFR); // Инициируем работу по аппаратной шине I2C, со светофором без секций поворотов, на перекрёстке есть дорога прямо, налево и направо. tlight_1.set(TL_ALL , false); // Отключаем все секции 1 светофора. tlight_2.set(TL_ALL , false); // Отключаем все секции 2 светофора. tlight_3.set(TL_ALL , false); // Отключаем все секции 3 светофора. tlight_4.set(TL_ALL , false); // Отключаем все секции 4 светофора. tlight_1.set(TL_GREEN, true ); // Включаем зелёный цвет у 1 светофора. tlight_2.set(TL_GREEN, true ); // Включаем зелёный цвет у 2 светофора. tlight_3.set(TL_RED , true ); // Включаем красный цвет у 3 светофора. tlight_4.set(TL_RED , true ); // Включаем красный цвет у 4 светофора. tlight_1.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора. tlight_2.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора. tlight_3.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора. tlight_4.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора. tlight_1.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу. tlight_2.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу. tlight_3.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу. tlight_4.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу. } // // void loop(){ // // Движение в направлении 3-4: // tlight_1.set(TL_FORWARD_OFF); // Для 1 светофора запрещаем движение в прямом направлении. Светофор включит мигающий зелёный, жёлтый, красный. tlight_2.set(TL_FORWARD_OFF); // Для 2 светофора запрещаем движение в прямом направлении. Светофор включит мигающий зелёный, жёлтый, красный. delay(5000); // Ждём 5 секунд пока у светофоров 1 и 2 будет мигать зелёный. tlight_3.set(TL_FORWARD_ON); // Для 3 светофора разрешаем движение в прямом направлении. Светофор включит жёлтый и красный, зелёный. tlight_4.set(TL_FORWARD_ON); // Для 4 светофора разрешаем движение в прямом направлении. Светофор включит жёлтый и красный, зелёный. delay(5000); // Ждём 5 секунд пока у всех светофоров будет гореть жёлтый. delay(10000); // Ждём 10 секунд (едут автомобили в направлении светофоров 3 и 4). // Движение в направлении 1-2: // tlight_3.set(TL_FORWARD_OFF); // Для 3 светофора запрещаем движение в прямом направлении. Светофор включит мигающий зелёный, жёлтый, красный. tlight_4.set(TL_FORWARD_OFF); // Для 4 светофора запрещаем движение в прямом направлении. Светофор включит мигающий зелёный, жёлтый, красный. delay(5000); // Ждём 5 секунд пока у светофоров 3 и 4 будет мигать зелёный. tlight_1.set(TL_FORWARD_ON); // Для 1 светофора разрешаем движение в прямом направлении. Светофор включит жёлтый и красный, зелёный. tlight_2.set(TL_FORWARD_ON); // Для 2 светофора разрешаем движение в прямом направлении. Светофор включит жёлтый и красный, зелёный. delay(5000); // Ждём 5 секунд пока у всех светофоров будет гореть жёлтый. delay(10000); // Ждём 10 секунд (едут автомобили в направлении светофоров 1 и 2). } //
Данный пример отличается от предыдущего тем, что работает сразу с 4 модулями.
До запуска данного скетча, нужно указать адрес каждого модуля на шине I2C, в скетче используются адреса 0x11, 0x12, 0x13 и 0x14. Адреса модулей на шине I2C могут быть любыми, в диапазоне от 0x08 до 0x7E, главное что бы на шине не было модулей с одинаковыми адресами.
Для смены адресов модулей на шине I2C, можно воспользоваться первым примером данной статьи, или использовать модуль - Установщик адресов FLASH-I2C.
Описание функций библиотеки:
В данном разделе описаны функции библиотеки iarduino_I2C_Track для работы с модулями дорожный знак и светофор.
Библиотека iarduino_I2C_Track может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано ниже в разделе «Подключение библиотеки», а так же на странице Wiki - расширенные возможности библиотек iarduino для шины I2C.
Подключение библиотеки:
- Если используется аппаратная шина I2C:
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Track.h #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем. // iarduino_I2C_Track tlight(0x09); // Создаём объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. // iarduino_I2C_Track tlight; // Если адрес модуля не известен, то его можно не указывать, он будет найден автоматически. // Если адрес не указан, то на шине должен находиться только один модуль. void setup(){ // ... // tlight.begin(&Wire, MODUL_TLIGHT, ...); // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire), тип модуля - светофор и параметры светофора. ... // Доступны объекты: &Wire, &Wire1, &Wire2... } //
- Если используется программная шина I2C:
#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_I2C_Track.h SoftTwoWire sWire(3,4); // Создаём объект программной шины I2C указав выводы которым будет назначена роль линий: SDA, SCL. // #include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем. iarduino_I2C_Track tlight(0x09); // Создаём объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track, указывая адрес модуля на шине I2C. // iarduino_I2C_Track tlight; // Если адрес модуля не известен, то его можно не указывать, он будет найден автоматически. // Если адрес не указан, то на шине должен находиться только один модуль. void setup(){ // ... // tlight.begin(&sWire, MODUL_TLIGHT, ...);// Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire), тип модуля - светофор и параметры светофора. ... // } //
- В обоих примерах сначала подключается библиотека для работы с шиной I2C. Для аппаратной шины библиотека
Wire.h
(предустановлена в Arduino IDE), а для программной шины библиотека iarduino_I2C_Software.h, с созданием объекта которому указываются выбранные вами выводы шины, в примере выводы(3-SDA, 4-SCL)
. - Далее подключается библиотека и создаётся объект для работы с модулем.
- В коде
Setup()
, при инициализации работы с модулем, первым параметром указывается ссылка на объект работы с выбранной шиной I2Cbegin(&ШИНА, МОДУЛЬ, ...)
. Остальные строки кода одинаковы для любой шины I2C.
Функция begin();
- Назначение: Инициализация работы с модулем светофор или дорожный знак.
- Синтаксис для дорожного знака: begin( МОДУЛЬ, ГРУППА, НОМЕР [, ПУНКТ] [,ТАБЛИЧКА] );
- Синтаксис для светофора: begin( МОДУЛЬ, ТИП ПЕРЕКРЁСТКА [, СЕКЦИИ СВЕТОФОРА] );
- Параметры:
- &ШИНА - Ссылка на объект для работы с шиной I2C на которой находится модуль.
- Для аппаратной шины: &Wire, &Wire1, &Wire2..., если подключена библиотека Wire.h
- Для программной шины: ссылка на объект библиотеки iarduino_I2C_Software.h.
- Параметр является не обязательным, по умолчанию используется ссылка &Wire.
- uint8_t МОДУЛЬ - может принимать одно из трёх значений:
- MODUL_SIGN - модуль является дорожным знаком.
- MODUL_TLIGHT - модуль является светофором.
- MODUL_TLIGHT_AUTO - модуль является светофором с автопереключением.
Светофор с автопереключением самостоятельно меняет свои цвета и управляет шлагбаумом. Алгоритм переключений зависит от параметра СЕКЦИИ СВЕТОФОРА. Время свечения цветов задаётся функцией timing(). - uint8_t ГРУППА - указывается только для дорожного знака. Представлена целым числом от 1 до 7. Дорожные знаки в ПДД обозначаются двумя или тремя числами разделёнными точками, первое число обозначения знака является его группой.
Например, знак 2.3.4 является знаком 2 группы. - uint8_t НОМЕР - указывается только для дорожного знака. Представлен целым числом от 1 до 63. Дорожные знаки в ПДД обозначаются двумя или тремя числами разделёнными точками, второе число обозначения знака является его номером.
Например, знак 2.3.4 имеет номер 3 - uint8_t ПУНКТ - необязательный параметр для дорожного знака. Представлен целым числом от 1 до 15. Если дорожный знак обозначен в ПДД тремя числами разделёнными точками, то в качестве параметра ПУНКТ указывается третье число.
Например, знак 2.3.4 имеет пункт 4.
Если знак в ПДД обозначается двумя числами, то параметр ПУНКТ не указывается.
Некоторые знаки имеют картинку с числовыми обозначениями, например, ограничение скорости 60 км/ч, или рекомендуемая скорость 50 км/ч, ограничение массы и т.д. В таких случаях в качестве параметра ПУНКТ указывается число от 1 до 15 кратное изображённому на знаке (пример: 1 = 10 км/ч, 2 = 20 км/ч, 15 = 150 км/ч). - uint8_t ТАБЛИЧКА - необязательный параметр для дорожного знака, который указывается только если под дорожным знаком установлена табличка - знак дополнительной информации уточняющий или ограничивающий действие основного знака. Данный параметр может принимать одно из семи значений:
- SIGN_CAR_TRUCK - действие знака распространяется только на грузовые автомобили.
- SIGN_CAR_LIGHT - действие знака распространяется только на легковые автомобили.
- SIGN_DISTANCE_050 - расстояние до объекта или зона действия знака 50 метров.
- SIGN_DISTANCE_100 - расстояние до объекта или зона действия знака 100 метров.
- SIGN_DISTANCE_150 - расстояние до объекта или зона действия знака 150 метров.
- SIGN_DISTANCE_200 - расстояние до объекта или зона действия знака 200 метров.
- SIGN_DISTANCE_250 - расстояние до объекта или зона действия знака 250 метров.
- uint8_t ТИП ПЕРЕКРЁСТКА - указывается для светофора, может принимать значения:
- TRACK_L - на перекрёстке светофора есть дорога только налево.
- TRACK_R - на перекрёстке светофора есть дорога только прямо.
- TRACK_F - на перекрёстке светофора есть дорога только прямо.
- TRACK_LR - на перекрёстке светофора есть дорога только налево или направо.
- TRACK_FL - на перекрёстке светофора есть дорога только прямо или налево.
- TRACK_FR - на перекрёстке светофора есть дорога только прямо или направо.
- TRACK_LRF - на перекрёстке светофора есть дорога прямо, налево или направо.
- ПРИМЕЧАНИЕ: Буквы L (left), R (right), F (forward) можно указывать в любом порядке.
- uint8_t СЕКЦИИ СВЕТОФОРА - необязательный параметр, указывается если светофор оснащён шлагбаумом или секциями поворота. Параметр может принимать значения:
- SECTION_L - светофор оснащён дополнительной секцией левого поворота.
- SECTION_R - светофор оснащён дополнительной секцией правого поворота.
- SECTION_G - светофор оснащён шлагбаумом.
- SECTION_LR - светофор оснащён секциями левого и правого поворота.
- SECTION_LG - светофор оснащён секцией левого поворота и шлагбаумом.
- SECTION_RG - светофор оснащён секцией правого поворота и шлагбаумом.
- SECTIONT_LRG - светофор оснащён секциями влево, вправо и шлагбаумом.
- ПРИМЕЧАНИЕ: Буквы L (left), R (right), G (gate) можно указывать в любом порядке.
- Возвращаемое значение: bool - результат инициализации (true или false).
- Примечание:
- По результату инициализации можно определить наличие модуля на шине.
- Данные передаваемые дорожным знаком по ИК-каналу включают в себя все значения указанные при его инициализации.
- Данные передаваемые светофором по ИК-каналу включают не только его текущее состояние, но и указанные при инициализации секции и тип перекрёстка, что позволяет автомобилям трассы выбрать направление до проезда светофора.
- Допускается обращаться к функции begin() без параметров, например, если требуется только проверить наличие модуля на шине I2C или прочитать/изменить его адрес.
- Пример:
tlight.begin(MODUL_SIGN, 2,4 ); // Инициируем работу с дорожным знаком 2.4 ПДД "Уступите дорогу". tlight.begin(MODUL_SIGN, 2,3,1); // Инициируем работу с дорожным знаком 2.3.1 ПДД "Пересечение со второстепенной дорогой". tlight.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором без секций поворота, указав что на его перекрёстке есть дорога прямо, налево и направо. tlight.begin(MODUL_TLIGHT_AUTO, TRACK_F, SECTION_G); // Инициируем работу со светофором работающем в автоматическом режиме со шлагбаумом, указав что на его перекрёстке есть дорога только прямо.
Функция reset();
- Назначение: Перезагрузка модуля.
- Синтаксис: reset();
- Параметры: Нет.
- Возвращаемое значение: bool - результат перезагрузки (true или false).
- Пример:
if( tlight.reset() ){ Serial.print( "Модуль перезагружен" ); } else { Serial.print( "Модуль не перезагружен" ); }
Функция changeAddress();
- Назначение: Смена адреса модуля на шине I2C.
- Синтаксис: changeAddress( АДРЕС );
- Параметры:
- uint8_t АДРЕС - новый адрес модуля на шине I2C (целое число от 0x08 до 0x7E)
- Возвращаемое значение: bool - результат смены адреса (true или false).
- Примечание: Текущий адрес модуля можно узнать функцией getAddress().
- Пример:
if( tlight.changeAddress(0x12) ){ Serial.print( "Адрес модуля изменён на 0x12" ); } else { Serial.print( "Не удалось изменить адрес" ); }
Функция getAddress();
- Назначение: Запрос текущего адреса модуля на шине I2C.
- Синтаксис: getAddress();
- Параметры: Нет.
- Возвращаемое значение: uint8_t АДРЕС - текущий адрес модуля на шине I2C (от 0x08 до 0x7E)
- Примечание: Функция может понадобиться если адрес модуля не указан при создании объекта, а обнаружен библиотекой.
- Пример:
Serial.print( "Адрес модуля на шине I2C = 0x"); Serial.println( tlight.getAddress(), HEX );
Функция getVersion();
- Назначение: Запрос версии прошивки модуля.
- Синтаксис: getVersion();
- Параметры: Нет
- Возвращаемое значение: uint8_t ВЕРСИЯ - номер версии прошивки от 0 до 255.
- Пример:
Serial.print( "Версия прошивки модуля "); Serial.println( tlight.getVersion(), HEX );
Функция setPullI2C();
- Назначение: Управление внутрисхемной подтяжкой линий шины I2C.
- Синтаксис: setPullI2C( [ФЛАГ] );
- Параметры:
- bool ФЛАГ требующий установить внутрисхемную подтяжку линий шины I2C (true или false).
- Возвращаемое значение:
- bool - результат включения / отключения внутрисхемной подтяжки (true или false).
- Примечание:
- Вызов функции без параметра равносилен вызову функции с параметром true - установить.
- Флаг установки внутрисхемной подтяжки сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Внутрисхемная подтяжка линий шины I2C осуществляется до уровня 3,3 В, но допускает устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния внутрисхемной подтяжки модуля.
- Пример:
if( tlight.setPullI2C(true ) ){ Serial.print( "Внутрисхемная подтяжка установлена." ); } if( tlight.setPullI2C(false) ){ Serial.print( "Внутрисхемная подтяжка отключена." ); }
Функция getPullI2C();
- Назначение: Запрос состояния внутрисхемной подтяжки линий шины I2C.
- Синтаксис: getPullI2C();
- Параметры: Нет.
- Возвращаемое значение: bool - ФЛАГ включения внутрисхемной подтяжки (true или false).
- Пример:
if( tlight.getPullI2C() ){ Serial.print( "Внутрисхемная подтяжка включена." ); } else { Serial.print( "Внутрисхемная подтяжка отключена." ); }
Функция backlight();
- Функция только для дорожного знака.
- Назначение: Управление подсветкой дорожного знака.
- Синтаксис: backlight( РЕЖИМ );
- Параметры:
- uint8_t РЕЖИМ - целое число может принимать следующие значения:
- 0 или false - отключить подсветку знака.
- 1 или true - включить подсветку знака.
- 2 - указать модулю самостоятельно мигать подсветкой знака с частотой 1 Гц.
- Возвращаемое значение: bool - результат управления подсветкой (true или false).
- Примечание:
- По умолчанию (при подаче питания в неавтономном режиме) подсветка отключена.
- Допускается вызов функции с двумя параметрами РЕЖИМ, тогда половина светодиодов подсветки примет состояние указанное первым параметром, а остальные светодиоды подсветки примут состояние указанное вторым параметром.
- Если обратиться к данной функции при работе с модулем светофор, то каждый параметр будет управлять состоянием стрелок светофора (влево, вправо).
- Пример:
tlight.backlight(false ); // Отключить все светодиоды подсветки знака. tlight.backlight(true ); // Включить все светодиоды подсветки знака. tlight.backlight(2 ); // Мигать всеми светодиодами подсветки знака. tlight.backlight(true, false); // Включить только половину светодиодов подсветки знака. tlight.backlight(true, 2 ); // Включить половину светодиодов подсветки знака, а вторую половину заставить мигать.
Функция indicator();
- Назначение: Разрешение работы светодиода информирующего о передаче данных.
- Синтаксис: indicator( ФЛАГ );
- Параметры:
- bool ФЛАГ разрешающий работу индикаторного светодиода (true или false).
- Возвращаемое значение: bool - результат управления индикатором (true или false).
- Примечание:
- По умолчанию (при подаче питания в неавтономном режиме) работа индикаторного светодиода разрешена.
- Модуль передаёт данные по ИК-каналу при помощи ИК-светодиода, свечение которого невидимо человеческим глазом. На плате основания модуля, рядом с ИК-светодиодом расположен обычный светодиод, которому данная функция разрешает или запрещает светиться во время сеанса передачи данных по ИК-каналу.
- Пример:
tlight.backlight(true); // Разрешить работу индикаторного светодиода.
Функция irProtocol();
- Назначение: Установка протокола для передачи данных по ИК-каналу.
- Синтаксис: irProtocol( ПРОТОКОЛ );
- Параметры:
- uint8_t ПРОТОКОЛ - может принимать одно из следующих значений:
- IR_NEC - кодирование длинной паузы. Пакет отправляется за 68 мс.
- IR_SAMSUNG - кодирование длинной паузы. Пакет отправляется за 53...71 мс.
- IR_RC6 - бифазное кодирование. Пакет отправляется за 23 мс.
- IR_IARDUINO - кодирование длинной паузы. Пакет отправляется за 26 мс.
- Возвращаемое значение: bool - результат применения нового протокола (true или false).
- Примечание:
- По умолчанию (при подаче питания в неавтономном режиме) модуль использует протокол IR_IARDUINO, так как он поддерживает проверку данных, содержит бит toggle, а пакеты повтора идентичны пакету данных.
- Остальные протоколы являются стандартом передачи данных по ИК-каналу для пультов ДУ.
- Имеются ещё 5 протоколов поддерживаемых модулем, но они не должны использоваться для передачи информации о знаках, так как размер данных в их пакетах менее 2 байт:
- IR_SHARP - кодирование длинной паузы. Пакет отправляется за 16...30 мс.
- IR_SIRC12 - кодирование длинной импульса. Пакет отправляется за 17...25 мс.
- IR_SIRC15 - кодирование длинной импульса. Пакет отправляется за 21...30 мс.
- IR_RC5 - бифазное кодирование. Пакет отправляется за 25 мс.
- IR_RC5X - бифазное кодирование. Пакет отправляется за 25 мс.
- Пример:
tlight.irProtocol(IR_IARDUINO); // Использовать для передачи данных протокол «IR_IARDUINO».
Функция irSend();
- Назначение: Однократная отправка пакета данных по ИК-каналу.
- Синтаксис: irSend();
- Параметры: Нет.
- Возвращаемое значение: bool - результат получения команды модулем (true или false).
- Примечание:
- Функция передаёт модулю команду на передачу данных о знаке или состоянии светофора по ИК-каналу.
- Функция не ждёт завершения отправки данных по ИК-каналу. Это значит, что для передачи новых данных тем же модулем, нужно выдержать паузу достаточную для завершения отправки предыдущих данных по ИК-каналу. Для этого можно воспользоваться функцией irWait().
- Пример:
tlight.irSend(); // Выполняем отправку одного пакета данных по ИК-каналу. В одном пакете есть вся информация о знаке или состоянии светофора.
Функция irWait();
- Назначение: Ожидание завершения отправки данных по ИК-каналу.
- Синтаксис: irWait();
- Параметры: Нет.
- Возвращаемое значение: Нет.
- Примечание:
- Функция приостанавливает выполнение скетча, постоянно опрашивая модуль по шине I2C, до тех пор пока ИК-передача не будет завершена, но не дольше 500 мс.
- Пример:
if( !tlight.irSend() ){ Serial.print( "Не удалось отправить данные" ); } else { tlight.irWait(); Serial.print( "Данные успешно отправлены" ); }
Функция irAutoSend();
- Назначение: Автоматическая отправка пакетов данных по ИК-каналу.
- Синтаксис: irAutoSend( [ИНТЕРВАЛ] );
- Параметры:
- uint8_t ИНТЕРВАЛ - значение от 25 до 255 мс определяющее средний интервал между пакетами повторов отправляемых по ИК-каналу.
- Возвращаемое значение: bool - результат получения команды модулем (true или false).
- Примечание:
- Функция передаёт модулю команду на постоянную передачу данных о знаке или состоянии светофора по ИК-каналу.
- Если функция вызвана без параметра, то интервал между ИК пакетами будет установлен в соответствии со стандартным значением для используемого ИК-протокола.
- Модуль самостоятельно и хаотично меняет интервалы между отправляемыми ИК пакетами в диапазоне ±50% от заданного, что позволяет поставить несколько разных модулей в одном направлении.
- Остановить процесс отправки ИК пакетов можно обращением к функции irStop().
- Пример:
tlight.irAutoSend(); // Указываем модулю постоянно отправлять информацию о знаке или светофоре по ИК-каналу с паузой между пакетами определённой ИК протоколом по умолчанию ±50%. tlight.irAutoSend(100); // Указываем модулю постоянно отправлять информацию о знаке или светофоре по ИК-каналу с паузой между пакетами в 100 мс ±50%.
Функция irStop();
- Назначение: Остановка автоматической отправки пакетов по ИК-каналу.
- Синтаксис: irStop();
- Параметры: Нет.
- Возвращаемое значение: bool - результат остановки пакетов (true или false).
- Примечание:
- Функция останавливает процесс автоматической отправки данных по ИК-каналу, запущенный функцией irAutoSend().
- Пример:
tlight.irAutoSend(); // Указываем модулю постоянно отправлять информацию о знаке или светофоре по ИК-каналу с паузой между пакетами определённой ИК протоколом по умолчанию ±50%. delay(1000); // Ждём 1 секунду. tlight.irStop(); // Останавливаем процесс автоматической отправки данных по ИК-каналу.
Функция offline();
- Назначение: Разрешение работы модуля в автономном режиме.
- Синтаксис: offline( ФЛАГ );
- Параметры:
- bool ФЛАГ разрешающий работу модуля в автономном режиме (true или false).
- Возвращаемое значение: bool - результат вкл/откл автономного режима (true или false).
- Примечание:
- Обращение к функции с параметром true - разрешает работу в автономном режиме.
- Разрешение работы модуля в автономном режиме приведёт к сохранению текущих настроек модуля в его энергонезависимую память, с загрузкой этих настроек из памяти при каждом следующем включении (при каждой подаче питания). Как модуль «себя ведёт» на момент обращения к функции offline(true), так он и будет себя вести при следующих включениях.
Сохраняются данные указанные следующими функциями: - begin().
- backlight().
- indicator().
- irProtocol().
- irAutoSend().
- irStop().
- timing().
- set().
- Обращение к функции с параметром false - отключает автономный режим работы.
- Отключение автономного режима приведёт к тому, что модуль перестанет загружать данные из памяти при подаче питания.
- Пример:
tlight.begin(MODUL_TLIGHT_AUTO, TRACK_LRF, SECTION_LR); // Инициируем работу с автоматическим светофором с двумя секциями поворотов, дорога прямо, налево и направо. tlight.timing(5, 3, 10); // Указываем время свечения зелёного (5сек), жёлтого или мигающего зелёного (3сек) и красного (10сек) цветов для автоматического светофора. tlight.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tlight.indicator(false); // Запрещаем работу светодиода информирующего об отправке данных. tlight.irAutoSend(); // Указываем модулю постоянно отправлять информацию о светофоре по ИК-каналу с паузой между пакетами определённой ИК протоколом по умолчанию ±50%. tlight.offline(true); // Указываем модулю сохранить все полученные настройки в энергонезависимую память и работать в автономном режиме.
Функция timing();
- Функция для светофора и/или шлагбаума.
- Назначение: Установка времени свечения цветов светофора с автопереключением.
- Синтаксис: timing( ЗЕЛЁНЫЙ, ЖЁЛТЫЙ, КРАСНЫЙ );
- Синтаксис: timing( ЗЕЛЁНЫЙ, КРАСНЫЙ );
- Синтаксис: timing( ЖЁЛТЫЙ );
- Параметры:
- uint8_t ЗЕЛЁНЫЙ - целое число от 1 до 127 сек определяет длительность свечения зелёного сигнала светофора.
- uint8_t ЖЁЛТЫЙ - целое число от 0 до 127 сек определяет длительность свечения жёлтого и мигающего зелёного сигнала светофора.
- uint8_t КРАСНЫЙ - целое число от 1 до 127 сек определяет длительность свечения красного сигнала светофора и закрытия шлагбаума.
- Возвращаемое значение: bool - результат применения интервалов (true или false).
- Примечание:
- Длительности свечения зелёного, мигающего зелёного, жёлтого и красного сигналов используются если светофор работает в режиме автоматического переключения.
- Длительность свечения жёлтого и мигающего зелёного сигнала, так же используется при полуавтоматическом переключении светофора функцией set().
- Если обратиться к функции с одним параметром, то будет установлено только время свечения жёлтого (и мигающего зелёного) сигнала светофора. Это удобно при переключении сигналов светофора в полуавтоматическом режиме. Время свечения зелёного и красного останутся без изменений.
- Если обратиться к функции с двумя параметрами, то будет установлено время свечения зелёного и красного сигнала светофора. Это удобно при автоматической работе модуля со шлагбаумом без светофора. Время свечения жёлтого и мигающего зелёного будет сброшено в 0.
- Пример:
tlight.timing(10, 3, 5); // Указываем время свечения зелёного (10сек), жёлтого (3сек) и красного (5сек). tlight.timing(10, 5); // Указываем время свечения зелёного (10сек) и красного (5сек). Время свечения жёлтого сбрасывается в 0. tlight.timing(3); // Указываем время свечения жёлтого (3сек). Время свечения зелёного и красного остаются без изменений.
Функция set();
- Функция для светофора и/или шлагбаума.
- Назначение: Управление светофором в ручном или полуавтоматическом режиме.
- Синтаксис для ручного управления: set( ЦВЕТ, ЗНАЧЕНИЕ ); - до 7 пар параметров.
- Синтаксис для полуавтоматического управления: set(ДЕЙСТВИЕ [,ДЕЙСТВИЕ][,ДЕЙСТВИЕ]);
- Параметр:
- uint8_t ЦВЕТ - может принимать одно из следующих значений:
- TL_RED - красный сигнал светофора.
- TL_YELLOW - жёлтый сигнал светофора.
- TL_GREEN - зелёный сигнал светофора.
- TL_RIGHT - стрелка светофора вправо.
- TL_LEFT - стрелка светофора влево.
- TL_BEEP - звуковой сигнал шлагбаума.
- TL_GATE - шлагбаум.
- TL_ALL - все цвета, стрелки, звуковой сигнал и шлагбаум.
- uint8_t ЗНАЧЕНИЕ - может принимать одно из следующих значений:
- 0 или false - отключить (для шлагбаума - открыть).
- 1 или true - включить (для шлагбаума - закрыть).
- 2 - мигать с частотой 1 Гц.
- uint8_t ДЕЙСТВИЕ - может принимать одно из следующих значений:
- TL_FORWARD_ON - переключиться на разрешение движения в прямом направлении.
- TL_FORWARD_OFF - переключиться на запрет движения в прямом направлении.
- TL_LEFT_ON - разрешить движение влево.
- TL_LEFT_OFF - переключиться на запрет движения влево.
- TL_RIGHT_ON - разрешить движение вправо.
- TL_RIGHT_OFF - переключиться на запрет движения вправо.
- Возвращаемое значение: bool - результат получения команды модулем (true или false).
- Примечание:
- Функция используется только для модулей инициированных как светофор без автопереключения begin(MODUL_TLIGHT, ... ).
- В ручном режиме указывается от одной до семи пар параметров (цвет, значение), указанные значения моментально отражаются на состоянии светофора.
- В полуавтоматическом режиме указывается от одного до трех действий, светофор самостоятельно переключает свои сигналы устанавливая требуемое состояние. Если при инициализации указано, что светофор оснащён шлагбаумом, то действие запрещающее движение прямо (при выключенных поворотах) - закроет шлагбаум, а действие разрешающее движение прямо, влево или вправо - откроет его.
- Функция допускает комбинировать параметры ручного и полуавтоматического управления.
- Управление светофором не отменяет работу функции irAutoSend(). Если включена автоматическая отправка состояния светофора по ИК-каналу, то любое изменение состояния светофора будет влиять на автоматически отправляемые по ИК-каналу данные.
- Пример управления светофором в ручном режиме:
tlight.set( TL_RED,1, TL_YELLOW,1, TL_GREEN,0, TL_BEEP,2 ); // Включить красный, включить жёлтый, выключить зелёный, мигать звуком, остальные сигналы оставить без изменений. tlight.set( TL_BEEP,2, TL_GREEN,0, TL_YELLOW,1, TL_RED,1 ); // Выполняются те же команды, что и в предыдущей строке, просто их поменяли местами. tlight.set( TL_LEFT,1, TL_GATE,0); // Включить зелёную стрелку влево и поднять шлагбаум.
- Пример управления светофором в полуавтоматическом режиме:
tlight.set(TL_FORWARD_ON); // Разрешить движение в прямом направлении. Если горит красный, то сначала включится красный и жёлтый, а потом зелёный. delay(15000); // Ждём 15 секунд. Нужно учитывать время затрачиваемое модулем на переключение сигналов светофора. tlight.set(TL_FORWARD_OFF); // Запретить движение в прямом направлении. Если горит зелёный, то он начнёт мигать, потом включится жёлтый, а затем красный. Если мигал зелёный, то включится жёлтый потом красный, если горел жёлтый то сразу включится красный. delay(25000); // Ждём 25 секунд. Нужно учитывать время затрачиваемое модулем на переключение сигналов светофора.
Время затрачиваемое на переключение сигналов светофора, в полуавтоматическом режиме, зависит от длительности свечения жёлтого и мигающего зелёного сигналов светофора, его можно задать функцией timing().
Функция gateSpeed();
- Функция только для шлагбаума.
- Назначение: Установка скорости работы шлагбаума.
- Синтаксис: gateSpeed( СКОРОСТЬ );
- Параметр:
- uint8_t СКОРОСТЬ - значение от 0 (минимальная) до 255 (максимальная).
- Возвращаемое значение: bool - результат применения новой скорости (true или false).
- Примечание:
- Указанная скорость сохраняется в энергонезависимой памяти модуля.
- Скорость работы шлагбаума не влияет на управление шлагбаумом функцией gateWidth().
- Пример:
tlight.gateSpeed(127); // Устанавливаем среднюю скорость поднятия / опускания шлагбаума.
Функция gateWidth();
- Функция только для шлагбаума.
- Назначение: Управление положением шлагбаума при помощи ШИМ.
- Синтаксис: gateWidth( ШИРИНА );
- Параметры:
- uint16_t ШИРИНА - значение от 0 до 20'000 определяет ширину импульсов ШИМ в мкс.
- Возвращаемое значение: bool - результат применения новой ширины (true или false).
- Примечание:
- В модуле - Шлагбаум светофора, используется сервопривод управляемый сигналом ШИМ на частоте 50Гц. Максимальная ширина импульсов ШИМ не может превышать период их следования, чем и ограничено допустимое значение параметра: T=1/f = 1/50 = 20'000 мкс.
- Полный диапазон ШИМ для управления сервоприводом используемом в модуле ограничен шириной импульсов от 500±100 мкс (для угла 0°) до 2300±100 мкс (для угла 180°).
- Рабочий ход шлагбаума 90° в два раза меньше полного хода сервопривода 180°, значит диапазон ШИМ для управления шлагбаумом ограничен шириной импульсов от 950 мкс (шлагбаум открыт) до 1850 мкс (шлагбаум закрыт).
- Управление шлагбаумом путем указания ширины импульсов ШИМ позволяет задать любое положение шлагбаума, а не положения закрыт/открыт как при управлении им при помощи функции set().
- Пример:
tlight.gateWidth(1400); // Установить ширину импульсов ШИМ подаваемых на сервопривод шлагбаума в значение 1400 мкс.
Функция gateWidthOpen();
- Функция только для шлагбаума.
- Назначение: Указание ширины импульсов ШИМ для полностью открытого шлагбаума.
- Синтаксис: gateWidthOpen( ШИРИНА );
- Параметры:
- uint16_t ШИРИНА - значение от 1 до 19'999 определяет ширину импульсов ШИМ в мкс для полностью открытого шлагбаума.
- Возвращаемое значение: bool - результат применения новой ширины (true или false).
- Примечание:
- Ширина импульсов ШИМ заданная данной функцией сохраняется в энергонезависимой памяти модуля. Это значение используется функциями ручного, автоматического и полуавтоматического управления при открытии шлагбаума.
- Рекомендуемое значение ширины импульсов ШИМ для полностью открытого шлагбаума равно 950±100 мкс.
- Для выявления наиболее подходящего значения рекомендуется воспользоваться функцией gateWidth() меняя ширину импульсов до тех пор, пока шлагбаум не станет параллельным трассе, именно это значение и стоит указать функции gateWidthOpen().
- Ширина импульсов ШИМ заданная данной функцией сохраняется в энергонезависимой памяти модуля. Это значение используется функциями ручного, автоматического и полуавтоматического управления при открытии шлагбаума.
- Пример:
tlight.gateWidthOpen(950); // Указываем модулю, что для полностью открытого шлагбаума требуется подать на сервопривод сигнал ШИМ с длительностью импульсов 950 мкс.
Функция gateWidthClose();
- Функция только для шлагбаума.
- Назначение: Указание ширины импульсов ШИМ для полностью закрытого шлагбаума.
- Синтаксис: gateWidthClose( ШИРИНА );
- Параметры:
- uint16_t ШИРИНА - значение от 1 до 19'999 определяет ширину импульсов ШИМ в мкс для полностью закрытого шлагбаума.
- Возвращаемое значение: bool - результат применения новой ширины (true или false).
- Примечание:
- Ширина импульсов ШИМ заданная данной функцией сохраняется в энергонезависимой памяти модуля. Это значение используется функциями ручного, автоматического и полуавтоматического управления при закрытии шлагбаума.
- Рекомендуемое значение ширины импульсов ШИМ для полностью закрытого шлагбаума равно 1850±100 мкс.
- Для выявления наиболее подходящего значения рекомендуется воспользоваться функцией gateWidth() меняя ширину импульсов до тех пор, пока шлагбаум не станет перпендикулярным трассе, именно это значение и стоит указать функции gateWidthClose().
- Пример:
tlight.gateWidthClose(1850); // Указываем модулю, что для полностью закрытого шлагбаума требуется подать на сервопривод сигнал ШИМ с длительностью импульсов 1850 мкс.
Формирование данных библиотекой для их передачи по ИК каналу:
Модуль поддерживает 9 протоколов передачи данных по ИК-каналу: NEC, SAMSUNG, SHARP, SIRC12, SIRC15, RC5, RC5X, RC6 и IR_IARDUINO. Все протоколы являются стандартными протоколами передачи данных по ИК-каналу для пультов ДУ, кроме IR_IARDUINO, который используется модулем по умолчанию. Этот протокол был разработан специально для модулей линейки «Дорожное движение», он позволяет ИК-приёмнику проверить полученные данные на наличие ошибок, а так же отличить пакет данных от пакетов повторов не смотря на то, что они несут одну и ту же информацию. Отправка одного бита данных по протоколу IR_IARDUINO занимает меньше времени, чем в любом другом из перечисленных протоколов.
- Пакет данных передаваемый по ИК-каналу, вне зависимости от используемого протокола, содержит адрес ИК-устройства (не путать с адресом модуля на шине I2C) и команду для ИК-устройства. Количество бит в адресе ИК-устройства и количество бит в команде ИК-устройства зависит от используемого ИК протокола.
- Пакеты протоколов NEC, SAMSUNG, RC6 и IR_IARDUINO содержат адрес состоящий из 8 бит и команду из 8 бит. Эти ИК протоколы подходят для передачи данных о дорожных знаках и состоянии светофора, кроме протокола NEC, пакеты повторов которого являются пустыми.
- Остальные протоколы: RC5, RC5X, SIRC12, SHARP, SIRC15, содержат адрес состоящий из 5 бит и команду состоящую из 6, 7, 7, 8 и 10 бит соответственно. Эти ИК протоколы не подходят для передачи данных о дорожных знаках и состоянии светофора.
В библиотеке iarduino_I2C_Track, отправка данных по ИК-каналу осуществляется обращением к функции irSend()
или irAutoSend()
. Функции передают модулю два байта данных (байт адреса ИК-устройства и байт команды ИК-устройства) в которых содержится вся информация о знаке или состоянии светофора. Модуль просто отправляет 2 байта по ИК-каналу.
Для передачи информации о знаке у байта адреса три старших бита не могут иметь значение 000 (так как группа знака не может быть нулевой), значит байт адреса для знаков сможет принимать значения в диапазоне от 0x20 до 0xFF, что позволяет отличить знак от светофора.
БАЙТ ИК-АДРЕСА ЗНАКА: | БАЙТ ИК-КОМАНДЫ ЗНАКА: | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ГРУППА | НОМЕР | ПУНКТ | ТАБЛИЧКА |
- Блог ГРУППА знака состоит из 3 бит и представляет целое число от 1 до 7.
- Блок НОМЕР знака состоит из 6 бит и представляет целое число от 1 до 63.
- Блок ПУНКТ знака состоит из 4 бит и представляет целое число от 0 до 15.
- Блок ТАБЛИЧКА под знаком состоит из 3 бит и представляет целое число от 0 до 7.
Для передачи информации о светофоре у байта адреса три старших бита всегда имеют значение 000 (так как эти биты не несут информации), а три байта блока ПЕРЕКРЁСТОК не могут иметь значение 000, значит байт адреса для светофоров сможет принимать значения в диапазоне от 0x04 до 0x1F, что позволяет отличить светофор от знака.
БАЙТ ИК-АДРЕСА СВЕТОФОРА: | БАЙТ ИК-КОМАНДЫ СВЕТОФОРА: | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
000 | ПЕРЕКРЁСТОК | СЕГМЕНТЫ | GT | R | Y* | Y | G* | G | LT | RT |
- Блок ПЕРЕКРЁСТОК состоит из 3 бит указывающий направления перекрёстка: L, F, R.
- Блок СЕГМЕНТЫ состоит из 2 бит указывающих на наличие секций поворота: L, R.
- Байт ИК-команды информирует о состоянии светофора:
- GT - шлагбаум опущен.
- R - светится красный.
- Y - светится жёлтый, Y* - мигает жёлтый.
- G - светится зелёный, G* - мигает зелёный.
- LT - левая / RT - правая секция поворота включена (светится или мигает).
ИК-адрес 0x01 используется для отправки данных автомобилями трассы. Оставшиеся ИК-адреса 0x02 и 0x03 можно использовать для идентификации данных отправляемых с пультов ДУ.
Ссылки:
- Все модули линейки «Дорожное движение».
- Роботраффик - система дорожного движения.
- Wiki - Дорожный знак из линейки «дорожное движение».
- Wiki - ИК-приемник/передатчик, FLASH-I2C.
- Wiki - ИК-приемник/передатчик, FLASH-I2C - Datasheet.
- Wiki - Основание дорожных знаков и светофора, FLASH-I2C - Datasheet.
- Библиотека iarduino_I2C_Track.
- Библиотека iarduino_I2C_Software.
- Wiki - Расширенные возможности библиотек iarduino для шины I2C.
- Wiki - Установка библиотек в Arduino IDE.
- Wiki - Программная установка адресов модулей FLASH-I2C.
Обсуждение