Шлагбаум для светофора

Шлагбаум — это специальное устройство, предназначенное для контроля проезда транспорта. В данной статье шлагбаум устанавливается вместе со светофором, назначение сигналов которого доступно в следующих  разделах: автоматический светофор и светофор с внешним управлением.

Инструкция по сборке шлагбаума

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

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

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

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

4. Установите собранное основание на крестовину.

5. Установите сервопривод между двумя элементами, скрепив их винтами.

6. Закрепите винтами блок шлагбаума. Также закрепите винтом нижнюю часть основания (см. рисунок).

7. Соедините вместе части шлагбаума, как показано на рисунке, при помощи винтов и гаек.

8. Закрепите насадку сервопривода на шлагбауме с обратной стороны. На втором и третьем видах рисунка показан результат спереди и сверху.

9. Подключите сервопривод к колодке с надписью «СЕРВО». Закрепите шлагбаум на валу сервопривода при помощи шурупа.

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

Схема установки шлагбаума на трассе

Мы предполагаем, что шлагбаум устанавливается перпендикулярно дороге, а его наличие фиксируется ультразвуковым датчиком расстояния (левая часть рисунка). В этом случае центр модуля-шлагбаума устанавливается таким образом, чтобы круглая часть шлагбаума (с надписью «STOP» располагалась над линией трассы. Обращаем внимание, что в данном случае ИК-сигнал не будет фиксироваться автомобилем.

Также возможен вариант установки аналогично всем остальным знакам — под углом 45° относительно линии движения автомобиля. Угол распространения ИК-данных составляет около 80°, а дальность передачи ИК данных настраивается поворотом крестовины резистора на обратной стороне платы основания. В данном случае центр модуля-шлагбаума должен находиться в 15 см от линии трассы.

Первое включение и настройка шлагбаума:

После сборки шлагбаума, его требуется подключить к 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_F, SECTION_G);
модуль инициирован как светофор, автоматически переключающий цвета,
регулирующий проезд по дороге с движением только прямо,
светофор оснащён шлагбаумом.

Пример работы светофора со шлагбаумом в автоматическом режиме:

В автоматическом режиме шлагбаум опускается при включении красного и поднимается при включении красного с жёлтым.

#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, SECTION_G); // Инициируем работу модуля в режиме светофора с автопереключением. Дорога только прямо. У светофора есть шлагбаум
     tlight.timing(10, 3, 5);            // Указываем время свечения зелёного (10 сек), жёлтого или мигающего зелёного (3 сек) и красного (5 сек) цветов для автоматического светофора
     tlight.irProtocol(IR_IARDUINO);     // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     tlight.indicator(true);             // Разрешаем работу светодиода, информирующего об отправке данных
     tlight.irAutoSend();                // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами, определённой ИК-протоколом по умолчанию ±50%
     tlight.offline(true);               // Указываем модулю сохранить все полученные настройки в энергонезависимую память и работать в автономном режиме
}                                        // Отключить автономный режим можно функцией offline() с параметром false
                                         //
void loop(){}                            //

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

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

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

Управление светофорами со шлагбаумом по шине I2C:

Важно: при управлении несколькими модулями, подключёнными к одной шине I2C, всем модулям необходимо предварительно задать разные адреса.

Для этого воспользуйтесь скетчем из меню Arduino IDE:

Файл / Примеры / iarduino I2C Track (модуль трассы) / NewAddress

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

Для запрета или разрешения движения в заданном направлении (полуавтоматический режим) функция 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() нет параметра для управления шлагбаумом в полуавтоматическом режиме. В этом режиме он автоматически открывается (при разрешении движения прямо, налево или направо) и закрывается при запрете движения прямо, если запрещено движение налево и направо.

Функция допускает комбинировать параметры ручного и полуавтоматического управления.

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

Пример управления светофором со шлагбаумами в ручном режиме:

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

#include <iarduino_I2C_Track.h>                    // Подключаем библиотеку для работы с модулем трассы
iarduino_I2C_Track a(0x09);                        // Создаём объект «a», для работы со светофором, указав его адрес на шине I2C (0x09)
                                                   //
void setup(){                                      //
     a.begin(MODUL_TLIGHT, TRACK_F, SECTION_G);    // Инициируем работу со светофором (MODUL_TLIGHT), указав, что на его перекрёстке есть дорога только прямо (TRACK_F), светофор оснащён шлагбаумом (SECTION_G)
     a.irProtocol(IR_IARDUINO);                    // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     a.indicator(true);                            // Разрешаем работу светодиода, информирующего об отправке данных
     a.irAutoSend();                               // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%
     a.set(TL_ALL,0);  a.set(TL_GREEN,1);          // Устанавливаем начальное состояние светофора (горит только зелёный)
     delay(10000);                                 // Ждём 10 секунд
}                                                  //
                                                   //
