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

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

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

Скетч
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы
iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с первым светофором, указав его адрес на шине I2C (0x0A)
iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы со вторым светофором, указав его адрес на шине I2C (0x0B)
iarduino_I2C_Track tl_C(0x0C); // Создаём объект tl_C для работы с третьим светофором, указав его адрес на шине I2C (0x0C)
iarduino_I2C_Track tl_D(0x0D); // Создаём объект tl_D для работы с четвёртым светофором, указав его адрес на шине I2C (0x0D)
//
void setup(){ //
tl_A.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR)
tl_B.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR)
tl_C.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR)
tl_D.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR)
tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
tl_C.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
tl_D.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
tl_C.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
tl_D.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
tl_A.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5 сек
tl_B.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5 сек
tl_C.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5 сек
tl_D.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5 сек
} //
//
void loop(){ //
// Фаза 1: //
tl_B.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора «B»
tl_D.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора «D»
delay(5000); // Ждём 5 секунд. Всё это время светофоры «B» и «D» будут мигать зелёным
tl_A.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора «A»
tl_C.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора «C»
delay(20000); // Ждём 20 секунд. В течение первых 5 секунд на светофорах «A» и «C» будет светится красный с жёлтым, а на светофорах «B» и «D» — жёлтый. Оставшиеся 15 секунд на светофорах «A» и «C» будет светиться зелёный, а на светофорах «B» и «D» — красный
// Фаза 2: //
tl_A.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора «A»
tl_C.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора «C»
delay(5000); // Ждём 5 секунд. Всё это время светофоры «A» и «C» будут мигать зелёным
tl_B.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора «B»
tl_D.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора «D»
delay(20000); // Ждём 20 секунд. В течение первых 5 секунд на светофорах «B» и «D» будет светится красный с жёлтым, а на светофорах «A» и «C» — жёлтый. Оставшиеся 15 секунд на светофорах «A» и «C» будет светиться красный, а на светофорах «B» и «D» — зелёный
} //
В коде setup() выполняются следующие действия:
- Обращением к функции
begin()мы указываем, что каждый модуль является светофоромMODUL_TLIGHT, который регулирует перекрёсток с дорогами влево, прямо и направоTRACK_LFR. - Обращением к функции
irProtocol()мы указываем ИК-протокол передачи данных. В скетче используетсяIR_IARDUINO. - Обращением к функции
irAutoSend()мы заставляем модуль самостоятельно постоянно отправлять данные о состоянии светофора по ИК-каналу. - Обращением к функции
timing()мы указали длительность свечения жёлтого и мигающего зелёного, равной5секундам. Это требуется, так как в полуавтоматическом режиме модуль включает эти цвета без нашего участия.
Код loop() разделён на 2 фазы в которых выполняются следующие действия:
- Вызов функций
set()— для светофоров, которым требуется запретить движение прямоTL_FORWARD_OFF. - Задержка
delay()на время свечения мигающего зелёного сигнала (5 сек). - Вызов функции
set()— для светофоров, которым требуется разрешить движение прямоTL_FORWARD_ON. - Задержка
delay()— на время свечения жёлтого сигнала (5 сек) + желаемая длительность текущей фазы движения машин (15 сек).


Обсуждение