Назад к каталогу
Проект 2. Управление роботом с пульта
Сложность: НачальныйДлительность: 60-90 минутРобототехника

Проект 2. Управление роботом с пульта

Настройка инфракрасного управления и программирование команд движения

В этом проекте робот начинает реагировать на команды пользователя. Теперь он будет двигаться не по заранее записанному алгоритму, а по нажатию кнопок на ИК-пульте. Принцип работы простой: когда вы нажимаете кнопку на пульте, пульт отправляет инфракрасный сигнал. ИК-приёмник на роботе принимает этот сигнал и передаёт его в Arduino. Arduino считывает числовое значение — именно поэтому сначала нужно узнать, какой код соответствует каждой кнопке, а уже потом привязать эти коды к движениям робота. Моторы подключены параллельно по сторонам: два мотора слева работают как одна группа, и два мотора справа — как вторая. Поэтому управлять мы будем не каждым мотором отдельно, а левой и правой стороной робота.

Теги

  • STEM
  • Arduino
  • Робототехника
  • ИК-пульт
  • IRremote
  • Управление
  • Электроника

В этом проекте робот начинает реагировать на команды пользователя. Теперь он будет двигаться не по заранее записанному алгоритму, а по нажатию кнопок на ИК-пульте. Но перед тем, как писать программу для движения, нужно сделать первый важный шаг — научиться получать коды кнопок. Без этого робот просто не поймёт, какую именно команду вы ему отправляете. Принцип работы очень простой. Когда вы нажимаете кнопку на пульте, пульт отправляет инфракрасный сигнал. ИК-приёмник, установленный на роботе, принимает этот сигнал и передаёт его в Arduino. Arduino считывает числовое значение. Именно поэтому сначала нужно узнать, какой код соответствует каждой кнопке, а уже потом привязать эти коды к движениям робота. Моторы, как и в первом проекте, подключены параллельно по сторонам: два мотора слева работают как одна группа, и два мотора справа работают как вторая группа. Поэтому управлять мы будем не каждым мотором отдельно, а левой и правой стороной робота.

Подключение ИК-приёмника и установка библиотеки

У ИК-приёмника обычно три контакта: питание, земля и сигнальный вывод. Питание подключается к 5V, земля к GND, а сигнальный вывод к пину D2. Перед загрузкой программы нужно установить библиотеку IRremote, потому что именно она позволяет Arduino распознавать сигналы от пульта. Откройте Arduino IDE. В верхнем меню выберите пункт «Скетч», затем «Подключить библиотеку», после этого нажмите «Управлять библиотеками…». Откроется окно менеджера библиотек. В строке поиска введите IRremote. В списке найдите библиотеку с названием IRremote и нажмите кнопку «Установить». Дождитесь окончания установки. После этого библиотека будет доступна во всех следующих проектах. Если библиотека уже установлена, Arduino IDE обычно показывает кнопку Update или ничего не предлагает. В таком случае можно переходить к коду. Если после установки библиотека всё равно не подключается, закройте Arduino IDE и откройте её снова. Это помогает, когда среда не сразу обновляет список библиотек.

Получение кодов кнопок

Сначала загрузите тестовую программу, которая ничего не делает с моторами, а только выводит коды кнопок в монитор порта. Это обязательный этап.

#include <IRremote.h>

const int IR_PIN = 2;

IRrecv irrecv(IR_PIN);
decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume();
  }
}

После загрузки программы откройте монитор порта. Для этого нажмите значок лупы в правом верхнем углу Arduino IDE или выберите пункт «Инструменты» → «Монитор порта». Скорость должна быть установлена 9600 бод, потому что именно такая скорость указана в строке Serial.begin(9600). Теперь по очереди нажимайте кнопки на пульте и записывайте коды, которые появляются на экране. Лучше сразу выписать коды для пяти основных кнопок: вперёд, назад, влево, вправо и стоп. Например, можно завести небольшой список в тетради или прямо в комментариях к программе. Когда все нужные значения будут записаны, можно переходить к основной программе управления.

Что делает тестовая программа

