Светофор — это специальное устройство предназначенное для регулирования движения транспорта и пешеходов.
Назначение сигналов и секций светофора в ПДД:
Сигналы светофора:
Назначение круглых сигналов светофора определено в ст. 6.2 ПДД:
- ЗЕЛЕНЫЙ — разрешает движение (если мигает, значит время его действия истекает).
- ЖЕЛТЫЙ — запрещает движение (да! да! это запрещающий сигнал светофора).
- КРАСНЫЙ — запрещает движение (даже если он мигает или горит вместе с жёлтым).
- КРАСНЫЙ и ЖЁЛТЫЙ — запрещает движение, информируя о скором включении зеленого.
- ЖЕЛТЫЙ МИГАЮЩИЙ — информирует о нерегулируемом перекрестке или переходе.
Дополнительные секции поворота:
Назначение дополнительных секций поворота (стрелок поворота) определено в ст. 6.3 ПДД:
- ЗЕЛЁНАЯ СТРЕЛКА (дополнительная секция поворота) — разрешает движение в указанном направлении если она светится или мигает.
- Сигналы светофора, выполненные в виде стрелок, имеют то же значение, что и круглые сигналы соответствующего цвета, но их действие распространяется только на направлении, указываемом стрелкой.
Поведение на светофоре:
- Если светофор состоит только из трёх основных секций (красной, желтой и зеленой, без стрелок), то его сигналы распространяются на все направления. Например, при включении зелёного сигнала, можно ехать прямо, влево и вправо, если это не запрещено знаками ПДД. При манёврах влево и вправо необходимо убедиться, что Вы не создаёте помех иным участникам движения.
- Если светофор имеет дополнительную секцию поворота (влево и/или вправо) — значит движение в указанном направлении разрешено только при включении зелёного сигнала секции поворота. Например, если у светофора есть секция левого поворота, а светится только зелёный сигнал основного направления, значит разрешено движение только прямо и вправо.
- Дополнительно о светофорах: При наличии дополнительных секций поворота, на зелёные сигналы светофора наносятся стрелки определяющие направления в которых разрешено движение. Сигнал светофора разрешающий движение влево, разрешает и разворот, если это не запрещено знаками ПДД.
Последовательность переключения сигналов светофора:
![]() | Сигналы основных секций:
|
![]() | Сигналы дополнительных секций поворота:
|
Обратите внимание на то, что запрет движения (переключение от зелёного к красному, или отключение секций поворота) выполняется дольше чем разрешение движения (переключение от красного к зелёному, или включение секции поворота).
Инструкция по сборке светофора
- Установите блок светофора на стойку-основание

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 );Функция вызвана с 2 параметрами, которые указывают: переключиться на разрешение движения основными секциями, переключиться на запрет движения вправо, состояние левой секции светофора останется без изменений. Переключение сигналов (включение жёлтого, мигание зелёным) осуществляется модулем самостоятельно. Параметры можно указывать в любой последовательности. |
У функции 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см до нескольких метров.
При настройке добиваются уверенного приёма сигнала ИК-приёмником на необходимом расстоянии.
Порядок настройки мощности передачи:
- Установите светофор на трассу, выкрутив движок переменного резистора на минимум.
- Установите машинку на трассу в место, где она должна зафиксировать светофор (поймать ИК-сигнал)
- Включите машинку и светофор. Приёмник ИК сигнала, установленный на машинке, имеет синий светодиод, подписанный как "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 (если нет помех), значит светофор "сломан" (постоянно мигает жёлтый) или разрешается поворот налево по основному зелёному сигналу светофора у которого нет секции поворота налево.
- bool
- В данном скетче сначала выводятся все возможные направления движения на перекрёстке:
track_F
,track_R
,track_L
. Знание дорог перекрёстка позволяет выбрать направление движения автомобиля и включить поворотники до въезда на перекрёсток. - А затем выводятся направления в которых светофор разрешает движение:
forvard
,right
,left
. Знание состояния светофора позволяет остановиться до появления сигнала разрешающего движение в выбранном направлении. - В конце кода выводится состояние шлагбаума
gate
.
Обсуждение