Светофор с дополнительными секциями (с внешним управлением)

Светофор — это специальное устройство, предназначенное для регулирования движения транспорта и пешеходов.

Назначение сигналов и секций светофора в ПДД:

Сигналы светофора:

Назначение круглых сигналов светофора определено в ст. 6.2 ПДД:

  • ЗЕЛЕНЫЙ — разрешает движение (если мигает, значит, время его действия истекает);
  • ЖЕЛТЫЙ — запрещает движение (да-да, это запрещающий сигнал светофора);
  • КРАСНЫЙ — запрещает движение (даже если он мигает или горит вместе с жёлтым);
  • КРАСНЫЙ и ЖЁЛТЫЙ — запрещает движение, информируя о скором включении зеленого;
  • ЖЕЛТЫЙ МИГАЮЩИЙ — информирует о нерегулируемом перекрестке или переходе.

Дополнительные секции поворота:

Назначение дополнительных секций поворота (стрелок поворота) определено в ст. 6.3 ПДД:

  • ЗЕЛЁНАЯ СТРЕЛКА (дополнительная секция поворота) — разрешает движение в указанном направлении, если она светится или мигает;
  • Сигналы светофора, выполненные в виде стрелок, имеют то же значение, что и круглые сигналы соответствующего цвета, но их действие распространяется только на направление, указываемое стрелкой.

Поведение на светофоре:

  • Если светофор состоит только из трёх основных секций (красной, желтой и зеленой, без стрелок), то его сигналы распространяются на все направления. Например, при включении зелёного сигнала, можно ехать прямо, влево и вправо, если это не запрещено знаками ПДД. При манёврах влево и вправо необходимо убедиться, что Вы не создаёте помех другим участникам движения.
  • Если светофор имеет дополнительную секцию поворота (влево и/или вправо), значит, движение в указанном направлении разрешено только при включении зелёного сигнала секции поворота. Например, если у светофора есть секция левого поворота, а светится только зелёный сигнал основного направления, значит, разрешено движение только прямо и направо.
  • Дополнительно о светофорах: при наличии дополнительных секций поворота, на зелёные сигналы светофора наносятся стрелки, определяющие направления, в которых разрешено движение. Сигнал светофора, разрешающий движение влево, разрешает и разворот, если это не запрещено знаками ПДД.

Последовательность переключения сигналов светофора:

Сигналы основных секций:

  • Переключение сигналов основных секций от зелёного к красному:
    • Светится только зелёный.
    • Зелёный мигает.
    • Гаснет зелёный, и включается только жёлтый.
    • Гаснет жёлтый, и включается только красный.
  • Переключение сигналов основных секций от красного к зелёному:
    • Светится только красный.
    • Включается жёлтый, при этом красный не гаснет (светятся жёлтый и красный).
    • Гаснут красный и жёлтый, включается только зелёный.

Сигналы дополнительных секций поворота:

  • Отключение секции поворота:
    • Светится зелёный сигнал секции поворота.
    • Зелёный мигает (информируя о скором отключении).
    • Секция отключается (не светится).
  • Включение секции поворота:
    • Секция отключена (не светится).
    • Включается зелёный сигнал секции поворота (без предупреждения).

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

Инструкция по сборке светофора

  1. Установите блок светофора на стойку-основание.

2. Соедините детали при помощи крепежа, винтов и гаек как с правой, так и с левой стороны.

3. Соедините крестовину, как показано на рисунке

4. Закрепите светофор на крестовине при помощи винтов и гаек.

5. Вы также можете вставить дополнительные секции.

6. Собранный светофор должен выглядеть следующим образом:

Видеопояснение:

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

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

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

Первое включение и настройка светофора:

После сборки светофора, его требуется подключить к Piranha UNO по шине I2C, как указано ниже:

Сверху изображено подключение к Piranha UNO напрямую, а ниже — через Trema Shield.

Данные, отправляемые светофором по ИК-каналу, содержат не только информацию о текущих цветах, но и о типе регулируемого им перекрёстка, наличии дополнительных секций поворота и шлагбаума. Эта информация указывается при инициализации светофора обращением к функции begin(), которая может принимать до 3 параметров:

Параметры функции begin():

