Регулируемый пешеходный переход

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

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

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

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

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

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

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

Алгоритм управления движением автомобилей через пешеходный переход является самым простым, так как машины движутся по прямой дороге, без поворотов. Для регулировки движения достаточно двух светофоров без секций поворота, при этом их сигналы будут одинаковы.

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

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

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

Адресация на шине I2C

Мы уже говорили о том, что все наши знаки и светофоры являются устройствами, работающими по шине I2C. Это значит, что они подключаются параллельно к одной шине, и для того, чтобы они могли взаимодействовать с контроллером, каждое устройство должно иметь свой уникальный адрес в пределах этой шины. Поэтому при подключении двух и более устройств необходимо убедиться, что они имеют разные адреса.

Смена адреса устройства

Подключите светофор, у которого хотите сменить адрес, к шине I2C и загрузите следующий скетч. После этого адрес светофора изменится и сохранится в его энергонезависимой памяти. Повторите то же самое с другими светофорами, заменив записываемый адрес.

Первому светофору установите адрес 0x0A, второму — 0x0B.

Для установки адресов воспользуйтесь скетчем из меню 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)
                                        //
void setup(){                           //
     tl_A.begin(MODUL_TLIGHT, TRACK_F); // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога только прямо (TRACK_F)
     tl_B.begin(MODUL_TLIGHT, TRACK_F); // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога только прямо (TRACK_F)
     tl_A.irProtocol(IR_IARDUINO);      // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     tl_B.irProtocol(IR_IARDUINO);      // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     tl_A.irAutoSend();                 // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
     tl_B.irAutoSend();                 // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
     tl_A.timing(3);                    // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3 сек
     tl_B.timing(3);                    // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3 сек
}                                       //
                                        //
void loop(){                            //
//   Фаза 1:                            //
     tl_A.set(TL_FORWARD_ON );          // Разрешаем движение в прямом направлении.
     tl_B.set(TL_FORWARD_ON );          // Разрешаем движение в прямом направлении.
     delay(13000);                      // Ждём 13 секунд. За это время оба светофора переключатся с красного на красный и жёлтый, подождут 3 секунды и включат зелёный, который будет светится оставшиеся 10 из 13 секунд.
//   Фаза 2:                            //
     tl_A.set(TL_FORWARD_OFF);          // Запрещаем движение в прямом направлении.
     tl_B.set(TL_FORWARD_OFF);          // Запрещаем движение в прямом направлении.
     delay(11000);                      // Ждём 11 секунд. За это время оба светофора переключатся с зелёного на мигающий зелёный, подождут 3 секунды, переключатся на жёлтый, подождут 3 секунды, переключатся на красный, который будет светится оставшиеся 5 из 11 секунд.
}                                       //

Пример управления светофорами в ручном режиме:

#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)
                                                  //
void setup(){                                     //
     tl_A.begin(MODUL_TLIGHT, TRACK_F);           // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога только прямо (TRACK_F)
     tl_B.begin(MODUL_TLIGHT, TRACK_F);           // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога только прямо (TRACK_F)
     tl_A.irProtocol(IR_IARDUINO);                // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     tl_B.irProtocol(IR_IARDUINO);                // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     tl_A.irAutoSend();                           // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
     tl_B.irAutoSend();                           // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50 %
     tl_A.set(TL_GREEN,0, TL_YELLOW,0, TL_RED,1); // Устанавливаем начальное состояние светофора (горит только красный)
     tl_B.set(TL_GREEN,0, TL_YELLOW,0, TL_RED,1); // Устанавливаем начальное состояние светофора (горит только красный)
}                                                 //
                                                  //
