====== Робо-лазер ======
====== Описание ======
Сделаем из робота - робот лазер. Наделим его функцией перемещения в случайном направлении и добавим лазер - тогда получится робот, который может самостоятельно поиграть с котом. Или робот из звёздных войн, тут уже полёт фантазии не ограничивается. Дополнительно, оставим функционал объезда препятствий для робота, чтобы он сам мог объезжать препятствия.

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

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

===== Библиотеки =====
  * [[http://files.smartelements.ru/know_libs/robotSE.zip|Библиотека robotSE]]

===== Порядок действий =====
==== Шаг 1. Пересоберите робота ====
  - С помощью отвёртки, входящей в комплект набора, и нейлоновых креплений (одна гайка, один винт и одна стойка) прикрепите в свободное крайнее отверстие (справа от ИК-приёмника) - [[https://smartelements.ru/collection/moduli/product/modul-lazera-ky-008|Модуль лазера]].
  - Присоедините модуль с помощью трёхпроводного шлейфа к цифровому выводу D10 мотор шилда.

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

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

const int PIN_LAZ = 10; //Вывод для подключения модуля лазера
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; //Уровень срабатывания датчиков препятствия

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

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_LAZ, OUTPUT);     //Установка вывода лазера как выходной
  digitalWrite(PIN_LAZ, HIGH);  //Включение лазера
  Serial.begin(9600); //Инициализация Serial-соединения
}

void loop() {

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

  if (R_free && C_free && L_free) { //Путь впереди свободен.
    robot.randomMove();         //Движение в случайную сторону
    delay(1000); //Задержка в 1 секунду
  }
  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. Робот будет передвигаться в случайном направлении, проецируя позади лазером красную точку. При приближении к препятствию, робот попытается его объехать.