Назначение:Возможные значения:
1 параметр
определяет
тип модуля
MODUL_TLIGHT — модуль является светофором.
MODUL_TLIGHT_AUTO — светофор с автопереключением цветов.
2 параметр
определяет
тип перекрёстка
TRACK_F — на светофоре есть дорога только прямо.
TRACK_FL — на светофоре есть дорога прямо и налево.
TRACK_FR — на светофоре есть дорога прямо и направо.
TRACK_LR — на светофоре есть дорога налево и направо.
TRACK_LRF — на светофоре есть дорога прямо, налево и направо.
Буквы L (left), R (right), F (forward) можно указывать в любом порядке.
3 параметр
определяет
наличие секций


если нет секций
и нет шлагбаума,
то параметр
не указывается
SECTION_L — у светофора есть секция левого поворота.
SECTION_R — у светофора есть секция правого поворота.
SECTION_G — у светофора есть шлагбаум.
SECTION_LR — есть секции левого и правого поворота.
SECTION_LG — есть секция левого поворота и шлагбаум.
SECTION_RG — есть секция правого поворота и шлагбаум.
SECTIONT_LRG — есть обе секции поворота и шлагбаум.
Буквы L (left), R (right), G (gate) можно указывать в любом порядке.
Пример
инициализации
begin(MODUL_TLIGHT, TRACK_FL, SECTION_L);
модуль инициирован как светофор,
регулирующий перекрёсток с дорогами прямо и налево,
светофор оснащён дополнительной секцией левого поворота.

Если модуль инициирован как светофор (без автопереключения цветов), то управление светофором осуществляется обращением к функции set() в ручном или полуавтоматическом режиме. В первом случае Вы самостоятельно управляете каждым цветом светофора, во втором — указываете разрешить или запретить движение в заданном направлении.

Параметры функции set():

Для управления каждым цветом светофора (ручное управление), функция SET() вызывается с указанием от одной до семи пар параметров:

Назначение:Возможные значения:
1 параметр пары
указывает секцию
для управления
TL_RED — красный сигнал светофора.
TL_YELLOW — жёлтый сигнал светофора.
TL_GREEN — зелёный сигнал светофора.
TL_RIGHT — стрелка светофора направо.
TL_LEFT — стрелка светофора налево.
TL_BEEP — звуковой сигнал шлагбаума.
TL_GATE — шлагбаум.
TL_ALL — все цвета, стрелки, звуковой сигнал и шлагбаум.
2 параметр пары
указывает новое
состояние для
выбранной секции
0 или false — отключить.
1 или true — включить.
2 — мигать с частотой 1 Гц.
Пример
ручного управления
set(TL_GREEN, true, TL_YELLOW, false, TL_RED, false);
Функция вызвана с 3 парами параметров, которые указывают следующее:
зелёный включить, жёлтый отключить, красный отключить. Состояния
остальных секции светофора и шлагбаума останутся без изменений.
Указанные значения моментально отражаются на состоянии светофора.
Пары параметров можно указывать в любой комбинации.

Для запрета или разрешения движения в заданном направлении (полуавтоматический режим) функция set() вызывается с указанием от 1 до 3 параметров:

Направление:Действие:
Основные секцииTL_FORWARD_ON — переключиться на разрешение движения.
TL_FORWARD_OFF — переключиться на запрет движения.
Секция налевоTL_LEFT_ON — разрешить движение.
TL_LEFT_OFF — переключиться на запрет движения.
Секция направоTL_RIGHT_ON — разрешить движение.
TL_RIGHT_OFF — переключиться на запрет движения.
Пример
полуавтоматического
управления
set(TL_FORWARD_ON, TL_RIGHT_OFF);
Функция вызвана с двумя параметрами, которые указывают следующее:
переключиться на разрешение движения основными секциями,
переключиться на запрет движения вправо.
Состояние левой секции светофора останется без изменений.
Переключение сигналов (включение жёлтого, мигание зелёным)
осуществляется модулем самостоятельно.
Параметры можно указывать в любой последовательности.

У функции set() нет параметра для управления шлагбаумом в полуавтоматическом режиме. В этом режиме он автоматически открывается (при разрешении движения прямо, налево или направо) и закрывается при запрете движения прямо, если запрещено движение налево и направо.

Функция допускает комбинировать параметры ручного и полуавтоматического управления.

Вы сами решаете, как Вам легче управлять светофором. Ниже представлены примеры управления двумя светофорами в ручном и полуавтоматическом режиме.

Важно: при управлении несколькими светофорами, подключёнными к одной шине I2C, каждому из них необходимо предварительно задать разные адреса.

