Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
main:upgkits:emerobo [2020/05/25 20:45]
smartadmin
main:upgkits:emerobo [2020/05/25 20:49]
smartadmin [Шаг 3. Загрузите скетч на контроллер]
Строка 31: Строка 31:
 ==== Шаг 3. Загрузите скетч на контроллер ==== ==== Шаг 3. Загрузите скетч на контроллер ====
 <file Arduino> <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>​ </​file>​
  
-==== Шаг 4. Робот вперёд! ====+==== Шаг 4. Тестирование робота ==== 
 +Для того чтобы робот корректно объезжал препятствия,​ измените значение переменной **const int mindist** = 100; в скетче на своё.  
 +Понять,​ какое значение лучше выбрать поможет следующий способ. Оставьте робота подключенным к компьютеру,​ после того как загрузили скетч и включите монитор порта (меню //​Инструменты - Монитор порта//​),​ для того чтобы видеть вывод отладочной информации. В мониторе порта вы увидите значения,​ которые получают датчики препятствия. Поднесите препятствие ближе (например руку или лист бумаги),​ затем отведите препятствие дальше. Этим экспериментальным путём, определите расстояние,​ на котором желательно срабатывание датчиков препятствия. 
 + 
 +==== Шаг 5. Робот вперёд! ====
 Отсоедините кабель от контроллера,​ поставьте платформу на ровную поверхность и переведите переключатель питания в положение ON. Робот будет передвигаться прямо до препятствия,​ стараясь обогнуть его. При этом у робота включена световая и звуковая сигнализация. Световая сигнализация попеременно меняет цвет (красный и синий),​ звуковая - меняет тон. Получаем настоящую машину экстренных служб. Отсоедините кабель от контроллера,​ поставьте платформу на ровную поверхность и переведите переключатель питания в положение ON. Робот будет передвигаться прямо до препятствия,​ стараясь обогнуть его. При этом у робота включена световая и звуковая сигнализация. Световая сигнализация попеременно меняет цвет (красный и синий),​ звуковая - меняет тон. Получаем настоящую машину экстренных служб.