Разберём этот код по частям. В строке #include <IRremote.h> подключается библиотека, которая умеет работать с инфракрасными сигналами. Без неё Arduino не сможет распознать команды с пульта. Строка const int IR_PIN = 2; задаёт номер пина, к которому подключён сигнальный вывод ИК-приёмника. Если вы подключили приёмник к другому пину, здесь нужно указать именно его. Объект IRrecv irrecv(IR_PIN); создаёт приёмник сигналов и связывает его с выбранным пином. Строка decode_results results; создаёт переменную, в которую будут записываться данные о принятом сигнале. В функции setup() запускается Serial.begin(9600); — это открывает связь между платой и компьютером, чтобы мы могли видеть коды кнопок в мониторе порта. Следующая строка irrecv.enableIRIn(); включает сам приём инфракрасных сигналов. Внутри loop() постоянно проверяется условие irrecv.decode(&results). Если приёмник поймал сигнал, функция возвращает true, и тогда программа выводит значение results.value в шестнадцатеричном виде командой Serial.println(results.value, HEX);. После этого обязательно вызывается irrecv.resume(); — эта команда подготавливает приёмник к чтению следующего сигнала. Если её убрать, новые нажатия кнопок перестанут считываться.

Основная программа управления роботом

После того как коды найдены, можно написать программу, которая будет связывать каждую кнопку с движением робота. Ниже приведён пример такой программы. При необходимости замените коды в условиях if на те, которые вы считали со своего пульта.

#include <IRremote.h>

const int IR_PIN = 2;

IRrecv irrecv(IR_PIN);
decode_results results;

// Пины драйвера MX1508
const int LEFT_IN1  = 5;
const int LEFT_IN2  = 6;
const int RIGHT_IN1 = 9;
const int RIGHT_IN2 = 10;

