Arduino:Примеры/RobotLineFollowing

Материал из Онлайн справочника
Версия от 09:30, 14 декабря 2016; Myagkij (обсуждение | вклад) (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Следование по линии[1]

Возьмите большой кусок белой бумаги (либо склейте между собой несколько кусков) и, воспользовавшись толстым черным маркером, нарисуйте на нем какую-нибудь фигуру. Эта фигура будет вашим «гоночным треком». Поставьте робота поверх этой линии, а затем включите его. Он начнет сканировать пол на предмет этой линии, а когда найдет, начнет вдоль нее двигаться. Попробуйте этот скетч с разными роботами, чтобы узнать, какой придет к финишу первым!

Необходимое оборудование и инструменты

  • Arduino Robot;
  • Большой кусок белой бумаги;
  • Толстый черный маркер;
  • Изолента;

Инструкция

  1. Подготовьте свой «гоночный трек». Нарисуйте на большом куске бумаги толстую линию (ее концы должны соединяться друг с другом). Если большого куска бумаги нет, склейте скотчем несколько кусков поменьше. Ширина линии должна составлять около 3 см.
  2. Приклейте ваш «трек» к полу, чтобы из-за движений робота он не елозил. Цвет бумаги должен быть светлым.
  3. Загрузите скетч, отключите USB и включите питание.
  4. Поставьте робота на трек – так, чтобы он мог увидеть линию.
  5. Показав экран загрузки, робот начнет двигаться, тем самым подстраиваясь под линию.
  6. Настроившись, робот начнет движение вдоль линии. Если все в порядке, он так и будет двигаться по треку. Впрочем, он может съехать с трассы, и тут может помочь калибровка функции lineFollowConfig(). Почитать об этом можно здесь.

Пробуем

Нарисуйте свой собственный «гоночный трек»!

А теперь пускай робот по нему прокатится.

Код

/* Робот следует за линией 

Этот скетч демонстрирует способность Arduino Robot следовать
нарисованной на бумаге линии. Лист бумаги должен быть приклеен
к полу скотчем или изолентой. Чтобы сделать «финиш», приклейте поперек 
линии кусок темной изоленты.

Цепь:
* Arduino Robot

Создан 1 мая 2013 Х. Янгом (X. Yang),
модифицирован 12 мая 2013 Д. Куартиллье (D. Cuartielles).

Этот код не защищен авторским правом.
*/

#include <ArduinoRobot.h> // подключаем библиотеку Robot
#include <Wire.h>
#include <SPI.h>

long timerOrigin; // с помощью этой переменной будем считать время, прошедшее с момента старта

void setup() {
  // Инициализируем робота, SD-карту, дисплей и динамик
  Robot.begin();
  Robot.beginTFT();
  Robot.beginSD();
  Robot.beginSpeaker();

  // Показываем на TFT-экране логотипы:
  Robot.displayLogos();

  Robot.drawBMP("lf.bmp", 0, 0); // показываем фоновую картинку:

  Robot.playFile("chase.sqm");  // проигрываем песенку, хранящуюся на SD-карте

  // Показываем на экране инструкции:
  Robot.text("Line Following\n\n place the robot on\n the track and \n see it run", 5, 5);  //  "Следование линии\n\n Поставьте робота\n на трек, чтобы он\n начал движение"
  Robot.text("Press the middle\n button to start...", 5, 61);  //  "Нажмите среднюю\n кнопку, чтобы начать..."
  Robot.waitContinue();

  // Для того, чтобы робот следовал за линией, нужно указать несколько значений. 
  // От этих значений также зависит то, как робот будет подстраиваться под линию.
  // Чтобы увидеть разницу, попробуйте разные варианты.
  // Например, два варианта, предложенных ниже:
  //Robot.lineFollowConfig(14, 9, 50, 10);
  Robot.lineFollowConfig(11, 7, 60, 5);


  // Выставляем моторную плату в режим следования за линией:
  Robot.setMode(MODE_LINE_FOLLOW);

  // Начинаем:
  Robot.fill(255, 255, 255);
  Robot.stroke(255, 255, 255);
  Robot.rect(0, 0, 128, 80); // стираем предыдущий текст
  Robot.stroke(0, 0, 0);
  Robot.text("Start", 5, 5);  //  "Старт"

  Robot.stroke(0, 0, 0); // выбираем цвет для текста
  Robot.text("Time passed:", 5, 21); //  "Прошло времени:"

  timerOrigin = millis(); // ведем отчет времени

  while (!Robot.isActionDone()) { // ждем финишного сигнала
    Robot.debugPrint(millis() - timerOrigin, 5, 29); // показываем, сколько прошло времени
  }

  Robot.stroke(0, 0, 0);
  Robot.text("Done!", 5, 45); //  "Готово!"
}
void loop() {
  // Ничего не делаем. Программа срабатывает лишь один раз.
  // Чтобы начать еще раз, робота нужно перезагрузить.
}

Как это работает

В нижней части моторной платы робота имеется пять инфракрасных датчиков, которые умеют определять, в каких местах свет отражается, а в каких – нет. Робот, в свою очередь, использует эту информацию, чтобы либо двигаться по прямой, либо поворачивать.

Остановка

Если робот наткнется на черную фигуру, которая будет захватывать сразу пять датчиков, он остановится. Пользуйтесь этим, чтобы робот мог в определенных местах останавливаться и выполнять какие-нибудь действия.

См.также

  1. Tutorial.RobotRescue

Внешние ссылки