Назначение знака в ПДД:
Знак 3.1 «Въезд запрещен». |
Этот знак относится к группе запрещающих знаков. Он запрещает въезд всех транспортных средств на участок дороги с той стороны, где он установлен.
Негласно водители называют этот знак «кирпич».
Данный знак часто устанавливают на дорогах с односторонним движением, запрещая въезд навстречу транспортному потоку.
Еще этот знак можно встретить на АЗС, когда с одной стороны на заправочную станцию заехать нельзя.
Действие знака не распространяется на маршрутные транспортные средства.
Инструкция по сборке знака:
- Приклейте изображение знака на круглую основу.
2. Установите круглую основу на стойку-основание.
3. В случае, если Вы используете знак без модуля питания, соедините детали при помощи крепежа, винтов и гаек как с правой, так и с левой стороны.
Если же Вы будете работать с модулем питания, используйте отдельный крепёж только слева. Правая часть соединится посредством крепления модуля питания.
4. Соедините крестовину, как показано на рисунке.
5. Закрепите знак на крестовине при помощи винтов и гаек.
6. Собранный знак должен выглядеть следующим образом:
Видеопояснение:
Схема установки знака на трассе:
Центр знака должен находиться в 15 см от линий, образующих перекрёсток, либо в 15 см от участка трассы, а сам знак — располагаться под углом 45° относительно линии движения автомобиля.
Угол распространения ИК-данных составляет около 80°, а дальность передачи ИК-данных настраивается поворотом крестовины резистора на обратной стороне платы основания.
Первое включение и настройка знака:
Для работы со знаками необходимо установить библиотеку iarduino_I2C_Track. Подробнее об установке библиотеки читайте в нашей инструкции.
После сборки знака, его требуется подключить к Piranha UNO по шине I2C, как указано ниже:
Сверху изображено подключение знака к Piranha UNO напрямую, а ниже — через Trema Shield.
После подключения модуля к шине I2C, знак необходимо настроить на постоянную отправку данных по ИК-каналу. Для этого запустите следующий скетч:
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулями трассы I2C-flash iarduino_I2C_Track sign; // Объявляем объект sign для работы с функциями и методами библиотеки iarduino_I2C_Track // Если при объявлении объекта указать адрес, например, iarduino_I2C_Track sign(0x09), то пример будет работать с тем модулем, адрес которого был указан void setup(){ // sign.begin(MODUL_SIGN, 3,1); // Инициируем работу с модулем. Указываем, что модуль является знаком 3.1 «Въезд запрещен» sign.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO» sign.backlight(true); // Включаем подсветку знака sign.indicator(true); // Разрешаем работу светодиода, информирующего об отправке данных sign.irAutoSend(); // Указываем модулю постоянно отправлять информацию о знаке по ИК-каналу с паузой между пакетами, определённой ИК-протоколом по умолчанию ±50% sign.offline(true); // Указываем модулю сохранить все полученные настройки в энергонезависимую память и работать в автономном режиме } // Отключить автономный режим можно функцией offline() с параметром false // void loop(){} //
Данный скетч можно запустить всего один раз, при наличии модуля знака на шине I2C. Далее знак будет постоянно и самостоятельно передавать информацию о себе при наличии питания. Для дальнейшей работы знака не требуется его подключение к Piranha UNO, кроме случаев, когда Вы пожелаете изменить алгоритм работы модуля. Питание модуля без подключения к Piranha UNO удобно организовать, используя батарейный отсек.
Весь код скетча находится в теле функции setup()
:
- Первая строка кода является обращением к функции
begin()
, которой указывается, что модуль является знакомMODUL_SIGN
, с номером ПДД3,1
(группа и номер знака указываются через запятую). - Функция
irProtocol()
позволяет назначить протокол для передачи данных по ИК-каналу. В скетче используется протоколIR_IARDUINO
. - Функция
backlight()
позволяет управлять подсветкой знака. В скетче функция вызвана с параметромtrue
для включения подсветки. Если вместоtrue
указатьfalse
, то подсветка будет отключена, а если указать2
, то подсветка будет мигать. Функцию можно вызвать с двумя параметрами, тогда первая половина светодиодов подсветки будет управляться первым параметром, а вторая — вторым. - Функция
indicator()
позволяет управлять светодиодом, информирующем о передаче данных. В скетче функция вызвана с параметромtrue
, разрешая работу индикаторного светодиода. Если вместоtrue
указатьfalse
, то индикаторный светодиод будет выключен. Индикаторный светодиод позволяет видеть, когда модуль отправляет данные, отключение этого светодиода не отключает передачу данных. - Функция
irAutoSend()
указывает модулю начать постоянную отправку пакетов данных с информацией о знаке. Если в качестве параметра указать число от 15 до 255 мс, то средняя пауза между отправляемыми по ИК-каналу пакетами будет равна указанному числу миллисекунд. В скетче функция вызвана без параметра, значит, средняя пауза между пакетами будет установлена в значение по умолчанию для выбранного протокола. Реальная пауза между отправляемыми пакетами устанавливается хаотично в диапазоне ±50% от указанного числа, что позволяет поставить несколько знаков в одном направлении. - Функция
offline()
с параметромtrue
указывает модулю запомнить полученные настройки, сохранив их в энергонезависимую память. После этого модуль будет работать автономно (сразу после подачи питания), даже если он не подключён к Piranha UNO по шине I2C, так, как будто он вновь получил все команды кодаsetup()
. Для отключения автономного режима достаточно однократного обращения к функцииoffline()
с параметромfalse
.
Питание
Питание знака может производиться двумя способами: от специального модуля питания или же с помощью подачи питания через колодку шины I2C.
1 способ: питание с помощью модуля
В модуль питания установите аккумулятор формата 14500 (Li-ion, 3,7V), соблюдая полярность.
Внимание!
Несоблюдение полярности при установке аккумулятора может привести к выходу знака из строя. Будьте внимательны!
Модуль имеет собственную систему заряда аккумулятора. С обратной стороны модуля расположены светодиоды индикации работы, процесса заряда и окончания процесса заряда.
Вы можете почитать подробнее про работу с модулем.
Для того, чтобы зарядить аккумулятор, подключите провод к разъёму type C на обратной стороне модуля или используйте специальные зарядные устройства.
2 способ: питание через колодку I2C
Напряжение питания знака через колодку I2C должно составлять от 3,5 до 5В. Также можно использовать питание от платы Arduino или USB.
На рисунке слева питание подаётся через колодку I2C, а на рисунке справа — через металлизированные отверстия крепления основания со стороны с надписью «Аккумулятор».
Допускается использовать три батарейки типа АА или ААА.
Настройка расстояния передачи ИК-сигнала
Расстояние передачи информации настраивается подстроечным резистором и варьируется в диапазоне от 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_SIGN ){ // Если устройство, отправившее данные является дорожным знаком Serial.print("Дорожный знак: "); // Serial.print(ir.sign_str); // Выводим строку с номером знака Serial.print(" принадлежит к"); // Serial.print(" группе "); // Serial.print(ir.sign[0]); // Выводим число, определяющее группу знака Serial.print(", номер "); // Serial.print(ir.sign[1]); // Выводим число, определяющее номер знака Serial.print(", пункт "); // Serial.print(ir.sign[2]); // Выводим число, определяющее пункт номера знака if( ir.sign_tab ){ Serial.print(", под знаком есть табличка - "); if( ir.sign_tab==SIGN_CAR_TRUCK ){ Serial.print("грузовые автомобили"); } if( ir.sign_tab==SIGN_CAR_LIGHT ){ Serial.print("легковые автомобили"); } if( ir.sign_tab==SIGN_DISTANCE_050 ){ Serial.print("50 метров" ); } if( ir.sign_tab==SIGN_DISTANCE_100 ){ Serial.print("100 метров"); } if( ir.sign_tab==SIGN_DISTANCE_150 ){ Serial.print("150 метров"); } if( ir.sign_tab==SIGN_DISTANCE_200 ){ Serial.print("200 метров"); } if( ir.sign_tab==SIGN_DISTANCE_250 ){ Serial.print("250 метров"); } } Serial.println("."); // } // } // } //
Действия, выполняемые в коде Setup()
:
- Первой строкой выполняется инициализация передачи данных в монитор последовательного порта
Serial.begin()
на скорости9600
бит/сек. - Далее выполняется инициализация работы с модулем ИК-приёмник/передатчик
begin()
. - Последняя строка указывает ИК-протокол приёма/передачи данных
setProtocol()
. Протоколы знака и приёмника должны совпадать. В скетче используется протоколIR_IARDUINO
.
Действия, выполняемые в коде loop()
:
- В первой строке выполняется проверка наличия принятых по ИК-каналу данных. Для проверки наличия данных, полученных от модулей трассы, обращение к функции
check()
должно выполняться с параметромtrue
(в этом случае функция реагирует на пакеты повторов). - Второй строкой кода выполняется проверка принятых данных на принадлежность к модулям знаков. Если ИК-данные приняты от модулей дорожных знаков, то переменная
device
содержит константуMODUL_SIGN
. - Если обе проверки успешно пройдены, то информацию о знаках можно получить из переменных:
- char*
sign_str
— строка, хранящая обозначение знака ПДД ("1.1" ... "7.63.15"); - uint16_t
sign_int
— переменная, хранящая обозначение знака ПДД (10100...76315); - uint8_t
sign[3]
— массив, хранящий группу, номер и пункт знака ПДД ({1,1,0}...{7,63,15}); - uint8_t
sign_tab
— переменная, хранящая назначение таблички, находящейся под знаком: 0
— под знаком нет таблички уточняющей или ограничивающей его действие;SIGN_CAR_TRUCK
— действие знака распространяется только на грузовые автомобили;SIGN_CAR_LIGHT
— действие знака распространяется только на легковые автомобили;SIGN_DISTANCE_050
— расстояние до объекта или зона действия знака = 50 м;SIGN_DISTANCE_100
— расстояние до объекта или зона действия знака = 100 м;SIGN_DISTANCE_150
— расстояние до объекта или зона действия знака = 150 м;SIGN_DISTANCE_200
— расстояние до объекта или зона действия знака = 200 м;SIGN_DISTANCE_250
— расстояние до объекта или зона действия знака = 250 м.- В данном скетче сначала выводится строка, содержащая обозначение знака
sign_str
. Далее по отдельности выводятся группаsign[0]
, номерsign[1]
и пунктsign[2]
знака. Если у знака нет пункта, то элементsign[2]
содержит0
. - Последняя проверка определяет наличие под знаком таблички, уточняющей или ограничивающей его действие
if( ir.sign_tab )
. Если таковая есть, то в монитор последовательного порта выводится соответствующее сообщение.
При получении данных от знака 3.1 «Въезд запрещен», в мониторе последовательного порта появится строка:
Дорожный знак: 3.1 принадлежит к группе 3, номер 1, пункт 0
А при наличии под знаком таблички, строка может принять вид:
Дорожный знак: 3.1 принадлежит к группе 3, номер 1, пункт 0, под знаком есть табличка - легковые автомобили
В данном случае действие знака распространяется только на легковые автомобили.
Пример сравнения полученных приёмником данных:
В данном примере выводится информация только о тех знаках, которые указаны в скетче.
#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_SIGN ){ // Если устройство, отправившее данные, является дорожным знаком // Выводим название известных знаков: // if( !strcmp( ir.sign_str, "3.1" ) ){ Serial.println("Въезд запрещен"); } } // } // } //
Действия данного скетча отличаются от предыдущего тем, что мы не выводим полученную от знака информацию, а сравниваем строку sign_str
с ожидаемыми значениями.
Вместо сравнения строки sign_str
, можно сравнивать значение переменной sign_int
или массива sign
.
Обсуждение