Проект 12: Управление роботом с помощью ИК-пульта на Arduino

В этом проекте мы будем использовать ИК-пульт для управления движением робота на базе Arduino. Мы будем использовать библиотеку AlashIRControlRX для приема сигналов с ИК-пульта и библиотеку AlashMotorControlLite для управления моторами робота. В данном проекте мы подключим ИК-приемник к аналоговому пину A2.

Принцип работы

ИК-пульт передает команды с помощью инфракрасного излучения, которые принимаются ИК-приемником. Arduino обрабатывает эти сигналы и управляет моторами робота в соответствии с полученными командами. Это позволяет дистанционно управлять движением робота: вперед, назад, влево, вправо и остановка.

Необходимые компоненты

  • Arduino Uno

  • Моторы и мотор-шилд (или драйвер моторов)

  • ИК-приемник (например, VS1838B)

  • ИК-пульт

  • Соединительные провода

  • Макетная плата

Подключение компонентов

Подключение ИК-приемника: - VCC → 5V Arduino - GND → GND Arduino - OUT → пин A2 Arduino

Подключение моторов через драйвер:

  • Левый мотор: - IN1 → пин 9 - IN2 → пин 8 - ENA → пин 10

  • Правый мотор: - IN1 → пин 7 - IN2 → пин 6 - ENB → пин 5

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

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

  1. Перейдите на официальный репозиторий библиотеки AlashIRControl на GitHub по следующей ссылке: AlashIRControl GitHub

  2. На странице репозитория нажмите кнопку «Code» и выберите «Download ZIP» для скачивания архива с библиотекой.

  3. После скачивания архива с библиотекой, распакуйте его в удобное для вас место на вашем компьютере.

  4. Откройте Arduino IDE.

  5. Перейдите в меню «Скетч» -> «Подключить библиотеку» -> «Добавить .ZIP библиотеку…».

  6. В открывшемся окне проводника найдите и выберите скачанный и распакованный архив с библиотекой AlashIRControl. Нажмите «Открыть».

  7. Arduino IDE автоматически установит библиотеку, и внизу окна появится сообщение «Библиотека добавлена. Проверьте меню „Подключить библиотеку“».

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

Для установки библиотеки AlashMotorControlLite повторите те же шаги, что и для установки библиотеки AlashIRControlRX, используя следующую ссылку на репозиторий: AlashMotorControlLite GitHub

Алгоритм работы

Робот работает по следующему алгоритму:

  1. Ожидание сигнала - ИК-приемник ожидает сигнал от пульта

  2. Прием команды - при получении сигнала определяется код кнопки

  3. Обработка команды - в зависимости от кода выполняется соответствующее действие: - Кнопка «Вверх» → движение вперед - Кнопка «Вниз» → движение назад - Кнопка «Влево» → поворот налево - Кнопка «Вправо» → поворот направо - Кнопка «OK» → остановка

  4. Выполнение действия - робот выполняет выбранное движение

  5. Повторение - цикл повторяется

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

#include <AlashIRControlRX.h>
#include <AlashMotorControlLite.h>

// Определение пинов для моторов
const int pinLB = 9;         // задний левый мотор
const int pinLF = 8;         // передний левый мотор
const int pinRB = 7;         // задний правый мотор
const int pinRF = 6;         // передний правый мотор
const int Lpwm_pin = 10;     // ШИМ для левого мотора
const int Rpwm_pin = 5;      // ШИМ для правого мотора

// Определение пина для ИК-приемника
const int RECV_PIN = A2;

// Определение кода для кнопки ESC
#define IR_ESC     0x00ff52ad

unsigned char Lpwm_val = 200;
unsigned char Rpwm_val = 200;
int Car_state = 0;

// Инициализация ИК приемника
AlashIRControlRX irrecv(RECV_PIN);

// Создаем объект motorLeft с режимом DIR_DIR_PWM и пинами inA = 9, inB = 8, PWM = 10
AlashMotorControlLite motorLeft(DIR_DIR_PWM, 9, 8, 10);
// Создаем объект motorRight с режимом DIR_DIR_PWM и пинами inA = 6, inB = 7, PWM = 9
AlashMotorControlLite motorRight(DIR_DIR_PWM, 7, 6, 5);

void advance() {     // движение вперед
  motorLeft.setSpeed(Lpwm_val); // Установка скорости вращения вперед для левого мотора
  motorRight.setSpeed(Rpwm_val); // Установка скорости вращения вперед для правого мотора
  Car_state = 1;
  show_state();
}

