Назначение знаков в ПДД:
![]() |
Знак 4.2.1 «Объезд препятствия справа». |
![]() |
Знак 4.2.2 «Объезд препятствия слева». |
![]() | Знак 4.2.3 «Объезд препятствия справа или слева». |
Все перечисленные выше знаки являются предписывающими, они разрешают объезд препятствий только со стороны, указанной стрелкой.
![](http://iarduino.ru/img/upload/d8ef7b9c69994d29740e442d8218d3e8.png)
Мы предполагаем, что препятствия на трассе должны располагаться так, чтобы машинка могла их объехать, оставаясь крайним датчиком бампера на линии, как это показано на картинке. Однако, Вы можете реализовать и другое расположение препятствий, включая алгоритмы их объезда с полным покиданием линии и последующим возвращением на неё.
Инструкция по сборке знака:
- Приклейте изображение знака на круглую основу.
2. Установите круглую основу на стойку-основание.
![](http://iarduino.ru/img/upload/67df24cdf4897e42b164fe8cd414b326.png)
3. В случае, если Вы используете знак без модуля питания, соедините детали при помощи крепежа, винтов и гаек как с правой, так и с левой стороны.
Если же Вы будете работать с модулем питания, используйте отдельный крепёж только слева. Правая часть соединится посредством крепления модуля питания.
![](http://iarduino.ru/img/upload/25209e8276c3a53a332627bdaec5d584.png)
4. Соедините крестовину, как показано на рисунке.
![](http://iarduino.ru/img/upload/401471dbe0baa4e4d6032444e3477ebb.png)
5. Закрепите знак на крестовине при помощи винтов и гаек.
![](http://iarduino.ru/img/upload/416b59fc16055a82de48ccb02fdf6d47.png)
6. Собранный знак должен выглядеть следующим образом:
![](http://iarduino.ru/img/upload/33e88e518d714a2707eb8399fb9ca2dc.png)
Видеопояснение:
Схема установки знака на трассе:
![](http://iarduino.ru/img/upload/14a837e18b5f554421b12a8e6d2a8341.png)
Центр знака должен находиться в 15 см от линии трассы, а сам знак — располагаться под углом 45° относительно линии движения автомобиля.
Угол распространения ИК-данных составляет около 80°, а дальность передачи ИК-данных настраивается поворотом крестовины резистора на обратной стороне платы основания.
Первое включение и настройка знака:
Для работы со знаками необходимо установить библиотеку iarduino_I2C_Track. Подробнее об установке библиотеки читайте в нашей инструкции.
После сборки знака его требуется подключить к Piranha UNO по шине I2C, как указано ниже.
![](http://iarduino.ru/img/upload/9253a5afebbe7b99c24d092b5a018505.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, 4,2,1); // Инициируем работу с модулем. Указываем, что модуль является знаком 4.2.1 «Объезд препятствия справа» // sign.begin(MODUL_SIGN, 4,2,2); // Инициируем работу с модулем. Указываем, что модуль является знаком 4.2.2 «Объезд препятствия слева» 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
, с номером ПДД4,2,1
(группа, номер и пункт знака указываются через запятые). Ниже имеется закомментированная строка, показывающая, как нужно обратиться к функцииbegin()
для определения знака 4.2.2. - Функция
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 )
. Если таковая есть, то в монитор последовательного порта выводится соответствующее сообщение.
При получении данных от знака 4.2.1 «Объезд препятствия справа», в мониторе последовательного порта появится строка:
Дорожный знак: 4.2.1 принадлежит к группе 4, номер 2, пункт 1.
А при наличии под знаком таблички, строка может принять вид:
Дорожный знак: 4.2.1 принадлежит к группе 4, номер 2, пункт 1, под знаком есть табличка - легковые автомобили
В данном случае действие знака распространяется только на легковые автомобили.
Пример сравнения полученных приёмником данных:
В данном примере выводится информация только о тех знаках, которые указаны в скетче.
#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, "4.2.1" ) ){ Serial.println("Объезд препятствия справа"); } if( !strcmp( ir.sign_str, "4.2.2" ) ){ Serial.println("Объезд препятствия слева"); } if( !strcmp( ir.sign_str, "4.2.3" ) ){ Serial.println("Объезд препятствия справа или слева"); } } // } // } //
Действия данного скетча отличаются от предыдущего тем, что мы не выводим полученную от знака информацию, а сравниваем строку sign_str
с ожидаемыми значениями.
Вместо сравнения строки sign_str
можно сравнивать значение переменной sign_int
или массива sign
.
Обсуждение