Arduino:Примеры/RobotRescue
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Робот-спасатель[1]
В робототехнике существует задача, именуемая «rescue» (т.е. «спасение»), в рамках которой робот должен следовать некоторому маршруту, добраться до определенного места и выполнить там задание (гипотетически – спасти человека). В данном случае робот будет доезжать до «пострадавшего», выталкивать его из «опасной зоны» и продолжать движение.
Необходимое оборудование
- Arduino Robot;
- Большой кусок белой бумаги;
- Толстый черный маркер;
- Препятствия или «пострадавшие» (их роль могут сыграть пустые банки или не очень тяжелые игрушки);
Инструкция
- Чтобы подготовить трек, смотрите инструкции в примере «Следование за линией». Но для данного случая они будут немного отличаться.
- Нарисуйте несколько «стоп-линий» – т.е. линий, перпендикулярных основной линии (тут робот будет останавливаться). Также сделайте в главной линии пустые промежутки, внутри которых начертите прямоугольники (это своего рода «опасные зоны») размером с робота. Поместите «пострадавших» внутрь этих прямоугольников.
- Загрузите скетч, отключите USB и включите питание;
- Поставьте робота на главную линию;
- Робот начнет двигаться по линии и, подъезжая к «опасным зонам», начнет операцию «спасения» – будет выталкивать «пострадавших» из этих «опасных зон»;
- Если робот следует линии не так четко, как хотелось бы, откалибровать это действие можно в функции lineFollowConfig();
Пробуем
Сначала рисуем трек, а потом добавляем остановки (перпендикулярные линии), чтобы робот знал, где будут располагаться «пострадавшие».
Возьмите кусок бумаги и нарисуйте маркером трек
Разместите «пострадавших» внутри «опасных зон». Они должны быть не слишком тяжелыми. Робот способен сдвинуть объекты вроде пустых банок из-под газировки или маленьких пластиковых игрушек.
Разместите «пострадавших»
Поставьте робота на трек и включите. Посмотрим, сможет ли он справиться с поставленной задачей.
Поставьте робота на трек
Перед «пострадавшим» робот замедлит ход, сдвинет объект, отъедет назад и снова начнет движение.
Робот выталкивает «пострадавшего»
Код
/* Робот-спасатель
В этом скетче робот начинает следовать по линии (попутно проигрывая
музыку), пока не доезжает до «пострадавшего». Достигнув, он сдвигает
его со своего пути, а потом возвращается на трек и снова едет, пока не
добирается до нового «пострадавшего».
Если хотите, то робота можно запрограммировать на сдвигание любого
количества объектов – просто добавьте в код больше вызовов функции
«сдвигания» или добавьте больше этого кода в 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);
}
См.также
- Line Following example