Общие положения
Движение на Т-образном перекрёстке регулируется светофором, в данном случае — с дополнительными секциями. Вы можете почитать подробнее информацию о сборке светофора, его настройке, особенностях питания, и настройке расстояния передачи ИК-сигнала.
Схема установки знака на трассе:

Центр светофора должен находиться в 15см от линии трассы, образующих перекрёсток, а сам светофор располагаться под углом 45° относительно линии движения автомобиля.
Угол распространения ИК данных составляет около 80°, а дальность передачи ИК данных настраивается поворотом крестовины резистора на обратной стороне платы основания.
Алгоритм работы светофора

Алгоритм работы светофоров:
Предлагаем алгоритм при котором светофоры работают в три фазы. Для удобства описания работы, назовём левую часть дороги — "A", нижнюю часть дороги — "B" и правую часть дороги — "C". Тогда светофоры перекрёстка разрешают движение следующим образом:
- В 1 фазе: между дорогам "A" и "B" в обоих направлениях, дополнительно от "B" к "C".
- В 2 фазе: между дорогами "C" и "B" в обоих направлениях, дополнительно от "C" к "A".
- В 3 фазе: между дорогами "A" и "C" в обоих направлениях, дополнительно от "A" к "B".
Реализуется данный алгоритм следующим образом:
![]() |
|
![]() |
|
![]() |
|
Подробнее о переключении от зелёного к красному и от красного к зелёному Вы можете почитать по ссылке.
Адресация на шине I2C
Мы уже говорили о том, что все наши знаки и светофоры являются устройствами, работающими по шине I2C. Это значит, что они подключаются параллельно к одной шине и для того, чтобы они могли взаимодействовать с контроллером, каждое устройство должно иметь свой уникальный адрес в пределах этой шины. Поэтому, при подключении двух и более устройств необходимо убедиться, что они имеют разные адреса.
Смена адреса устройства
Подключите светофор, у которого хотите сменить адрес, к шине I2C, и загрузите следующий скетч. После этого адрес светофора изменится и сохранится в его энергонезависимой памяти. Повторите то же самое с другими светофорами, заменив записываемый адрес.
Установите светофорам адреса 0x0A, 0x0B, 0x0C.
Для установки адресов воспользуйтесь скетчем из меню Arduino IDE:
Файл / Примеры / iarduino I2C Track (модуль трассы) / NewAddress
Схема включения
После установки адресов I2C для каждого светофора, соедините их с помощью I2C Hub'а и подключите к контроллеру. Подробнее о питании контроллера и светофоров Вы можете почитать в статье.