void setup() {
  irrecv.enableIRIn();

  pinMode(LEFT_IN1, OUTPUT);
  pinMode(LEFT_IN2, OUTPUT);
  pinMode(RIGHT_IN1, OUTPUT);
  pinMode(RIGHT_IN2, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {

    unsigned long code = results.value;

    if (code == 0xFF18E7) {
      forward();
    }
    else if (code == 0xFF4AB5) {
      backward();
    }
    else if (code == 0xFF10EF) {
      left();
    }
    else if (code == 0xFF5AA5) {
      right();
    }
    else if (code == 0xFF38C7) {
      stopMotors();
    }

    irrecv.resume();
  }
}

void forward() {
  digitalWrite(LEFT_IN1, HIGH);
  digitalWrite(LEFT_IN2, LOW);
  digitalWrite(RIGHT_IN1, HIGH);
  digitalWrite(RIGHT_IN2, LOW);
}

void backward() {
  digitalWrite(LEFT_IN1, LOW);
  digitalWrite(LEFT_IN2, HIGH);
  digitalWrite(RIGHT_IN1, LOW);
  digitalWrite(RIGHT_IN2, HIGH);
}

void left() {
  digitalWrite(LEFT_IN1, LOW);
  digitalWrite(LEFT_IN2, HIGH);
  digitalWrite(RIGHT_IN1, HIGH);
  digitalWrite(RIGHT_IN2, LOW);
}

void right() {
  digitalWrite(LEFT_IN1, HIGH);
  digitalWrite(LEFT_IN2, LOW);
  digitalWrite(RIGHT_IN1, LOW);
  digitalWrite(RIGHT_IN2, HIGH);
}

void stopMotors() {
  digitalWrite(LEFT_IN1, LOW);
  digitalWrite(LEFT_IN2, LOW);
  digitalWrite(RIGHT_IN1, LOW);
  digitalWrite(RIGHT_IN2, LOW);
}

Разбор основной программы

Первые строки снова подключают библиотеку IRremote и задают пин ИК-приёмника. Это та же часть, что и в тестовой программе, только теперь к ней добавлено управление моторами. Далее указываются пины драйвера MX1508. Для левой стороны используются LEFT_IN1 и LEFT_IN2, для правой — RIGHT_IN1 и RIGHT_IN2. Драйвер MX1508 управляет направлением вращения моторов с помощью комбинаций HIGH и LOW на этих пинах. В setup() приёмник включается командой irrecv.enableIRIn();, а пины драйвера переводятся в режим OUTPUT. Это обязательно, потому что Arduino должна не только принимать сигналы с пульта, но и отправлять управляющие сигналы на драйвер моторов. Внутри loop() программа снова ждёт новый сигнал от пульта. Когда сигнал приходит, его значение записывается в переменную code. После этого начинается сравнение: если code совпадает со значением кнопки «вперёд», вызывается функция forward();. Если совпадает с кодом кнопки «назад», вызывается backward(); и так далее. Так мы получаем простую и очень важную схему работы: кнопка на пульте отправляет код, Arduino принимает этот код, сравнивает его с известными значениями и запускает нужное действие. Именно по такому принципу строятся не только простые проекты с пультом, но и более сложные системы управления. Теперь разберём функции движения. В функции forward() левая и правая стороны получают команду двигаться вперёд. Для этого на одном пине каждой стороны задаётся HIGH, а на втором LOW. В функции backward() комбинация меняется на противоположную, и обе стороны начинают вращаться назад. Функция left() заставляет левую сторону вращаться назад, а правую вперёд. Из-за этого робот разворачивается влево. Функция right() работает наоборот: левая сторона движется вперёд, а правая назад, поэтому робот разворачивается вправо. Функция stopMotors() устанавливает LOW на всех управляющих пинах. Это означает, что команды на движение не подаются, и робот останавливается.

Как проверить работу проекта

После загрузки программы положите робота на ровную поверхность и проверьте все основные кнопки. Сначала убедитесь, что кнопка вперёд действительно заставляет робота ехать вперёд. Затем проверьте назад, левый и правый повороты, а после этого кнопку стоп. Если робот едет не в ту сторону, проблема обычно не в пульте, а в подключении моторов или в логике движения. В этом случае нужно вернуться к предыдущему проекту. Если робот вообще не реагирует на пульт, сначала проверьте питание ИК-приёмника, затем правильность подключения сигнального пина, после этого снова запустите тестовую программу для вывода кодов. Очень часто ошибка оказывается в том, что в основной программе указаны не те коды, которые реально приходят от вашего пульта. Когда всё заработает, попробуйте усложнить проект. Например, можно добавить регулировку скорости, сделать отдельную кнопку для запуска автоматического режима или придумать свои команды для разных кнопок. Но основа этого проекта всегда одна и та же: сначала получить коды кнопок, затем понять их, и только после этого заставить робота выполнять команды.

Материалы

  • контроллер
  • Драйвер MX1508
  • 4 мотор-редуктора
  • ИК-приёмник
  • ИК-пульт
  • Соединительные провода

Этапы

  1. 1

    Подключение ИК-приёмника

    Подключите питание к 5V, землю к GND, сигнальный вывод к пину D2

  2. 2

    Установка библиотеки IRremote

    В Arduino IDE откройте «Скетч» → «Подключить библиотеку» → «Управлять библиотеками…», найдите IRremote и нажмите «Установить»

  3. 3

    Загрузка тестовой программы

    Загрузите код для вывода кодов кнопок в монитор порта (скорость 9600 бод)

  4. 4

    Считывание кодов кнопок

    По очереди нажимайте кнопки пульта и записывайте коды для кнопок вперёд, назад, влево, вправо и стоп

  5. 5

    Настройка пинов драйвера

    Задайте пины MX1508: LEFT_IN1=5, LEFT_IN2=6, RIGHT_IN1=9, RIGHT_IN2=10

  6. 6

    Написание основной программы

    Создайте программу с функциями forward(), backward(), left(), right(), stopMotors() и привяжите их к кодам кнопок

  7. 7

    Замена кодов кнопок

    Замените коды в условиях if на те, которые вы считали со своего пульта

  8. 8

    Загрузка и проверка

    Загрузите программу на Arduino и проверьте все основные кнопки пульта на ровной поверхности

  9. 9

    Отладка направления

    Если робот едет не в ту сторону, проверьте подключение моторов или логику функций движения

  10. 10

    Расширение функционала

    Добавьте регулировку скорости или новые команды для других кнопок пульта

Комментарии

0
Загрузка комментариев...