В одной из предыдущих статей на нашем сайте мы рассматривали робота на Arduino, движущегося вдоль линии. В этой же статье мы рассмотрим аналогичного робота, но управлять его движением будут не инфракрасные датчики, а пользователь, нажимающий определенные клавиши на своем компьютере. Взаимодействие Arduino и компьютера будет осуществляться через последовательный порт.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- Двигатель постоянного тока.
- Драйвер двигателей L293D (купить на AliExpress).
- Батарейка на 9 Вольт.
- Соединитель с батареей.
- Компьютер.
- USB кабель.
- Шасси робота.
Концепция построения робота
Конструируемого нами робота можно условно разделить на 3 части: модуль датчиков, модуль управления и модуль движения. Взаимосвязь между ними представлена на следующем рисунке.
Модуль команд: этот модуль должен иметь порт для последовательной связи, например, персональный компьютер, ноутбук и т.д. В нашем проекте мы использовали ноутбук. Мы будем передавать команды плате Arduino печатая символы на любом терминале, например, hyper terminal, Hercules, putty, последовательный терминал Arduino и т.п.
Модуль управления: в составе это модуля находится плата Arduino UNO, которая управляет всеми процессами функционирования робота. Arduino принимает команды, передаваемые из ноутбука, и сравнивает их с заранее определенными символами или командами. Если команды совпадают, то Arduino передает соответствующую команду модулю движения.
Модуль движения: состоит из микросхемы драйвера мотора L293D и двух двигателей постоянного тока. Для управления двигателями используется микросхема L293D поскольку Arduino не может обеспечить требуемые для этого значения тока и напряжения.
Принципы движения робота
Мы будем управлять движением робота передавая ему команды через последовательный порт. Команды будут формироваться при помощи нажатия соответствующих клавиш.
Когда мы будем нажимать ‘f’ или ‘F’, робот начнет двигаться прямо и будет продолжать двигаться прямо до тех пор пока не поступит какая-нибудь очередная команда.
Когда мы будем нажимать ‘b’ или ‘B’ робот изменит свое состояние и начнет двигаться в противоположном направлении до поступления очередной команды.
Когда мы будем нажимать ‘l’ или ‘L’ робот будет поворачиваться влево до поступления очередной команды.
Когда мы будем нажимать ‘r or ‘R’ робот будет поворачиваться вправо.
А для остановки робота нам необходимо будет нажать ‘s’ или ‘S’.
Работа схемы
Схема устройства представлена на следующем рисунке.
На представленной схеме микросхема драйвера мотора (контакты 2, 7, 10 и 15) подсоединена к контактам Arduino 6, 5, 4 и 3. Для передачи команд роботу мы будем использовать встроенный конвертер последовательного порта при помощи использования USB кабеля с компьютером (лаптопом). Для движения робота используется два двигателя постоянного тока, один из которых подсоединен к контактам 3 и 6 драйвера мотора, а другой двигатель – к контактам 11 и 14 драйвера мотора. Для питания схемы используется батарейка на 9 Вольт.
Исходный код программы
В программе мы первым делом инициализируем используемые контакты.
#define m11 3
#define m12 4
#define m21 5
#define m22 6
Далее мы устанавливаем режим работы этих контактов (на вывод данных) и инициализируем последовательный порт для работы на скорости 9600 бод/с.
pinMode(m11, OUTPUT);
pinMode(m12, OUTPUT);
pinMode(m21, OUTPUT);
pinMode(m22, OUTPUT);
Serial.begin(9600);
Далее мы считываем информацию из буфера последовательного порта с помощью функции “serial.read()” и сохраняем ее значение во временной переменной. А затем сравниваем значение этой переменной с используемыми инструкциями роботу с помощью оператора “if” и даем соответствующие команды роботу.
Далее представлен полный текст программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#define m11 3 #define m12 4 #define m21 5 #define m22 6 void setup() { // конфигурируем контакты на вывод данных pinMode(m11, OUTPUT); pinMode(m12, OUTPUT); pinMode(m21, OUTPUT); pinMode(m22, OUTPUT); Serial.begin(9600); // инициализация последовательного порта } void loop() { while(Serial.available()) { char In=Serial.read(); // считываем значение из буфера последовательного порта и сохраняем его в переменной In if(In=='f' || In=='F') // Forward (движение вперед) { digitalWrite(m11, HIGH); digitalWrite(m12, LOW); digitalWrite(m21, HIGH); digitalWrite(m22, LOW); } else if(In=='b' || In=='B') //backward (движение назад) { digitalWrite(m11, LOW); digitalWrite(m12, HIGH); digitalWrite(m21, LOW); digitalWrite(m22, HIGH); } else if(In=='l' || In=='L') // Left (влево) { digitalWrite(m11, HIGH); digitalWrite(m12, LOW); digitalWrite(m21, LOW); digitalWrite(m22, LOW); } else if(In=='r' || In=='R') // Right (вправо) { digitalWrite(m11, LOW); digitalWrite(m12, LOW); digitalWrite(m21, HIGH); digitalWrite(m22, LOW); } else if(In=='s' || In=='S') // stop (остановка) { digitalWrite(m11, LOW); digitalWrite(m12, LOW); digitalWrite(m21, LOW); digitalWrite(m22, LOW); } else { } } } |