Arduino:Примеры/RobotRemotecontrol

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

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


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

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

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

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

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

  • Arduino Robot;
  • Инфракрасный датчик;
  • Кабель (чтобы подключить этот датчик);
  • Пульт управления, совместимый с 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». Замените имеющиеся в этих строчках значения на те, что увидели на экране.

Пробуем

LottieLemon Remote 780.png

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

Код

 1 /* Удаленное управление
 2 
 3 Если подключить к роботу инфракрасный ресивер, им можно будет
 4 управлять так же, как и радиоуправляемой машинкой. Используя
 5 пульт для дистанционного управления (идет в комплекте с набором
 6 датчиков), вы можете управлять роботом, даже не прикасаясь к нему!
 7 
 8 Цепь:
 9  * Arduino Robot
10  * Ресивер, подключенный к D2
11  * Пульт управления из набора датчиков Arduino
12 
13 Основан на библиотеке IRremote от Кена Ширриффа 
14 (Ken Shirriff, http://arcfn.com).
15 
16 Создан 1 мая 2013 Х. Янгом (X. Yang),
17 модифицирован 12 мая 2013 Д. Куартиллье (D. Cuartielles).
18 
19 Этот код не защищен авторским правом.
20 */
21 
22 // Подключаем необходимые библиотеки:
23 #include <IRremote.h>
24 #include <IRremoteTools.h>
25 #include <ArduinoRobot.h>
26 #include <Wire.h>
27 #include <SPI.h>
28 
29 // Задаем несколько команд для пульта управления:
30 #define IR_CODE_FORWARD 284154405
31 #define IR_CODE_BACKWARDS 284113605
32 #define IR_CODE_TURN_LEFT 284129925
33 #define IR_CODE_TURN_RIGHT 284127885
34 #define IR_CODE_CONTINUE -1
35 
36 boolean isActing = false; // переменная, которая определяет, выполняет ли робот команду, посланную пультом
37 long timer;
38 const long TIME_OUT = 150;
39 
40 void setup() {
41   // Инициализируем робота, SD-карту и дисплей:
42   Serial.begin(9600);
43   Robot.begin();
44   Robot.beginTFT();
45   Robot.beginSD();
46 
47   // Выводим на экране немного текста:
48   beginIRremote(); // запускаем ресивер
49 }
50 
51 void loop() {
52   // Если получили команду, обрабатываем ее:
53   if (IRrecived()) {
54     processResult();
55     resumeIRremote(); // возобновляем работу ресивера
56   }
57 
58   // Если робот не получил никакой команды, останавливаем его:
59   if (isActing && (millis() - timer >= TIME_OUT)) {
60     Robot.motorsStop();
61     isActing = false;
62   }
63 }
64 void processResult() {
65   unsigned long res = getIRresult();
66   switch (res) {
67     case IR_CODE_FORWARD:
68       changeAction(1, 1); // двигаем робота вперед
69       break;
70     case IR_CODE_BACKWARDS:
71       changeAction(-1, -1); // двигаем робота назад
72       break;
73     case IR_CODE_TURN_LEFT:
74       changeAction(-0.5, 0.5); // двигаем робота влево
75       break;
76     case IR_CODE_TURN_RIGHT:
77       changeAction(0.5, -0.5); // двигаем робота вправо
78       break;
79     case IR_CODE_CONTINUE:
80       timer = millis(); // продолжаем последнее действие и сбрасываем таймер
81       break;
82   }
83 }
84 void changeAction(float directionLeft, float directionRight) {
85   Robot.motorsWrite(255 * directionLeft, 255 * directionRight);
86   timer = millis();
87   isActing = true;
88 }

См.также

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

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