Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/RobotRescue

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Робот-спасатель[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

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

Код

  1. /* Робот-спасатель
  2.  
  3. В этом скетче робот начинает следовать по линии (попутно проигрывая
  4. музыку), пока не доезжает до «пострадавшего». Достигнув, он сдвигает
  5. его со своего пути, а потом возвращается на трек и снова едет, пока не
  6. добирается до нового «пострадавшего».
  7.  
  8. Если хотите, то робота можно запрограммировать на сдвигание любого
  9. количества объектов – просто добавьте в код больше вызовов функции
  10. «сдвигания» или добавьте больше этого кода в loop().
  11.  
  12. Цепь:
  13.  * Arduino Robot
  14.  * Несколько объектов, которые робот будет сдвигать
  15.  * Гоночный «трек»
  16.  
  17. Создан 1 мая 2013 Х. Янгом (X. Yang),
  18. модифицирован 12 мая 2013 Д. Куартиллье (D. Cuartielles).
  19.  
  20. Этот код не защищен авторским правом.
  21. */
  22.  
  23. #include <ArduinoRobot.h> // подключаем библиотеку робота
  24. #include <Wire.h>
  25. #include <SPI.h>
  26.  
  27. void setup() {
  28.   // Инициализируем робота, SD-карту, дисплей и динамик:
  29.   Robot.begin();
  30.   Robot.beginTFT();
  31.   Robot.beginSD();
  32.   Robot.beginSpeaker();
  33.  
  34.   // Рисуем на экране логотипы – «lg0.bmp» и «lg1.bmp»:
  35.   Robot.displayLogos();
  36.  
  37.   // Показываем на экране картинку с инструкциями к примеру «Следование за линией»(с SD-карты):
  38.   Robot.drawBMP("lf.bmp", 0, 0);
  39.  
  40.   // Проигрываем музыкальный файл «Chase»:
  41.   Robot.playFile("chase.sqm");
  42.  
  43.   // Печатаем инструкции:
  44.   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 препятствия"
  45.   Robot.text("Press the middle\n button to start...", 5, 61);
  46.   Robot.waitContinue();  //  "Нажмите среднюю\n кнопку, чтобы\n начать..."
  47.  
  48.   // Стартуем:
  49.   Robot.fill(255, 255, 255);
  50.   Robot.stroke(255, 255, 255);
  51.   Robot.rect(0, 0, 128, 80); // стираем предыдущий текст
  52.   Robot.stroke(0, 0, 0);
  53.   Robot.text("Start", 5, 5);  // "Старт"
  54.  
  55.   // Эта функция калибрует алгоритм следования по линии.
  56.   // Ниже один из вариантов калибровки спрятан от компилятора
  57.   // двумя слешами. Если считаете, что он подходит лучше,
  58.   // расскомментируйте его и закомментируйте
  59.   // (т.е. закройте двумя слешами) тот, который находится ниже него:
  60.   // Robot.lineFollowConfig(14, 9, 50, 10);
  61.   Robot.lineFollowConfig(11, 7, 60, 5);
  62.  
  63.   // Запускаем «сдвигающую» последовательность:
  64.   rescueSequence();
  65.   // Снова находим линию:
  66.   goToNext();
  67.   // Еще раз запускаем «сдвигающую» последовательность:
  68.   rescueSequence();
  69.  
  70.   // Здесь, если нужно, можем продолжать «сдвигание» еще и еще...
  71.  
  72.  
  73. }
  74.  
  75. void loop() {
  76.   // в этом блоке ничего – программа запускается лишь единожды
  77. }
  78.  
  79. // Функция для запуска последовательности спасающе-сдвигающих действий:
  80. void rescueSequence() {
  81.   // Делаем так, чтобы моторная плата начала работать в режиме следования за линией:
  82.   Robot.setMode(MODE_LINE_FOLLOW);
  83.  
  84.   while (!Robot.isActionDone()) { // ждем, пока робот не перестанет следовать за линией
  85.   }
  86.   delay(1000);
  87.  
  88.   // Проделываем сдвигание объекта:
  89.   doRescue();
  90.   delay(1000);
  91. }
  92.  
  93. // Функция с набором действий для сдвигания «пострадавшего»:
  94. void doRescue() {
  95.   // Доезжаем до остановки, начинаем воздействовать на объект:
  96.   Robot.motorsWrite(200, 200);
  97.   delay(250);
  98.   Robot.motorsStop();
  99.   delay(1000);
  100.  
  101.   // Поворачиваем робота:
  102.   Robot.turn(90);
  103.   Robot.motorsStop();
  104.   delay(1000);
  105.  
  106.   // Едем вперед:
  107.   Robot.motorsWrite(200, 200);
  108.   delay(500);
  109.   Robot.motorsStop();
  110.   delay(1000);
  111.  
  112.   // Едем назад, оставляем объект:
  113.   Robot.motorsWrite(-200, -200);
  114.   delay(500);
  115.   Robot.motorsStop();
  116. }
  117.  
  118. void goToNext() {
  119.   // Поворачиваем робота:
  120.   Robot.turn(-90);
  121.   Robot.motorsStop();
  122.   delay(1000);
  123. }

См.также

  1. Line Following example

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

  1. Arduino - Rescue