Проект 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:
Перейдите на официальный репозиторий библиотеки AlashIRControl на GitHub по следующей ссылке: AlashIRControl GitHub
На странице репозитория нажмите кнопку «Code» и выберите «Download ZIP» для скачивания архива с библиотекой.
После скачивания архива с библиотекой, распакуйте его в удобное для вас место на вашем компьютере.
Откройте Arduino IDE.
Перейдите в меню «Скетч» -> «Подключить библиотеку» -> «Добавить .ZIP библиотеку…».
В открывшемся окне проводника найдите и выберите скачанный и распакованный архив с библиотекой AlashIRControl. Нажмите «Открыть».
Arduino IDE автоматически установит библиотеку, и внизу окна появится сообщение «Библиотека добавлена. Проверьте меню „Подключить библиотеку“».
Установка библиотеки AlashMotorControlLite:
Для установки библиотеки AlashMotorControlLite повторите те же шаги, что и для установки библиотеки AlashIRControlRX, используя следующую ссылку на репозиторий: AlashMotorControlLite GitHub
Алгоритм работы
Робот работает по следующему алгоритму:
Ожидание сигнала - ИК-приемник ожидает сигнал от пульта
Прием команды - при получении сигнала определяется код кнопки
Обработка команды - в зависимости от кода выполняется соответствующее действие: - Кнопка «Вверх» → движение вперед - Кнопка «Вниз» → движение назад - Кнопка «Влево» → поворот налево - Кнопка «Вправо» → поворот направо - Кнопка «OK» → остановка
Выполнение действия - робот выполняет выбранное движение
Повторение - цикл повторяется
Пример кода для управления роботом с помощью ИК-пульта
#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 для приема ИК-сигналов и управления моторами соответственно.
Следуя инструкции по подключению компонентов и установке библиотек, вы сможете легко собрать этот проект и экспериментировать с различными командами ИК-пульта для управления роботом. Этот проект служит отличной основой для создания более сложных систем дистанционного управления роботами.