Для этого воспользуйтесь скетчем из меню Arduino IDE:

Файл / Примеры / iarduino I2C Track (модуль трассы) / NewAddress

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

В данном примере светофор настроен на регулировку движения через переход или переезд, на котором есть дорога только в прямом направлении. У светофора нет дополнительных секций левого и правого поворота. Зелёный сигнал основного направления будет светиться в течении 10 секунд. Жёлтый сигнал и мигающий зелёный будет длиться 3 секунды, а красный сигнал — 5 секунд.

#include <iarduino_I2C_Track.h>                // Подключаем библиотеку для работы с модулем трассы.
iarduino_I2C_Track a(0x09);                    // Создаём объект «a» для работы со светофором, указав его адрес на шине I2C (0x09).
                                               //
void setup(){                                  //
     a.begin(MODUL_TLIGHT, TRACK_F);           // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога только прямо (TRACK_F).
     a.irProtocol(IR_IARDUINO);                // Указываем протокол передачи данных по ИК-каналу: «IARDUINO».
     a.indicator(true);                        // Разрешаем работу светодиода, информирующего об отправке данных.
     a.irAutoSend();                           // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
     a.set(TL_GREEN,0, TL_YELLOW,0, TL_RED,1); // Устанавливаем начальное состояние светофора (горит только красный).
}                                              //
                                               //
void loop(){                                   //
//   Фаза 1: (с красного на зелёный)           // Горел только красный на двух светофорах.
     a.set(TL_YELLOW,1);                       // Включаем жёлтый (горит красный и жёлтый).
     delay(3000);                              // Ждём 3 секунды.
     a.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0); // Включаем зелёный, отключаем жёлтый и красный (горит только зелёный).
     delay(10000);                             // Ждём 10 секунд.
//   Фаза 2: (с зелёного на красный)           // Горел только зелёный на двух светофорах.
     a.set(TL_GREEN,2);                        // Мигаем зелёным (светится только зелёный, мигая).
     delay(3000);                              // Ждём 3 секунды.
     a.set(TL_GREEN,0, TL_YELLOW,1);           // Отключаем зелёный, включаем жёлтый (горит только жёлтый).
     delay(3000);                              // Ждём 3 секунды.
     a.set(TL_YELLOW,0, TL_RED,1);             // Отключаем жёлтый, включаем красный (горит только красный).
     delay(5000);                              // Ждём 5 секунд.
}                                              //

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

Данный пример отличается от предыдущего только параметрами обращения к функции set()и наличием функции timing(). Светофор данного примера будет работать как светофор предыдущего примера.

#include <iarduino_I2C_Track.h>         // Подключаем библиотеку для работы с модулем трассы
iarduino_I2C_Track a(0x09);             // Создаём объект «a» для работы со светофором, указав его адрес на шине I2C (0x09)
                                        //
void setup(){                           //
     a.begin(MODUL_TLIGHT, TRACK_F);    // Инициируем работу со светофором, указав, что на его перекрёстке есть дорога только прямо (TRACK_F)
     a.irProtocol(IR_IARDUINO);         // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     a.indicator(true);                 // Разрешаем работу светодиода, информирующего об отправке данных
     a.irAutoSend();                    // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%
     a.timing(3);                       // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора — 3 сек
}                                       //
                                        //
