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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если же Вы будете работать с модулем питания, используйте отдельный крепёж только слева. Правая часть соединится посредством крепления модуля питания.

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

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

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

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

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

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

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

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

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

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

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

После подключения модуля к шине I2C, светофор необходимо настроить на автономную работу с постоянной отправкой данных о его состоянии по ИК-каналу.

Данные, отправляемые светофором по ИК-каналу, содержат не только информацию о текущих цветах, но и о типе регулируемого им перекрёстка, наличии дополнительных секций поворота и шлагбаума. Эта информация указывается при инициализации светофора обращением к функции 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_AUTO, TRACK_FL, SECTION_L);
модуль инициирован как светофор, автоматически переключающий цвета,
регулирующий перекрёсток с дорогами прямо и налево,
светофор оснащён дополнительной секцией левого поворота.

Пример настройки светофора:

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

Светофор не имеет секций поворота и регулирует движение на переходе или переезде с дорогой только прямо:
#include <iarduino_I2C_Track.h>          // Подключаем библиотеку для работы с модулем трассы
iarduino_I2C_Track tlight;               // Объявляем объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track
                                         // Если при объявлении объекта указать адрес, например, iarduino_I2C_Track tlight(0x09), то пример будет работать с тем модулем, адрес которого был указан
void setup(){                            //
     tlight.begin(MODUL_TLIGHT_AUTO, TRACK_F); // Инициируем работу модуля в режиме светофора с автопереключением. Дорога только прямо. У светофора нет ни секций поворота, ни шлагбаума
     tlight.timing(5, 3, 10);            // Указываем время свечения зелёного (5 сек), жёлтого или мигающего зелёного (3 сек) и красного (10 сек) цветов для автоматического светофора
     tlight.irProtocol(IR_IARDUINO);     // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     tlight.indicator(true);             // Разрешаем работу светодиода, информирующего об отправке данных
     tlight.irAutoSend();                // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами, определённой ИК-протоколом по умолчанию ±50%
     tlight.offline(true);               // Указываем модулю сохранить все полученные настройки в энергонезависимую память и работать в автономном режиме
}                                        // Отключить автономный режим можно функцией offline() с параметром false
                                         //
void loop(){}                            //
Светофор имеет дополнительные секции левого и правого поворота и регулирует движение на перекрёстке с дорогами прямо, налево и направо:
#include <iarduino_I2C_Track.h>          // Подключаем библиотеку для работы с модулем трассы
iarduino_I2C_Track tlight;               // Объявляем объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track
                                         // Если при объявлении объекта указать адрес, например, iarduino_I2C_Track tlight(0x09), то пример будет работать с тем модулем, адрес которого был указан
void setup(){                            //
     tlight.begin(MODUL_TLIGHT_AUTO, TRACK_LRF, SECTION_LR); // Инициируем работу модуля в режиме светофора с автопереключением. Дорога прямо, налево и направо. У светофора есть секции левого и правого поворота
     tlight.timing(5, 3, 10);            // Указываем время свечения зелёного (5 сек), жёлтого или мигающего зелёного (3 сек) и красного (10 сек) цветов для автоматического светофора
     tlight.irProtocol(IR_IARDUINO);     // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     tlight.indicator(true);             // Разрешаем работу светодиода информирующего об отправке данных
     tlight.irAutoSend();                // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами определённой ИК протоколом по умолчанию ±50%
     tlight.offline(true);               // Указываем модулю сохранить все полученные настройки в энергонезависимую память и работать в автономном режиме
}                                        // Отключить автономный режим можно функцией offline() с параметром false
                                         //
void loop(){}                            //

Скетчи отличаются только параметрами функции begin().

Любой из двух скетчей можно запустить всего один раз, при наличии модуля светофор на шине I2C. Далее светофор будет постоянно и самостоятельно переключать свои цвета и передавать информацию об их состоянии при наличии питания. Для дальнейшей работы светофора не требуется его подключение к Piranha UNO, кроме случаев, когда Вы пожелаете изменить алгоритм работы модуля. Питание модуля без подключения к Piranha UNO удобно организовать, используя батарейный отсек.

