Arduino:Примеры/RobotRemotecontrol

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

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


Удаленное управление[1]

Этот пример создавался как экспериментальный – для его работы на вашей IDE необходимо установить библиотеку IR-Remote от Кена Ширриффа (Ken Shirriff).

Чтобы узнать о ней более подробно, смотрите сам код.

При помощи инфракрасного ресивера роботом можно управлять как телевизором – с пульта управления. В этом примере мы возьмем пульт управления, совместимый с Sony, и назначим некоторым его кнопкам определенные действия. Благодаря этому мы сможем управлять роботом, даже не прикасаясь к нему.

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

Инструкция

  1. При помощи кабеля подключите датчик к контакту TKD2 (на верхней плате);
  2. Зафиксируйте датчик на плате;
  3. Загрузите скетч, отключите USB и включите питание;
  4. После того, как робот покажет загрузочную картинку, возьмите пульт и начните давать роботу те или иные команды, нажимая на запрограммированные вами кнопки;
  5. Если робот распознает посылаемые вами сигналы и команды, то будет показывать их на своем экране;
  6. Если хотите перенастроить команды, то проделайте следующее. Нажимайте на кнопки на пульте – благодаря этому на экране начнут появляться определенные значения. Запишите их куда-нибудь. Затем найдите в коде следующие строчки: «#define IR_CODE_FORWARD 0x2C9B», «#define IR_CODE_BACKWARDS 0x6C9B», «#define IR_CODE_TURN_LEFT 0xD4B8F» и «#define IR_CODE_TURN_RIGHT 0x34B8F». Замените имеющиеся в этих строчках значения на те, что увидели на экране.

Пробуем

Рис. 1. Дистанционное управление роботом.
Рис. 1. Дистанционное управление роботом.

Код

/* Удаленное управление

Если подключить к роботу инфракрасный ресивер, им можно будет
управлять так же, как и радиоуправляемой машинкой. Используя
пульт для дистанционного управления (идет в комплекте с набором
датчиков), вы можете управлять роботом, даже не прикасаясь к нему!

Цепь:
 * Arduino Robot
 * Ресивер, подключенный к D2
 * Пульт управления из набора датчиков Arduino

Основан на библиотеке IRremote от Кена Ширриффа 
(Ken Shirriff, http://arcfn.com).

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

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

// Подключаем необходимые библиотеки:
#include <IRremote.h>
#include <IRremoteTools.h>
#include <ArduinoRobot.h>
#include <Wire.h>
#include <SPI.h>

// Задаем несколько команд для пульта управления:
#define IR_CODE_FORWARD 284154405
#define IR_CODE_BACKWARDS 284113605
#define IR_CODE_TURN_LEFT 284129925
#define IR_CODE_TURN_RIGHT 284127885
#define IR_CODE_CONTINUE -1

boolean isActing = false; // переменная, которая определяет, выполняет ли робот команду, посланную пультом
long timer;
const long TIME_OUT = 150;

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

  // Выводим на экране немного текста:
  beginIRremote(); // запускаем ресивер
}

void loop() {
  // Если получили команду, обрабатываем ее:
  if (IRrecived()) {
    processResult();
    resumeIRremote(); // возобновляем работу ресивера
  }

  // Если робот не получил никакой команды, останавливаем его:
  if (isActing && (millis() - timer >= TIME_OUT)) {
    Robot.motorsStop();
    isActing = false;
  }
}
void processResult() {
  unsigned long res = getIRresult();
  switch (res) {
    case IR_CODE_FORWARD:
      changeAction(1, 1); // двигаем робота вперед
      break;
    case IR_CODE_BACKWARDS:
      changeAction(-1, -1); // двигаем робота назад
      break;
    case IR_CODE_TURN_LEFT:
      changeAction(-0.5, 0.5); // двигаем робота влево
      break;
    case IR_CODE_TURN_RIGHT:
      changeAction(0.5, -0.5); // двигаем робота вправо
      break;
    case IR_CODE_CONTINUE:
      timer = millis(); // продолжаем последнее действие и сбрасываем таймер
      break;
  }
}
void changeAction(float directionLeft, float directionRight) {
  Robot.motorsWrite(255 * directionLeft, 255 * directionRight);
  timer = millis();
  isActing = true;
}

См.также

  1. begin()
  2. motorsWrite()
  3. https://github.com/shirriff/Arduino-IRremote

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