void loop(){                                       //
//   Фаза 1: (запрещаем проезд)                    // Горел только зелёный, и был открыт шлагбаум
     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, TL_GATE,1, TL_BEEP,2); // Отключаем жёлтый, включаем красный, закрываем шлагбаум, включаем прерывистый звук (горит только красный)
     delay(5000);                                  // Ждём 5 секунд
//   Фаза 2: (разрешаем проезд)                    // Горел только красный, и был закрыт шлагбаум
     a.set(TL_YELLOW,1, TL_GATE,0, TL_BEEP,0);     // Включаем жёлтый, открываем шлагбаум, отключаем звук (горит красный и жёлтый)
     delay(3000);                                  // Ждём 3 секунды
     a.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0);     // Включаем зелёный, отключаем жёлтый и красный (горит только зелёный)
     delay(10000);                                 // Ждём 10 секунд
}                                                  //

Пример управления светофором, оснащённым шлагбаумом, в полуавтоматическом режиме:

Данный пример отличается от предыдущего только параметрами обращения к функции set()и наличием функции timing(). Светофор данного примера будет работать как светофор предыдущего примера.

#include <iarduino_I2C_Track.h>                    // Подключаем библиотеку для работы с модулем трассы
iarduino_I2C_Track a(0x09);                        // Создаём объект «a» для работы со светофором, указав его адрес на шине I2C (0x09)
                                                   //
void setup(){                                      //
     a.begin(MODUL_TLIGHT, TRACK_F, SECTION_G);    // Инициируем работу со светофором (MODUL_TLIGHT), указав, что на его перекрёстке есть дорога только прямо (TRACK_F), светофор оснащён шлагбаумом (SECTION_G)
     a.irProtocol(IR_IARDUINO);                    // Указываем протокол передачи данных по ИК-каналу: «IARDUINO»
     a.indicator(true);                            // Разрешаем работу светодиода, информирующего об отправке данных
     a.irAutoSend();                               // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%
     a.timing(3);                                  // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3 сек
}                                                  //
                                                   //
void loop(){                                       //
//   Фаза 1: (запрещаем проезд)                    //
     a.set(TL_FORWARD_OFF);                        // Запрещаем движение в прямом направлении
     delay(11000);                                 // Ждём 11 секунд. За это время светофор переключится с зелёного на мигающий зелёный, подождёт 3 секунды, переключится на жёлтый, подождёт 3 секунды, переключится на красный, который будет светиться оставшиеся 5 из 11 секунд
//   Фаза 2: (разрешаем проезд)                    //
     a.set(TL_FORWARD_ON );                        // Разрешаем движение в прямом направлении
     delay(13000);                                 // Ждём 13 секунд. За это время светофор переключится с красного на красный и жёлтый, подождёт 3 секунды и включит зелёный, который будет светиться оставшиеся 10 из 13 секунд
}                                                  //

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

В коде setup() обоих скетчей выполняются следующие действия:

  • Обращением к функции begin() мы указываем, что модуль является светофором MODUL_TLIGHT и он регулирует дорогу с движением только прямо TRACK_F, модуль оснащён шлагбаумом SECTION_G.
  • Обращением к функции irProtocol() мы указываем ИК-протокол передачи данных. Для трассы лучше использовать IR_IARDUINO, но можно использовать IR_SAMSUNG или IR_RC6.
  • Функция indicator() позволяет управлять светодиодом, информирующем о передаче данных. В скетче функция вызвана с параметром true, разрешая работу индикаторного светодиода. Если вместо true указать false, то индикаторный светодиод будет выключен. Индикаторный светодиод позволяет видеть, когда модуль отправляет данные, отключение этого светодиода не отключает передачу данных.
  • Обращением к функции irAutoSend() мы заставляем модуль самостоятельно постоянно отправлять данные о состоянии светофора по ИК-каналу.
  • В первом скетче выполнено обращение к функции set() для установки начального состояния светофора (горит только зелёный). Это требуется для корректной работы светофора при первом проходе цикла loop().
  • Во втором скетче выполнено обращение к функции timing() , которой мы указали длительность свечения жёлтого и мигающего зелёного, равной трём секундам. Это требуется, так как в полуавтоматическом режиме модуль включает данные цвета без нашего участия. В первом скетче функция timing() не вызывалась, так как в ручном режиме мы сами задавали задержки после включения жёлтого и мигающего зелёного сигнала.

В коде loop() обоих скетчей выполняются обращения к функциям set() и delay().

  • В первом скетче функции set() передаются пары параметров для управления теми секциями, состояние которых требуется изменить, включая шлагбаум и звук.
  • Во втором скетче функция set() вызывается с одним параметром, указывающим разрешить или запретить движение в прямом направлении.

Как видно из примеров, второй скетч выглядит более компактно и читаемо.

Пример получения данных от светофора на стороне приёмника:

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

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

Шлагбаум для светофора

В магазин

Обсуждение

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