Весь код обоих скетчей находится в теле функции setup():

  • Первой строкой кода мы обращаемся к функции begin(), указывая, что модуль является светофором, который должен автоматически переключать цвета MODUL_TLIGHT_AUTO.
    • В первом скетче указано, что светофор регулирует движение через переход или переезд с дорогой только прямо TRACK_F (Forward).
    • Во втором скетче указано, что светофор регулирует движение через перекрёсток с дорогами прямо, налево и направо TRACK_LRF (Left Right Forward), и у светофора есть дополнительные секции левого и правого поворота SECTION_LR (Left Right).
  • Обращением к функции timing() задаются временные интервалы свечения зелёного, жёлтого (и мигающего зелёного) и красного цветов светофора в секундах.
  • Функция irProtocol() позволяет назначить протокол для передачи данных по ИК-каналу. В скетче используется протокол IR_IARDUINO.
  • Функция indicator() позволяет управлять светодиодом, информирующем о передаче данных. В скетче функция вызвана с параметром true, разрешая работу индикаторного светодиода. Если вместо true указать false, то индикаторный светодиод будет выключен. Индикаторный светодиод позволяет видеть, когда модуль отправляет данные, отключение этого светодиода не отключает передачу данных.
  • Функция irAutoSend() указывает модулю начать постоянную отправку пакетов данных с информацией о текущем состоянии светофора. Если в качестве параметра указать число от 15 до 255 мс, то средняя пауза между отправляемыми по ИК-каналу пакетами будет равна указанному числу миллисекунд. В скетче функция вызвана без параметра, значит, средняя пауза между пакетами будет установлена в значение по умолчанию для выбранного протокола. Реальная пауза между отправляемыми пакетами устанавливается хаотично в диапазоне ±50% от указанного числа, что позволяет поставить знаки дорожного движения рядом со светофором, в одном направлении.
  • Функция offline() с параметром true указывает модулю запомнить полученные настройки, сохранив их в энергонезависимую память. После этого модуль будет работать автономно (сразу после подачи питания), даже если он не подключён к Piranha UNO по шине I2C, так, как будто он вновь получил все команды кода setup(). Для отключения автономного режима достаточно однократного обращения к функции offline()с параметром false.

Питание

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

1 способ: питание с помощью модуля

В модуль питания установите аккумулятор формата 14500 (Li-ion, 3,7V), соблюдая полярность.

Внимание!
Несоблюдение полярности при установке аккумулятора может привести к выходу светофора из строя. Будьте внимательны!

Модуль имеет собственную систему заряда аккумулятора. С обратной стороны модуля расположены светодиоды индикации работы, процесса заряда и окончания процесса заряда. 

Вы можете почитать подробнее про работу с модулем.

Для того, чтобы зарядить аккумулятор, подключите провод к разъёму type C на обратной стороне модуля или используйте специальные зарядные устройства.

2 способ: питание через колодку I2C

Напряжение питания знака через колодку I2C должно составлять от 3,5 до 5В. Также можно использовать питание от платы Arduino или USB. 

На рисунке слева питание подаётся через колодку I2C, а на рисунке справа — через металлизированные отверстия крепления основания со стороны с надписью «Аккумулятор».

Допускается использовать три батарейки типа АА или ААА.

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

Расстояние передачи информации настраивается подстроечным резистором и варьируется в диапазоне от 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.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, так как в автономном режиме работы светофора, шлагбаум самостоятельно поднимается до включения разрешающих сигналов светофора.
Ну что же, поздравляем!
Вы освоили основы программирования, выполнили множество упражнений и проектов. Не стесняйтесь возвращаться к предыдущим урокам, если что-нибудь забыли. А мы предлагаем двигаться дальше и переходить к следующей главе.
перейти к выбору главы

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

Светофор

В магазин

Обсуждение

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