void turnR() {        // поворот направо
  motorLeft.setSpeed(Lpwm_val); // Установка скорости вращения вперед для левого мотора
  motorRight.setSpeed(-Rpwm_val); // Установка скорости вращения назад для правого мотора
  Car_state = 4;
  show_state();
}

void turnL() {        // поворот налево
  motorLeft.setSpeed(-Lpwm_val); // Установка скорости вращения назад для левого мотора
  motorRight.setSpeed(Rpwm_val); // Установка скорости вращения вперед для правого мотора
  Car_state = 3;
  show_state();
}

void stopp() {         // остановка
  motorLeft.setSpeed(0); // Остановка левого мотора
  motorRight.setSpeed(0); // Остановка правого мотора
  Car_state = 5;
  show_state();
}

void back() {          // движение назад
  motorLeft.setSpeed(-100); // Установка скорости вращения назад для левого мотора
  motorRight.setSpeed(-100); // Установка скорости вращения назад для правого мотора
  Car_state = 2;
  show_state();
}

void show_state(void) {
  switch (Car_state) {
    case 1: Serial.print("\n GO"); break;
    case 2: Serial.print("\n Back"); break;
    case 3: Serial.print("\n Left"); break;
    case 4: Serial.print("\n Right"); break;
    case 5: Serial.print("\n Stop"); break;
    default: break;
  }
}

void IR_Control(void) {
  unsigned long Key;
  while (Key != IR_ESC) {
    if (irrecv.check()) { // Проверка наличия данных от ИК-пульта
      Key = irrecv.data;
      switch (Key) {
        case 0xFF18E7: advance(); break;  // движение вперед
        case 0xFF4AB5: back(); break;   // движение назад
        case 0xFF10EF: turnL(); break;  // поворот налево
        case 0xFF5AA5: turnR(); break; // поворот направо
        case 0xFF38C7: stopp(); break;  // остановка
        default: break;
      }
    }
  }
  stopp();
}

void setup() {
  irrecv.begin(); // Запуск ИК приемника
  Serial.begin(9600); // Инициализация серийного порта
  stopp();
}

void loop() {
  if (irrecv.check()) {
    Serial.println(irrecv.data, HEX);
    IR_Control();
  }
}

Описание функций

Функции управления движением:

  • advance() - движение вперед с заданной скоростью

  • back() - движение назад с уменьшенной скоростью

  • turnL() - поворот налево (левый мотор назад, правый вперед)

  • turnR() - поворот направо (левый мотор вперед, правый назад)

  • stopp() - полная остановка робота

Функции обработки:

  • show_state() - вывод текущего состояния робота в монитор

  • IR_Control() - обработка команд с ИК-пульта

Коды кнопок ИК-пульта:

  • 0xFF18E7 - кнопка «Вверх» (движение вперед)

  • 0xFF4AB5 - кнопка «Вниз» (движение назад)

  • 0xFF10EF - кнопка «Влево» (поворот налево)

  • 0xFF5AA5 - кнопка «Вправо» (поворот направо)

  • 0xFF38C7 - кнопка «OK» (остановка)

  • 0x00ff52ad - кнопка «ESC» (выход из режима управления)

Результат работы

После загрузки кода робот будет:

  • Реагировать на команды с ИК-пульта

  • Двигаться вперед при нажатии кнопки «Вверх»

  • Двигаться назад при нажатии кнопки «Вниз»

  • Поворачивать налево при нажатии кнопки «Влево»

  • Поворачивать направо при нажатии кнопки «Вправо»

  • Останавливаться при нажатии кнопки «OK»

  • Выводить информацию о состоянии в монитор последовательного порта

Настройка параметров

Для оптимизации работы робота можно изменить следующие параметры:

  • Скорость движения: Измените Lpwm_val и Rpwm_val для регулировки скорости моторов

  • Скорость заднего хода: Измените значения в функции back() для настройки скорости движения назад

  • Коды кнопок: При необходимости измените коды кнопок в функции IR_Control() в соответствии с вашим ИК-пультом

Полезная информация

ИК-пульт: Универсальное устройство дистанционного управления, которое можно использовать для управления различными устройствами, включая роботов.

Библиотека AlashIRControlRX: Упрощает работу с ИК-приемниками, предоставляя удобные функции для получения данных с пульта.

Библиотека AlashMotorControlLite: Обеспечивает простое управление моторами с различными режимами работы и скоростями.

Отладка: Используйте монитор последовательного порта для отладки и проверки работы ИК-приемника.

Заключение

Этот проект демонстрирует, как использовать ИК-пульт для управления движением робота на базе Arduino. Мы использовали библиотеки AlashIRControlRX и AlashMotorControlLite для приема ИК-сигналов и управления моторами соответственно.

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