Светофор — это специальное устройство, предназначенное для регулирования движения транспорта и пешеходов.
Назначение сигналов и секций светофора в ПДД:
Сигналы светофора:
Назначение круглых сигналов светофора определено в ст. 6.2 ПДД:
- ЗЕЛЕНЫЙ — разрешает движение (если мигает, значит, время его действия истекает);
- ЖЕЛТЫЙ — запрещает движение (да-да, это запрещающий сигнал светофора);
- КРАСНЫЙ — запрещает движение (даже если он мигает или горит вместе с жёлтым);
- КРАСНЫЙ и ЖЁЛТЫЙ — запрещают движение, информируя о скором включении зеленого;
- ЖЕЛТЫЙ МИГАЮЩИЙ — информирует о нерегулируемом перекрестке или переходе.
Дополнительные секции поворота:
Назначение дополнительных секций поворота (стрелок поворота) определено в ст. 6.3 ПДД:
- ЗЕЛЁНАЯ СТРЕЛКА (дополнительная секция поворота) — разрешает движение в указанном направлении если она светится или мигает.
- Сигналы светофора, выполненные в виде стрелок, имеют то же значение, что и круглые сигналы соответствующего цвета, но их действие распространяется только на направление, указываемое стрелкой.
Поведение на светофоре:
- Если светофор состоит только из трёх основных секций (красной, желтой и зеленой, без стрелок), то его сигналы распространяются на все направления. Например, при включении зелёного сигнала, можно ехать прямо, влево и вправо, если это не запрещено знаками ПДД. При манёврах влево и вправо необходимо убедиться, что Вы не создаёте помех другим участникам движения.
- Если светофор имеет дополнительную секцию поворота (влево и/или вправо), значит, движение в указанном направлении разрешено только при включении зелёного сигнала секции поворота. Например, если у светофора есть секция левого поворота, а светится только зелёный сигнал основного направления, значит разрешено движение только прямо и направо.
- Дополнительно о светофорах: при наличии дополнительных секций поворота, на зелёные сигналы светофора наносятся стрелки, определяющие направления, в которых разрешено движение. Сигнал светофора, разрешающий движение влево, разрешает и разворот, если это не запрещено знаками ПДД.
Последовательность переключения сигналов светофора:
![]() | Сигналы основных секций:
|
![]() | Сигналы дополнительных секций поворота:
|
Обратите внимание на то, что запрет движения (переключение от зелёного к красному или отключение секций поворота) выполняется дольше, чем разрешение движения (переключение от красного к зелёному или включение секции поворота).
Инструкция по сборке светофора
- Установите блок светофора на стойку-основание.
![](http://iarduino.ru/img/upload/7885e1d13fc7887e80d2986e166b3de7.png)
2. В случае, если Вы используете светофор без модуля питания, соедините детали при помощи крепежа, винтов и гаек как с правой, так и с левой стороны.
Если же Вы будете работать с модулем питания, используйте отдельный крепёж только слева. Правая часть соединится посредством крепления модуля питания.
![](http://iarduino.ru/img/upload/76dc052f3fa07df232631be71c282ea4.png)
3. Соедините крестовину, как показано на рисунке
![](http://iarduino.ru/img/upload/ecae995ea9deadb81477032df0b3b051.png)
4. Закрепите светофор на крестовине при помощи винтов и гаек.
![](http://iarduino.ru/img/upload/86f132e33f080d445bea7953b840ca39.png)
5. Вы также можете вставить дополнительные секции.
![](http://iarduino.ru/img/upload/4b1b7abe8ea78a4d11d3171d85ad7c04.png)
6. Собранный светофор должен выглядеть следующим образом:
Видеопояснение:
Схема установки светофора на трассе:
![](http://iarduino.ru/img/upload/640a3e58b58ca708ef4b7530595fe750.png)
Центр светофора должен находиться в 15 см от линий, образующих перекрёсток, а сам светофор — располагаться под углом 45° относительно линии движения автомобиля.
Угол распространения ИК-данных составляет около 80°, а дальность передачи ИК-данных настраивается поворотом крестовины резистора на обратной стороне платы основания.
Первое включение и настройка светофора:
После сборки светофора, его требуется подключить к Piranha UNO по шине I2C, как указано ниже:
![](http://iarduino.ru/img/upload/303dc2c034065c70ff302b8634f40d1e.png)
Сверху изображено подключение к 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 способ: питание с помощью модуля
![](http://iarduino.ru/img/upload/1210e03135776fcac3a1f8e1aa1954a7.png)
В модуль питания установите аккумулятор формата 14500 (Li-ion, 3,7V), соблюдая полярность.
Внимание!
Несоблюдение полярности при установке аккумулятора может привести к выходу светофора из строя. Будьте внимательны!
Модуль имеет собственную систему заряда аккумулятора. С обратной стороны модуля расположены светодиоды индикации работы, процесса заряда и окончания процесса заряда.
Вы можете почитать подробнее про работу с модулем.
Для того, чтобы зарядить аккумулятор, подключите провод к разъёму type C на обратной стороне модуля или используйте специальные зарядные устройства.
2 способ: питание через колодку I2C
Напряжение питания знака через колодку I2C должно составлять от 3,5 до 5В. Также можно использовать питание от платы Arduino или USB.
![](http://iarduino.ru/img/upload/4bb58a30dcb293be40544a8e326730c8.png)
На рисунке слева питание подаётся через колодку I2C, а на рисунке справа — через металлизированные отверстия крепления основания со стороны с надписью «Аккумулятор».
Допускается использовать три батарейки типа АА или ААА.
Настройка расстояния передачи ИК-сигнала
![](http://iarduino.ru/img/upload/afdbac462b9d03f81e2e07da8ae2a805.png)
Расстояние передачи информации настраивается подстроечным резистором и варьируется в диапазоне от 20-30 см до нескольких метров.
При настройке добиваются уверенного приёма сигнала ИК-приёмником на необходимом расстоянии.
Порядок настройки мощности передачи:
- Установите светофор на трассу, выкрутив движок переменного резистора на минимум.
- Установите машинку на трассу в место, где она должна зафиксировать светофор (поймать ИК-сигнал).
- Включите машинку и светофор. Приёмник ИК-сигнала, установленный на машинке, имеет синий светодиод, подписанный как «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 (если нет помех), значит светофор «сломан» (постоянно мигает жёлтый) или разрешается поворот налево по основному зелёному сигналу светофора, у которого нет секции поворота налево.
- bool
- В данном скетче сначала выводятся все возможные направления движения на перекрёстке:
track_F
,track_R
,track_L
. Знание дорог перекрёстка позволяет выбрать направление движения автомобиля и включить поворотники до въезда на перекрёсток. - А затем выводятся направления, в которых светофор разрешает движение:
forvard
,right
,left
. Знание состояния светофора позволяет остановиться до появления сигнала, разрешающего движение в выбранном направлении. - В скетче не проверяется состояние шлагбаума
gate
, так как в автономном режиме работы светофора, шлагбаум самостоятельно поднимается до включения разрешающих сигналов светофора.
Обсуждение