Светофор — это специальное устройство, предназначенное для регулирования движения транспорта и пешеходов.
Назначение сигналов и секций светофора в ПДД:
Сигналы светофора:
Назначение круглых сигналов светофора определено в ст. 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);Функция вызвана с двумя параметрами, которые указывают следующее: переключиться на разрешение движения основными секциями, переключиться на запрет движения вправо. Состояние левой секции светофора останется без изменений. Переключение сигналов (включение жёлтого, мигание зелёным) осуществляется модулем самостоятельно. Параметры можно указывать в любой последовательности. |
У функции 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.
















Обсуждение