Скетч
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы. iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с 1 светофором, указав его адрес на шине I2C (0x0A). iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы с 2 светофором, указав его адрес на шине I2C (0x0B). iarduino_I2C_Track tl_C(0x0C); // Создаём объект tl_C для работы с 3 светофором, указав его адрес на шине I2C (0x0C). // void setup(){ // tl_A.begin(MODUL_TLIGHT, TRACK_FR, SECTION_R ); // Инициируем работу со светофором указав что на его перекрёстке есть дорога прямо и направо (TRACK_FR), светофор оснащён секцией правого поворота (SECTION_R ). tl_B.begin(MODUL_TLIGHT, TRACK_LR, SECTION_LR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога налево и направо (TRACK_LR), светофор оснащён двумя секциями поворота (SECTION_LR). tl_C.begin(MODUL_TLIGHT, TRACK_FL, SECTION_L ); // Инициируем работу со светофором указав что на его перекрёстке есть дорога прямо и налево (TRACK_FL), светофор оснащён секцией левого поворота (SECTION_L ). tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tl_C.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO". tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%. tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%. tl_C.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%. tl_A.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек. tl_B.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек. tl_C.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек. // Определяем начальное состояние: // tl_A.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "A". tl_B.set(TL_FORWARD_OFF, TL_LEFT_ON, TL_RIGHT_ON); // Запрещаем движение прямо и разрешаем повороты влево и вправо на светофоре "B". } // // void loop(){ // // ================================== // ============================================================================= // Фаза 1: // Было: "A"-зелёный и стрелка направо, "B"-красный , "C"-зелёный. // Станет: "A"-красный и стрелка направо, "B"-красный и обе стрелки, "C"-красный. // Нужно: "A"-переключить на красный , "B"-включить обе стрелки , "C"-переключить на красный. // ----------------1----------------- // tl_A.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "A". tl_C.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "C". delay(3000); // В течении 3 секунд на светофорах "A" и "C" будет мигать зелёный. // ----------------2----------------- // delay(3000); // В течении 3 секунд на светофорах "A" и "C" будет светиться жёлтый. // ----------------3----------------- // tl_B.set(TL_LEFT_ON, TL_RIGHT_ON); // Разрешаем повороты влево и вправо на светофоре "B". Стрелки включатся сразу. delay(10000); // Ждём 10 секунд пока едут машины. // ================================== // ============================================================================= // Фаза 2: // Было: "A"-красный и стрелка направо, "B"-красный и обе стрелки , "C"-красный. // Станет: "A"-красный , "B"-красный и стрелка направо, "C"-зелёный и стрелка налево. // Нужно: "A"-выключить стрелку направо, "B"-выключить стрелку налево , "C"-переключить на зелёный и включить стрелку налево. // ----------------1----------------- // tl_A.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "A". tl_B.set(TL_LEFT_OFF); // Запрещаем поворот влево на светофоре "B". delay(3000); // В течении 3 секунд на светофорах "A" и "B" будут мигать отключаемые стрелки. // ----------------2----------------- // tl_C.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "C". delay(3000); // В течении 3 секунд на светофоре "C" будет светиться красный с жёлтым. // ----------------3----------------- // tl_C.set(TL_LEFT_ON); // Разрешаем поворот влево на светофоре "C". Стрелка включается сразу. delay(10000); // Ждём 10 секунд пока едут машины. // ================================== // ============================================================================= // Фаза 3: // Было: "A"-красный , "B"-красный и стрелка направо, "C"-зелёный и стрелка налево. // Станет: "A"-зелёный и стрелка направо , "B"-красный , "C"-зелёный. // Нужно: "A"-переключить на зелёный и включить стрелку направо, "B"-выключить стрелку направо, "C"-выключить стрелку налево. // ----------------1----------------- // tl_B.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "B". tl_C.set(TL_LEFT_OFF); // Запрещаем поворот влево на светофоре "C". delay(3000); // В течении 3 секунд на светофорах "B" и "C" будут мигать отключаемые стрелки. // ----------------2----------------- // tl_A.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "A". delay(3000); // В течении 3 секунд на светофоре "A" будет светиться красный с жёлтым. // ----------------3----------------- // tl_A.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "A". Стрелка включается сразу. delay(10000); // Ждём 10 секунд пока едут машины. } //
В коде setup()
выполняются следующие действия:
- Это первый скетч в котором при обращении к функции
begin()
, в качестве третьего параметра указывается наличие дополнительных секций поворота:SECTION_L
— есть секция поворота влево,SECTION_R
— есть секция поворота вправо,SECTION_LR
— есть обе секции поворота. - Обращением к функции
irProtocol()
мы указываем ИК-протокол передачи данных. В скетче используетсяIR_IARDUINO
. - Обращением к функции
irAutoSend()
мы заставляем модуль самостоятельно постоянно отправлять данные о состоянии светофора по ИК-каналу. - Обращением к функции
timing()
мы указали длительность свечения жёлтого и мигающего зелёного равной 3 секундам. Это требуется так как в полуавтоматическом режиме модуль включает эти цвета без нашего участия. - В конце кода
setup()
выполнено обращение к функцииset()
для установки цветов необходимых для корректной работы циклаloop()
при его первом проходе.
Код loop()
разделён на 3 фазы в которых выполняются по 3 действия:
- Действие №1 — запрет движения для любых направлений:
- Вызов функции
set()
для светофоров которым требуется запретить движение прямоTL_FORWARD_OFF
, влевоTL_LEFT_OFF
, вправоTL_RIGHT_OFF
. - Задержка
delay()
на время свечения мигающего зелёного сигнала. - Действие №2 — разрешение движения в прямом направлении:
- Вызов функции
set()
для светофоров которым требуется разрешить движение прямоTL_FORWARD_ON
. - Задержка
delay()
на время свечения жёлтого сигнала. - Действие №3 — включение секций поворотов:
- Вызов функции
set()
для светофоров которым требуется разрешить движение влевоTL_LEFT_ON
, вправоTL_RIGHT_ON
(стрелки поворотов включаются сразу, без задержек). - После выполнения всех действий, на светофорах перекрёстка установлены требуемые сигналы. Осталось приостановить выполнение скетча функцией
delay()
на желаемую длительность текущей фазы движения машин.
Обратите внимание на то, что в 1 фазе нет команд на разрешение движений в прямом направлении, поэтому задержка между запретом движения и разрешением поворотов равна двум периодам свечения жёлтого сигнала.
Обсуждение