====== Робополицейский ======
====== Описание ======
Попробуем воссоздать из робота полицейскую машину. Или машину скорой помощи. Для этого поместим на робота мигалки и сигнализацию. И оставим режим движения по объезду препятствий.

===== Дополнительные модули =====
Предполагается что у Вас уже есть набор "Смарт РОБО", и вы собрали его по инструкции в руководстве пользователя. Тогда дополнительно понадобится:

^ Что нужно                                                                                                               ^  Кол-во, шт  ^
| [[https://smartelements.ru/collection/moduli/product/modul-adresnyh-svetodiodov-h4|Модуль адресных светодиодов]] |  2           |
| [[https://smartelements.ru/collection/moduli/product/modul-zummera-2|Модуль зуммера]] |  1           |
| [[https://smartelements.ru/collection/aksessuary/product/komplekt-neylonovyh-krepleniy|Комплект нейлоновых креплений]] |  1           |

===== Библиотеки =====
  * [[http://files.smartelements.ru/know_libs/robotSE.zip|Библиотека robotSE (для робота)]]
  * [[http://files.smartelements.ru/know_libs/NewTone.zip|Библиотека NewTone (для зуммера)]]
  * [[http://files.smartelements.ru/know_libs/Adafruit_NeoPixel.zip|Библиотека Adafruit_NeoPixel (для модуля светодиодов)]]

===== Порядок действий =====
==== Шаг 1. Пересоберите робота ====
  - С помощью отвёртки, входящей в комплект набора, снимите с платформы модуль ИК-приёмника
  - С помощью отвёртки, входящей в комплект набора, прикрепите на место модуля ИК-приёмника - [[https://smartelements.ru/collection/moduli/product/modul-zummera-2|Модуль зуммера]]
  - Присоедините модуль зуммера с помощью трёхпроводного шлейфа к выводам D10 мотор шилда.
  - С помощью отвёртки, входящей в комплект набора, и нейлоновых креплений (одна гайка, один винт и одна стойка) прикрепите в свободное крайнее отверстие (справа от ИК-приёмника) [[https://smartelements.ru/collection/moduli/product/modul-adresnyh-svetodiodov-h4|Модуль адресных светодиодов]]
  - С помощью отвёртки, входящей в комплект набора, и нейлоновых креплений (одна гайка, один винт и одна стойка) прикрепите в свободное крайнее отверстие (слева от ИК-приёмника) [[https://smartelements.ru/collection/moduli/product/modul-adresnyh-svetodiodov-h4|Модуль адресных светодиодов]]
  - Присоедините один из модулей адресных светодиодов с помощью трёхпроводного шлейфа к выводам D11 мотор шилда (вывод модуля Din).
  - Соедините между собой модули адресных светодиодов трёхпроводным шлейфом (D out первого с D in второго).

{{ :main:upgkits:policerobo.png?nolink |}}
==== Шаг 2. Установите библиотеки ====
Установите в Arduino IDE библиотеки, которые представлены по ссылкам выше (в подпункте «Библиотеки»). О том как устанавливаются библиотеки описано в руководстве пользователя, входящем в комплект, либо посетите соответствующий [[main:info:libs|раздел Базы Знаний]].

==== Шаг 3. Загрузите скетч на контроллер ====
<file Arduino>
#include <robotSE.h>              //Подключение библиотеки для работы с платформой.
#include <Adafruit_NeoPixel.h>    //Библиотека для работы со светодиодами

const int R_SEN = A2; //Вывод, к которому подключен правый датчик препятствия.
const int C_SEN = A1; //Вывод, к которому подключен центральный датчик препятствия.
const int L_SEN = A0; //Вывод, к которому подключен левый датчик препятствия.
boolean R_free = false; //Свободен ли путь правого датчика.
boolean C_free = false; //Свободен ли путь центрального датчика.
boolean L_free = false; //Свободен ли путь левого датчика.
const int mindist = 100;        //Минимальное расстояние срабатывания
const int PIN_BUZ = 10;         //Вывод для подключения модуля зуммера
const int PIN_LED = 11;         //Вывод подключения адресных светодиодов
boolean nowRed = true;          //Флаг для вывода цвета

robotSE robot; //создание объекта робота

Adafruit_NeoPixel pixels(8, PIN_LED); //создание объекта адр. светодиодов

void scan_barrier_sensors() { //Получение информации о наличии препятствий в заданных направлениях.
  R_free = (analogRead(R_SEN) > mindist) ? true : false; //Правый датчик.
  C_free = (analogRead(C_SEN) > mindist) ? true : false; //Центральный датчик.
  L_free = (analogRead(L_SEN) > mindist) ? true : false; //Левый датчик.
  Serial.print(analogRead(L_SEN)); //Вывод значения с левого датчика
  Serial.print("|"); //Вывод разделителя
  Serial.print(analogRead(C_SEN)); //Вывод значения с центрального датчика 
  Serial.print("|"); //Вывод разделителя
  Serial.println(analogRead(R_SEN)); //Вывод значения с правого датчика
}

void setup() {
  pinMode(PIN_BUZ, OUTPUT);     //Установка вывода зуммера как выходной
  pixels.begin();               //инициализация светодиодов
  Serial.begin(9600); //Инициализация Serial-соединения
}

void loop() {
  
  //нумерация светодиодов начинается с 0
  for(int i=0; i<8; i++) { 
    pixels.setPixelColor(i, pixels.Color(nowRed?255:0, 0, nowRed?0:255)); //установка цвета свечения для очередного светодиода
    pixels.show();    //показать цвет светодиода 
    nowRed = !nowRed; //смена флага
  }

  tone(PIN_BUZ, nowRed?294:396); //подача сигнала

  scan_barrier_sensors(); //Получение показания датчиков препятствия.

  if (R_free && C_free && L_free) { //Путь впереди свободен.
    robot.move_forward();         //Движение вперед
    delay(1000);                  //Задержка 1 сек.
    nowRed = !nowRed;             //смена флага
  }
  else if (R_free || L_free) { //Свободен путь у правого или левого датчика.
    if (R_free) robot.move_right(); //Свободен путь у правого - двигаться вправо.
    else if (L_free) robot.move_left(); //Свободен путь у левого - двигаться влево.
  }
  else { //Робот в тупике, ехать некуда, будем выбираться.
    robot.move_stop(); //Остановка робота.
    delay(500); //Задержка полсекунды.
    robot.move_back(); //Робот немного отъезжает назад.
    delay(500); //Задержка полсекунды.
    robot.move_stop(); //Остановка робота.
    delay(500); //Задержка полсекунды.

    robot.move_right(); //Поворот робота в сторону.
    delay(500); //Задержка полсекунды.
    robot.move_stop(); //Остановка.
    delay(500); //Задержка полсекунды.
  }
}
</file>

==== Шаг 4. Тестирование робота ====
Для того чтобы робот корректно объезжал препятствия, измените значение переменной **const int mindist** = 100; в скетче на своё. 
Понять, какое значение лучше выбрать поможет следующий способ. Оставьте робота подключенным к компьютеру, после того как загрузили скетч и включите монитор порта (меню //Инструменты - Монитор порта//), для того чтобы видеть вывод отладочной информации. В мониторе порта вы увидите значения, которые получают датчики препятствия. Поднесите препятствие ближе (например руку или лист бумаги), затем отведите препятствие дальше. Этим экспериментальным путём, определите расстояние, на котором желательно срабатывание датчиков препятствия.

==== Шаг 5. Робот вперёд! ====
Отсоедините кабель от контроллера, поставьте платформу на ровную поверхность и переведите переключатель питания в положение ON. Робот будет передвигаться прямо до препятствия, стараясь обогнуть его. При этом у робота включена световая и звуковая сигнализация. Световая сигнализация попеременно меняет цвет (красный и синий), звуковая - меняет тон. Получаем настоящую машину экстренных служб.