Arduino:Примеры/RobotRescue

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Робот-спасатель[1]

В робототехнике существует задача, именуемая «rescue» (т.е. «спасение»), в рамках которой робот должен следовать некоторому маршруту, добраться до определенного места и выполнить там задание (гипотетически – спасти человека). В данном случае робот будет доезжать до «пострадавшего», выталкивать его из «опасной зоны» и продолжать движение.

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

  • Arduino Robot;
  • Большой кусок белой бумаги;
  • Толстый черный маркер;
  • Препятствия или «пострадавшие» (их роль могут сыграть пустые банки или не очень тяжелые игрушки);

Инструкция

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

Пробуем

Сначала рисуем трек, а потом добавляем остановки (перпендикулярные линии), чтобы робот знал, где будут располагаться «пострадавшие».

LottieLemon Rescue 780.png

Возьмите кусок бумаги и нарисуйте маркером трек

Разместите «пострадавших» внутри «опасных зон». Они должны быть не слишком тяжелыми. Робот способен сдвинуть объекты вроде пустых банок из-под газировки или маленьких пластиковых игрушек.

LottieLemon Rescue 2 780.png

Разместите «пострадавших»

Поставьте робота на трек и включите. Посмотрим, сможет ли он справиться с поставленной задачей.

LottieLemon Rescue 3 780.png

Поставьте робота на трек

Перед «пострадавшим» робот замедлит ход, сдвинет объект, отъедет назад и снова начнет движение.

LottieLemon Rescue 4 780.png

Робот выталкивает «пострадавшего»

Код

/* Робот-спасатель

В этом скетче робот начинает следовать по линии (попутно проигрывая
музыку), пока не доезжает до «пострадавшего». Достигнув, он сдвигает
его со своего пути, а потом возвращается на трек и снова едет, пока не
добирается до нового «пострадавшего».

Если хотите, то робота можно запрограммировать на сдвигание любого
количества объектов – просто добавьте в код больше вызовов функции
«сдвигания» или добавьте больше этого кода в loop().

Цепь:
 * Arduino Robot
 * Несколько объектов, которые робот будет сдвигать
 * Гоночный «трек»

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

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

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

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

  // Рисуем на экране логотипы – «lg0.bmp» и «lg1.bmp»:
  Robot.displayLogos();

  // Показываем на экране картинку с инструкциями к примеру «Следование за линией»(с SD-карты):
  Robot.drawBMP("lf.bmp", 0, 0);

  // Проигрываем музыкальный файл «Chase»:
  Robot.playFile("chase.sqm");

  // Печатаем инструкции:
  Robot.text("Rescue\n\n place the robot on\n the rescue track\n pushing the\n obstacles away", 5, 5);  //  "Робот-спасатель\n\n Поставьте робота\n на трек, после чего\n он начнет отталкивать\n препятствия"
  Robot.text("Press the middle\n button to start...", 5, 61);
  Robot.waitContinue();  //  "Нажмите среднюю\n кнопку, чтобы\n начать..."

  // Стартуем:
  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.lineFollowConfig(14, 9, 50, 10);
  Robot.lineFollowConfig(11, 7, 60, 5);

  // Запускаем «сдвигающую» последовательность:
  rescueSequence();
  // Снова находим линию:
  goToNext();
  // Еще раз запускаем «сдвигающую» последовательность:
  rescueSequence();

  // Здесь, если нужно, можем продолжать «сдвигание» еще и еще...


}

void loop() {
  // в этом блоке ничего – программа запускается лишь единожды
}

// Функция для запуска последовательности спасающе-сдвигающих действий:
void rescueSequence() {
  // Делаем так, чтобы моторная плата начала работать в режиме следования за линией:
  Robot.setMode(MODE_LINE_FOLLOW);

  while (!Robot.isActionDone()) { // ждем, пока робот не перестанет следовать за линией
  }
  delay(1000);

  // Проделываем сдвигание объекта:
  doRescue();
  delay(1000);
}

// Функция с набором действий для сдвигания «пострадавшего»:
void doRescue() {
  // Доезжаем до остановки, начинаем воздействовать на объект:
  Robot.motorsWrite(200, 200);
  delay(250);
  Robot.motorsStop();
  delay(1000);

  // Поворачиваем робота:
  Robot.turn(90);
  Robot.motorsStop();
  delay(1000);

  // Едем вперед:
  Robot.motorsWrite(200, 200);
  delay(500);
  Robot.motorsStop();
  delay(1000);

  // Едем назад, оставляем объект:
  Robot.motorsWrite(-200, -200);
  delay(500);
  Robot.motorsStop();
}

void goToNext() {
  // Поворачиваем робота:
  Robot.turn(-90);
  Robot.motorsStop();
  delay(1000);
}

См.также

  1. Line Following example

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