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

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

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

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

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

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

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

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

Предлагаем алгоритм, при котором светофоры работают в три фазы. Для удобства описания работы назовём левую часть дороги — «A», нижнюю часть дороги — «B» и правую часть дороги — «C». Тогда светофоры перекрёстка разрешают движение следующим образом:

  • В 1 фазе: между дорогами «A» и «B» в обоих направлениях, дополнительно от «B» к «C»;
  • В 2 фазе: между дорогами «C» и «B» в обоих направлениях, дополнительно от «C» к «A»;
  • В 3 фазе: между дорогами «A» и «C» в обоих направлениях, дополнительно от «A» к «B».

Реализуется данный алгоритм следующим образом:

  • 1 фаза:
    • У светофора 0x0A светится красный сигнал и стрелка направо;
    • У светофора 0x0B светится красный сигнал и обе стрелки;
    • У светофора 0x0C светится красный сигнал.
  • 2 фаза:
    • У светофора 0x0A светится красный сигнал;
    • У светофора 0x0B светится красный сигнал и стрелка направо;
    • У светофора 0x0C светится зелёный сигнал и стрелка налево.
  • 3 фаза:
    • У светофора 0x0A светится зелёный сигнал и стрелка направо;
    • У светофора 0x0B светится красный сигнал;
    • У светофора 0x0C светится зелёный сигнал.

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

Адресация на шине 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 для работы с первым светофором, указав его адрес на шине I2C (0x0A)
iarduino_I2C_Track tl_B(0x0B);          // Создаём объект tl_B для работы со вторым светофором, указав его адрес на шине I2C (0x0B)
iarduino_I2C_Track tl_C(0x0C);          // Создаём объект tl_C для работы с третьим светофором, указав его адрес на шине 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() на желаемую длительность текущей фазы движения машин.

Обратите внимание на то, что в первой фазе нет команд на разрешение движений в прямом направлении, поэтому задержка между запретом движения и разрешением поворотов равна двум периодам свечения жёлтого сигнала.

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

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

Светофор

В магазин

Обсуждение

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