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