Arduino:Примеры/RobotLogo

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

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


Базовые движения Arduino Robot[1]

Этот скетч демонстрирует базовые движения, на которые способен Arduino Robot. Когда скетч начнет работать, начинайте нажимать на кнопки, находящиеся на верхней (контрольной) плате, тем самым указывая для робота желаемый маршрут. Введя нужную последовательность (до 20 «шагов» за раз), нажмите на среднюю кнопку, чтобы записать ее в память. Теперь поставьте робота на пол, чтобы он начинал перемещаться согласно введенным вами инструкциям.

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

  • Arduino Robot;

Инструкция

  1. Загрузите скетч, отсоедините USB и включите питание.
  2. Поставьте робота на пол – на чистую, гладкую поверхность, чтобы он мог свободно по ней перемещаться.
  3. Показав на своем экране загрузочные картинки, робот попросит вас ввести команды.
  4. Начинайте нажимать на кнопки, тем самым указывая роботу желаемый маршрут движения. Робот будет записывать эти команды, чтобы позднее приступить к их выполнению.
  5. Кнопка «Влево» – это левый поворот на 90 градусов, «Вправо» – правый поворот на 90 градусов, «Вверх» – робот идет вперед в течение одной секунды, «Вниз» – робот идет назад в течение одной секунды.
  6. Закончив с маршрутом, нажмите на среднюю кнопку. После этого робот начнет по порядку выполнять введенные вами команды. Робот может запомнить не более 20 команд, и если вы введете все 20, то робот начнет выполнять их еще до того, как вы нажмете среднюю кнопку.
  7. Выполнив запрограммированную последовательность, робот вернется к 3-ему шагу этой инструкции. Вводите новые команды и пробуйте еще раз!

Пробуем

Программирование движений робота на кнопочной крестовине

Попробуйте повторить эту последовательность на своем Arduino Robot

Код

Тут мы попробуем объяснить код – строчка за строчкой.

/* Базовые движения Arduino Robot

Этот скетч демонстрирует базовые движения Arduino Robot.
Когда скетч запустится, начинайте нажимать на кнопки,
находящиеся на верхней (контрольной) плате, чтобы указать роботу, 
каким маршрутом двигаться. Нажав на среднюю кнопку, вы
сохраните введенную вами последовательность, а робот,
в свою очередь, согласно этой последовательности будет передвигаться. 
Записать можно не более 20 команд. На выполнение одной команды будет
уходить одна секунда.

Этот пример использует изображения, хранящиеся на SD-карте.
Он ищет файлы с названиями «lg0.bmp» и «lg1.bmp», а затем 
показывает их на своем экране.

Цепь:
* Arduino Robot

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

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

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

int commands[20];  // массив для хранения команд

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

  // Показываем на экране картинки «lg0.bmp» и «lg1.bmp»:
  Robot.displayLogos();
}

void loop() {

  Robot.drawBMP("intro.bmp", 0, 0);  // фоновое изображение экрана

  iniCommands(); // удаляем команды из массива
  addCommands(); // добавляем команды в массив

  delay(1000); // ждем секунду

  executeCommands(); // следуем заданной последовательности

  Robot.stroke(0, 0, 0);
  Robot.text("Done!", 5, 103); // пишем на экране сообщение «Готово!»
  delay(1500); // немного ждем
}

// Функция для очистки массива с командами:
void iniCommands() {
  for (int i = 0; i < 20; i++) {
    commands[i] = -1;
  }
}

// Функция для добавления команд в массив:
void addCommands() {
  Robot.stroke(0, 0, 0);
  // Показываем на экране сообщение:
  Robot.text("1. Press buttons to\n add commands.\n\n 2. Middle to finish.", 5, 5);  //  "1. Нажимайте кнопки\n, чтобы ввести команды.\n\n 2. Когда закончите\n, нажмите среднюю кнопку."

  // Считываем состояния кнопок:
  for (int i = 0; i < 20;) { // устанавливаем лимит в 20 команд
    int key = Robot.keyboardRead();
    if (key == BUTTON_MIDDLE) { // кнопка для завершения ввода последовательности
      break;
    } else if (key == BUTTON_NONE) { // если на среднюю кнопку не нажали, продолжаем
      continue;
    }
    commands[i] = key; // сохраняем состояние кнопки в массив
    PrintCommandI(i, 46); // показываем команду на экране
    delay(100);
    i++;
  }
}
// Функция для «прочесывания» массива с командами 
// (т.е. функция, которая будет отдавать роботу те или иные команды):
void executeCommands() {
  // Выводим на монитор статусное сообщение:
  Robot.text("Excuting...", 5, 70);  //  "Выполнение..."

  // «Прочесываем» массив и двигаем робота согласно имеющимся в нем командам:
  for (int i = 0; i < 20; i++) {
    switch (commands[i]) {
      case BUTTON_LEFT:
        Robot.turn(-90);
        break;
      case BUTTON_RIGHT:
        Robot.turn(90);
        break;
      case BUTTON_UP:
        Robot.motorsWrite(255, 255);
        break;
      case BUTTON_DOWN:
        Robot.motorsWrite(-255, -255);
        break;
      case BUTTON_NONE:
        return;
    }
    // Печатаем текущую команду на экране:
    Robot.stroke(255, 0, 0);
    PrintCommandI(i, 86);
    delay(1000);

    // Притормаживаем робота на секунду:
    Robot.motorsStop();
    delay(1000);
  }
}

// Конвертируем нажатие на кнопку в один символ:
char keyToChar(int key) {
  switch (key) {
    case BUTTON_LEFT:
      return '<';
    case BUTTON_RIGHT:
      return '>';
    case BUTTON_UP:
      return '^';
    case BUTTON_DOWN:
      return 'v';
  }
}

// Функция для показа команды на мониторе:
void PrintCommandI(int i, int originY) {
  Robot.text(keyToChar(commands[i]), i % 14 * 8 + 5, i / 14 * 10 + originY);
}

См.также

  1. begin()
  2. beginTFT()
  3. motorsWrite()
  4. turn()
  5. keyboardRead()

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