Х-образный, без секций поворотов

Общие положения

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

Схема установки знака на трассе:

В данном случае светофор не имеет дополнительных секций.

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

Угол распространения ИК данных составляет около 80°, а дальность передачи ИК данных настраивается поворотом крестовины резистора на обратной стороне платы основания.

Алгоритм работы светофора

Алгоритм работы светофоров:

Предлагаем алгоритм при котором, если движение разрешено светофорами 0x0A и 0x0C, то оно запрещено светофорами 0x0B и 0x0D, и наоборот, если движение разрешено светофорами 0x0B и 0x0D, то оно запрещено светофорами 0x0A и 0x0C. Так как все светофоры не имеют секций поворота, то разрешая движение прямо, они разрешат и повороты в обе стороны.

Светофоры работают в двух фазах:

  • 1 фаза:
    • Светится зелёный сигнал светофора 0x0A и 0x0C разрешая движение.
    • Светится красный сигнал светофора 0x0B и 0x0D запрещая движение.
  • 2 фаза:
    • Светится красный сигнал светофора 0x0A и 0x0C запрещая движение.
    • Светится зелёный сигнал светофора 0x0B и 0x0D разрешая движение.

Подробнее о переключении от зелёного к красному и от красного к зелёному Вы можете почитать по ссылке.

Адресация на шине 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 для работы с 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).
iarduino_I2C_Track tl_D(0x0D);            // Создаём объект tl_D для работы с 4 светофором, указав его адрес на шине 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 сек).
Ну что же, поздравляем!
Вы освоили основы программирования, выполнили множество упражнений и проектов. Не стесняйтесь возвращаться к предыдущим урокам, если что-нибудь забыли. А мы предлагаем двигаться дальше и переходить к следующей главе.
перейти к выбору главы

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

Светофор

В магазин

Обсуждение

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