void loop(){                            //
//   Фаза 1: (с красного на зелёный)    //
     a.set(TL_FORWARD_ON );             // Разрешаем движение в прямом направлении.
     delay(13000);                      // Ждём 13 секунд. За это время светофор переключится с красного на красный и жёлтый, подождёт 3 секунды и включит зелёный, который будет светится оставшиеся 10 из 13 секунд
//   Фаза 2: (с зелёного на красный)    //
     a.set(TL_FORWARD_OFF);             // Запрещаем движение в прямом направлении.
     delay(11000);                      // Ждём 11 секунд. За это время светофор переключится с зелёного на мигающий зелёный, подождёт 3 секунды, переключится на жёлтый, подождёт 3 секунды, переключится на красный, который будет светится оставшиеся 5 из 11 секунд
}                                       //

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

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

  • Обращением к функции begin() мы указываем, что модуль является светофором MODUL_TLIGHT, и он регулирует дорогу с движением только прямо TRACK_F. При наличии перекрёстка вместо TRACK_F нужно указать TRACK_LF, или TRACK_RF или TRACK_LFR. Так как третий параметр функции не указан, значит, у светофора нет ни секций поворотов, ни шлагбаума.
  • Обращением к функции irProtocol() мы указываем ИК-протокол передачи данных. Для трассы лучше использовать IR_IARDUINO, но можно использовать IR_SAMSUNG или IR_RC6.
  • Функция indicator() позволяет управлять светодиодом, информирующем о передаче данных. В скетче функция вызвана с параметром true, разрешая работу индикаторного светодиода. Если вместо true указать false, то индикаторный светодиод будет выключен. Индикаторный светодиод позволяет видеть, когда модуль отправляет данные, отключение этого светодиода не отключает передачу данных.
  • Обращением к функции irAutoSend() мы заставляем модуль самостоятельно постоянно отправлять данные о состоянии светофора по ИК-каналу.
  • В первом скетче выполнено обращение к функции set() для установки начального состояния светофора (горит только красный). Это требуется для корректной работы светофора при первом проходе цикла loop().
  • Во втором скетче выполнено обращение к функции timing(), которой мы указали длительность свечения жёлтого и мигающего зелёного, равной 3 секундам. Это требуется, так как в полуавтоматическом режиме модуль включает эти цвета без нашего участия. В первом скетче функция timing() не вызывалась, так как в ручном режиме мы сами задавали задержки после включения жёлтого и мигающего зелёного сигнала.

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

  • В первом скетче функции set() передаются пары параметров для управления теми секциями, состояние которых требуется изменить.
  • Во втором скетче функция set() вызывается с одним параметром, указывающим разрешить или запретить движение в прямом направлении. При наличии секций поворотов можно дополнительно указывать действия: TL_LEFT_ON, TL_LEFT_OFF, TL_RIGHT_ON и TL_RIGHT_OFF.

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

Питание

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

Однако, в данном варианте управления (с помощью внешнего контроллера) питание от модуля питания не предусмотрено. Поэтому рассмотрим вариант с питанием через колодку I2C.

Светофор получает питание с помощью шины I2C, а питание управляющего контроллера может производиться любым удобным способом: с помощью USB (верхний рисунок) или с помощью других источников питания, например, трёх батареек с суммарным напряжением 4,5В (нижний рисунок).

Настройка расстояния передачи ИК-сигнала

Расстояние передачи информации настраивается подстроечным резистором и варьируется в диапазоне от 20-30 см до нескольких метров. 

При настройке добиваются уверенного приёма сигнала ИК-приёмником на необходимом расстоянии.

Порядок настройки мощности передачи:

  1. Установите светофор на трассу, выкрутив движок переменного резистора на минимум.
  2. Установите машинку на трассу в место, где она должна зафиксировать светофор (поймать ИК-сигнал).
  3. Включите машинку и светофор. Приёмник ИК сигнала, установленный на машинке, имеет синий светодиод, подписанный как «IN». Он вспыхивает в момент регистрации сигнала. Отрегулируйте мощность знака до появления вспышек светодиода «IN».

Пример получения данных от светофора на стороне приёмника:

Получение данных, отправленных светофором по ИК-каналу, осуществляется при помощи Trema модуля ИК-приёмник/передатчик, Flash-I2C.

#include <iarduino_I2C_IR.h>                          // Подключаем библиотеку для работы с Trema модулями ИК-приёмник/передатчик I2C-flash
iarduino_I2C_IR ir(0x09);                             // Объявляем объект ir для работы с функциями и методами библиотеки iarduino_I2C_IR, указывая адрес модуля на шине I2C
                                                      // Если объявить объект без указания адреса (iarduino_I2C_IR ir;), то адрес будет найден автоматически
void setup(){                                         //
     Serial.begin(9600);                              // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек
     ir.begin();                                      // Инициируем работу с ИК-приёмником/передатчиком I2C-flash
     ir.setProtocol(IR_IARDUINO);                     // Указываем протокол для приёма/передачи данных по ИК-каналу
}                                                     //
                                                      //