void loop(){                                      //
//   Фаза 1:                                      // Горел только красный на двух светофорах
     tl_A.set(TL_YELLOW,1);                       // Включаем жёлтый (горит красный и жёлтый)
     tl_B.set(TL_YELLOW,1);                       // Включаем жёлтый (горит красный и жёлтый)
     delay(3000);                                 // Ждём 3 секунды
     tl_A.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0); // Включаем зелёный, отключаем жёлтый и красный (горит только зелёный)
     tl_B.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0); // Включаем зелёный, отключаем жёлтый и красный (горит только зелёный)
     delay(10000);                                // Ждём 10 секунд
//   Фаза 2:                                      // Горел только зелёный на двух светофорах
     tl_A.set(TL_GREEN,2);                        // Мигаем зелёным (светится только зелёный, мигая)
     tl_B.set(TL_GREEN,2);                        // Мигаем зелёным (светится только зелёный, мигая)
     delay(3000);                                 // Ждём 3 секунды
     tl_A.set(TL_GREEN,0, TL_YELLOW,1);           // Отключаем зелёный, включаем жёлтый (горит только жёлтый)
     tl_B.set(TL_GREEN,0, TL_YELLOW,1);           // Отключаем зелёный, включаем жёлтый (горит только жёлтый)
     delay(3000);                                 // Ждём 3 секунды
     tl_A.set(TL_YELLOW,0, TL_RED,1);             // Отключаем жёлтый, включаем красный (горит только красный)
     tl_B.set(TL_YELLOW,0, TL_RED,1);             // Отключаем жёлтый, включаем красный (горит только красный)
     delay(5000);                                 // Ждём 5 секунд
}                                                 //

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

В коде setup() обоих скетчей выполняются следующие действия:

  • Обращением к функции begin() мы указываем, что модуль является светофором MODUL_TLIGHT и он регулирует дорогу с движением только прямо TRACK_F(F — Forward). При наличии перекрёстка вместо TRACK_F нужно указать TRACK_LF(LF — Left Forward), или TRACK_RF(RF — Right Forward) или TRACK_LFR(LFR — Left Forward Right). Третий параметр функции определяет наличие у светофора дополнительных секций поворотов и шлагбаума. Так как третий параметр функции не указан, значит у светофора нет ни секций поворотов, ни шлагбаума.
  • Обращением к функции irProtocol() мы указываем ИК-протокол передачи данных. Для трассы лучше использовать IR_IARDUINO, но можно использовать IR_SAMSUNG или IR_RC6.
  • Обращением к функции irAutoSend() мы заставляем модуль самостоятельно постоянно отправлять данные о состоянии светофора по ИК-каналу.
  • В первом скетче выполнено обращение к функции timing(), которой мы указали длительность свечения жёлтого и мигающего зелёного, равной 3 секундам. Это требуется, так как в полуавтоматическом режиме модуль включает эти цвета без нашего участия. Во втором скетче функция timing() не вызывалась, так как в ручном режиме мы сами задавали задержки после включения жёлтого и мигающего зелёного сигнала.

В коде loop() обоих скетчей выполнялись обращения к функциям set() и delay().

  • Обращением к функции set() в первом скетче мы указывали модулю действия: переключиться на разрешающий сигнал прямого направления TL_FORWARD_ON или запрещающий сигнал прямого направления TL_FORWARD_OFF. При наличии секций поворотов можно дополнительно указывать действия: TL_LEFT_ON, TL_LEFT_OFF, TL_RIGHT_ON и TL_RIGHT_OFF.
  • Обращением к функции set() во втором скетче мы передавали пары параметров для управления каждым цветом секций светофора по отдельности. Первое значение пары определяет секцию: TL_GREEN, TL_YELLOW, TL_RED, TL_RIGHT, TL_LEFT, TL_BEEP, TL_GATE или TL_ALL. А второе определяет её состояние: 0 — выкл, 1 — вкл, 2 — мигать.

Как видно из примеров, первый скетч выглядит более компактно и читаемо, поэтому скетчи остальных примеров будут приведены с полуавтоматическим управлением. При желании попробуйте самостоятельно переписать их для ручного управления.

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

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

Светофор

В магазин

Обсуждение

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