Назначение знака в ПДД:
![]() | Знак 3.20 «Обгон запрещен». |
Этот знак относится к группе запрещающих знаков. Он запрещает обгон всех транспортных средств, кроме тихоходных ТС, гужевых повозок, велосипедов, мопедов и двухколесных мотоциклов без бокового прицепа.
![](http://iarduino.ru/img/upload/0b8e7ec66e14feb738fe132da4d5f99f.png)
Обгон — это опережение одного или нескольких ТС, связанное с выездом на полосу встречного движения.
Ограничение, наложенное данным знаком, действует от места его установки до ближайшего перекрестка за ним.
При отсутствии перекрёстков, действие знака прерывается в конце населённых пунктов.
Также действие знака прерывается при наличии знаков снятия ограничений 3.21 и 3.31.
Действие знака не прерывается в местах выезда с прилегающих к дороге территорий и в местах пересечения (примыкания) с полевыми, лесными и другими второстепенными дорогами, перед которыми не установлены соответствующие знаки.
Инструкция по сборке знака:
1. Приклейте изображение знака на круглую основу.
![](http://iarduino.ru/img/upload/821c72b7afd82db95e86aa96e46564d1.png)
2. Установите круглую основу на стойку-основание.
![](http://iarduino.ru/img/upload/775d7f9ec8be64e20988df7222153979.png)
3. В случае, если Вы используете знак без модуля питания, соедините детали при помощи крепежа, винтов и гаек как с правой, так и с левой стороны.
Если же Вы будете работать с модулем питания, используйте отдельный крепёж только слева. Правая часть соединится посредством крепления модуля питания.
![](http://iarduino.ru/img/upload/a2faa164196f9d71e9b8ee6557167caa.png)
4. Соедините крестовину, как показано на рисунке.
![](http://iarduino.ru/img/upload/c1ec0038fdb42e66b1511e342e807da3.png)
5. Закрепите знак на крестовине при помощи винтов и гаек.
![](http://iarduino.ru/img/upload/7a6497965b0b368366f03d4a18660cb9.png)
6. Собранный знак должен выглядеть следующим образом:
Видеопояснение:
Схема установки знака на трассе:
![](http://iarduino.ru/img/upload/2819e350422c71cba30342b631891fbf.png)
Центр знака должен находиться в 15 см от линии трассы, а сам знак — располагаться под углом 45° относительно линии движения автомобиля.
Угол распространения ИК-данных составляет около 80°, а дальность передачи ИК-данных настраивается поворотом крестовины резистора на обратной стороне платы основания.
Первое включение и настройка знака:
Для работы со знаками необходимо установить библиотеку iarduino_I2C_Track. Подробнее об установке библиотеки читайте в нашей инструкции.
После сборки знака, его требуется подключить к Piranha UNO по шине I2C, как указано ниже:
![](http://iarduino.ru/img/upload/b99109298bc9e83443b503cc44a42ab0.png)
Сверху изображено подключение знака к 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,20); // Инициируем работу с модулем. Указываем, что модуль является знаком 3.20 «Обгон запрещен» 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,20
(группа и номер знака указываются через запятую). - Функция
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 способ: питание с помощью модуля
![](http://iarduino.ru/img/upload/1210e03135776fcac3a1f8e1aa1954a7.png)
В модуль питания установите аккумулятор формата 14500 (Li-ion, 3,7V), соблюдая полярность.
Внимание!
Несоблюдение полярности при установке аккумулятора может привести к выходу знака из строя. Будьте внимательны!
Модуль имеет собственную систему заряда аккумулятора. С обратной стороны модуля расположены светодиоды индикации работы, процесса заряда и окончания процесса заряда.
Вы можете почитать подробнее про работу с модулем.
Для того, чтобы зарядить аккумулятор, подключите провод к разъёму type C на обратной стороне модуля или используйте специальные зарядные устройства.
2 способ: питание через колодку I2C
Напряжение питания знака через колодку I2C должно составлять от 3,5 до 5В. Также можно использовать питание от платы Arduino или USB.
![](http://iarduino.ru/img/upload/4bb58a30dcb293be40544a8e326730c8.png)
На рисунке слева питание подаётся через колодку I2C, а на рисунке справа — через металлизированные отверстия крепления основания со стороны с надписью «Аккумулятор».
Допускается использовать три батарейки типа АА или ААА.
Настройка расстояния передачи ИК-сигнала
![](http://iarduino.ru/img/upload/afdbac462b9d03f81e2e07da8ae2a805.png)
Расстояние передачи информации настраивается подстроечным резистором и варьируется в диапазоне от 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.20 «Обгон запрещен», в мониторе последовательного порта появится строка:
Дорожный знак: 3.20 принадлежит к группе 3, номер 20, пункт 0
А при наличии под знаком таблички, строка может принять вид:
Дорожный знак: 3.20 принадлежит к группе 3, номер 20, пункт 0, под знаком есть табличка - 250 метров
В данном случае зона действия знака определена табличкой под ним.
Пример сравнения полученных приёмником данных:
В данном примере выводится информация только о тех знаках, которые указаны в скетче.
#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.20" ) ){ Serial.println("Обгон запрещен"); } } // } // } //
Действия данного скетча отличаются от предыдущего тем, что мы не выводим полученную от знака информацию, а сравниваем строку sign_str
с ожидаемыми значениями.
Вместо сравнения строки sign_str
, можно сравнивать значение переменной sign_int
или массива sign
.
Обсуждение