void loop(){                                          //
//   Если приняты ИК-данные:                          //
     if( ir.check(true) ){                            // Если принят пакет данных или пакет повтора
 //  Если данные приняты от светофора:                //
     if( ir.device==MODUL_TLIGHT ){                   // Если устройство, отправившее данные, является светофором
         Serial.print("Светофор: регулирует ");       //
     //  Выводим направления дорог перекрёстка:       // 
         Serial.print("перекрёсток с проездом ");     //
         if( ir.track_L ){Serial.print("налево, " );} // Если track_L равен true, значит, на перекрёстке есть поворот налево
         if( ir.track_F ){Serial.print("прямо, "  );} // Если track_F равен true, значит, на перекрёстке есть движение прямо
         if( ir.track_R ){Serial.print("направо, ");} // Если track_R равен true, значит, на перекрёстке есть поворот направо
     //  Выводим состояние светофора:                 //
         Serial.print("сигналы светофора ");          //
         if( !ir.left && !ir.forvard && !ir.right ){  // Если left и forvard и right равны 0, значит,
             Serial.print("запрещают движение, ");    // светофор запрещает движение в любом направлении
         }else{                                       //
             Serial.print("разрешают движение ");     // 
         }                                            //
         if( ir.left    ){Serial.print("влево, " );}  // Если left больше 0, значит, светофор разрешает поворот налево
         if( ir.forvard ){Serial.print("прямо, " );}  // Если forvard больше 0, значит, светофор разрешает движение прямо
         if( ir.right   ){Serial.print("вправо, ");}  // Если right больше 0, значит, светофор разрешает поворот направо
         Serial.print("шлагбаум ");                   // 
         if( ir.gate    ){Serial.print("поднят." );}  // Если gate больше 0, значит, шлагбаум поднят, разрешая движение
         else            {Serial.print("опущен." );}  //
         Serial.println("");                          //
     }                                                //
     }                                                //
}                                                     //

Действия, выполняемые в коде Setup():

  • Первой строкой выполняется инициализация передачи данных в монитор последовательного порта Serial.begin() на скорости 9600 бит/сек.
  • Далее выполняется инициализация работы с модулем ИК-приёмник/передатчик begin().
  • Последняя строка указывает ИК-протокол приёма/передачи данных setProtocol(). Протоколы светофора и приёмника должны совпадать. В скетче используется протокол IR_IARDUINO.

Действия, выполняемые в коде loop():

  • В первой строке выполняется проверка наличия принятых по ИК-каналу данных. Для проверки наличия данных, полученных от модулей трассы, обращение к функции check() должно выполняться с параметром true (в этом случае функция реагирует на пакеты повторов).
  • Второй строкой кода выполняется проверка принятых данных на принадлежность к модулям светофоров. Если ИК-данные приняты от модулей светофоров, то переменная device содержит константу MODUL_TLIGHT.
  • Если обе проверки успешно пройдены, то информацию о состоянии светофора можно получить из переменных:
    • bool track_F — флаг, указывающий о наличии дороги прямо (0-нет, 1-есть);
    • bool track_R — флаг, указывающий о наличии поворота вправо (0-нет, 1-есть);
    • bool track_L — флаг, указывающий о наличии поворота влево (0-нет, 1-есть);
    • uint8_t forvard — разрешает движение прямо (0-нельзя, 1-можно, 2-если нет помех);
    • uint8_t right — разрешает движение вправо (0-нельзя, 1-можно, 2-если нет помех);
    • uint8_t left — разрешает движение влево (0-нельзя, 1-можно, 2-если нет помех);
    • uint8_t gate — флаг состояния шлагбаума (0-закрыт, 1-открыт);
    • Биты состояний всех цветов светофора и состояния шлагбаума можно прочитать из байта команды ИК-устройства command;
    • Если переменные forvard, right или left имеют значение 2 (если нет помех), значит, светофор «сломан» (постоянно мигает жёлтый) или разрешается поворот налево по основному зелёному сигналу светофора, у которого нет секции поворота налево.
  • В данном скетче сначала выводятся все возможные направления движения на перекрёстке: track_F, track_R, track_L. Знание дорог перекрёстка позволяет выбрать направление движения автомобиля и включить поворотники до въезда на перекрёсток.
  • А затем выводятся направления, в которых светофор разрешает движение: forvard, right, left. Знание состояния светофора позволяет остановиться до появления сигнала, разрешающего движение в выбранном направлении.
  • В конце кода выводится состояние шлагбаума gate.
Ну что же, поздравляем!
Вы освоили основы программирования, выполнили множество упражнений и проектов. Не стесняйтесь возвращаться к предыдущим урокам, если что-нибудь забыли. А мы предлагаем двигаться дальше и переходить к следующей главе.
перейти к выбору главы

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

Светофор

В магазин

Обсуждение

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