Машина-робот на базе arduino с управление через Bluetooth
Итак,2 месяца назад я узнал про Arduino(что это такое, я думаю, Вы все знаете) После того, как я прочитал несколько статей про то, что можно собрать из этого волшебного микроконтроллера я решил, что соберу свою собственную машину.
Используемые детали и модулиЗа мозг машины я взял Arduino Uno ATmega328P-PU.
Shield, через который подключались моторы-Motor Drive Shield.
Платформу для машины с 2-мя моторами.
И Bluetooth модуль JY-MCU.
И мелочи: паяльник и принадлежности к нему, изолента и т.д. В общем: 36 $
Сбор робота-ШАГ 1Собрав платформу я подключил двигатели к Motor Drive Shield.
Далее подключил сервопривод(тоже к Motor Drive Shield). Прошу вас сразу обратить внимание на перемычку. Если ее убрать, то питание на контроллер Arduino придется подавать отдельно. На рисунке приведена схема, поясняющая электрические соединения шин питания контроллера Arduino и модуля Motor Shield. Основная задача — разобраться с управлением двумя двигателями и вращением одного сервопривода. Все пояснения я добавил в комментариях к коду, поэтому построчно разбирать его не буду. Единственное что поясню — это повороты. Так как колеса нашей платформы не могут поворачиваться, то поворот в стороны реализованы разнонаправленным вращением двигателей, т.е. при повороте вправо правое колесо начинает вращаться назад, а левое вращается вперед. Соединив это всё я залил тестовый скетч:
#include <AFMotor.h> // Подключаем библиотеку для управления двигателями #include <Servo.h> // Подключаем библиотеку для сервоприводом
//Создаем объекты для двигателей AF_DCMotor motor1(1); //канал М1 на Motor Shield — левый AF_DCMotor motor2(2); //канал М2 на Motor Shield — правый
// Создаем объект для сервопривода Servo myservo;
void setup() < // Выбираем пин к которому подключен сервопривод myservo.attach(9); // или 10, если воткнули в крайний разъём // Поворачиваем сервопривод в положение 0 градусов при каждом включении myservo.write(0); // Пауза 5 секунд delay(5000); >
void loop() < //Устанавливаем скорость 100% (0-255) motor1.setSpeed(255); motor2.setSpeed(255);
// Задаем направление движение // FORWARD — вперед // BACKWARD — назад // RELEASE — стоп
// Движение вперед в течении 5 секунд с поворотом сервы на угол 90 градусов motor1.run(FORWARD); motor2.run(FORWARD); myservo.write(90); // Поворот сервы на угол 90 градусов delay(5000);
// Поворот вправо в течении 2 секунд с поворотом сервы на угол 180 градусов
motor1.run(FORWARD); motor2.run(BACKWARD); myservo.write(180); // Поворот сервы на угол 180 градусов delay(2000);
// Движение назад в течении 5 секунд с поворотом сервы на угол 90 градусов motor1.run(BACKWARD); motor2.run(BACKWARD); myservo.write(90); // Поворот сервы на угол 90 градусов delay(5000);
//Поворот влево в течении 2 секунд с поворотом сервы на угол 0 градусов
myservo.write(0); // Поворот сервы на угол 0 градусов delay(2000);
// Остановка двигателей на 3 секунды с поворотом сервы на угол 90 градусов motor1.run(RELEASE); motor2.run(RELEASE); myservo.write(90); // Поворот сервы на угол 90 градусов delay(3000); >
После этого моя машинка делала так:
Движение вперед в течении 5 секунд с поворотом сервы на угол 90 градусов Поворот вправо в течении 2 секунд с поворотом сервы на угол 180 градусов Движение назад в течении 5 секунд с поворотом сервы на угол 90 градусов Поворот влево в течении 2 секунд с поворотом сервы на угол 0 градусов Остановка двигателей на 3 секунды с поворотом сервы на угол 90 градусов
Сбор робота-ШАГ 2Но так как на Motor Drive Shield не было всех нужных выводов я припаял часть проводков напрямик к плате(простите за плохое качество, фотографировал на телефон).
И через 2 мучительных часа я подключил этот модуль(TXT у меня было подключено к A0, а RXD к A1). Потом я залил скетч:
#include <AFMotor.h> // Подключаем библиотеку для управления двигателями #include <Servo.h> // Подключаем библиотеку для сервоприводов #include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты
//Создаем объекты для двигателей AF_DCMotor motor1(1); //канал М1 на Motor Shield — левый AF_DCMotor motor2(2); //канал М2 на Motor Shield — правый
// Создаем объект для сервопривода Servo vservo;
SoftwareSerial BTSerial(A0, A1); // RX, TX
// Создаем переменную для команд Bluetooth char vcmd; // Создаем переменные для запоминания скорости двигателей int vspdL, vspdR; /* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах. Текущая скорость должна быть больше этого значения. В противном случае двигатели со стороны направления поворота просто не будут вращаться */ int vspd = 200;
void setup() < // Устанавливаем скорость передачи данных по Bluetooth BTSerial.begin(9600); // Устанавливаем скорость передачи данных по кабелю Serial.begin(9600); // Выбираем пин к которому подключен сервопривод vservo.attach(9); // или 10, если воткнули в крайний разъём // Поворачиваем сервопривод в положение 90 градусов при каждом включении vservo.write(90); // Устанавливаем максимальную скорость вращения двигателей vspeed(255,255); >
void loop() < // Если есть данные if (BTSerial.available()) < // Читаем команды и заносим их в переменную. char преобразует код символа команды в символ vcmd = (char)BTSerial.read(); // Отправляем команду в порт, чтобы можно было их проверить в «Мониторе порта» Serial.println(vcmd);
// Вперед if (vcmd == 'F') < vforward(); > // Назад if (vcmd == 'B') < vbackward(); > // Влево if (vcmd == 'L') < vleft(); > // Вправо if (vcmd == 'R') < vright(); > // Прямо и влево if (vcmd == 'G') < vforwardleft(); > // Прямо и вправо if (vcmd == 'I') < vforwardright(); > // Назад и влево if (vcmd == 'H') < vbackwardleft(); > // Назад и вправо if (vcmd == 'J') < vbackwardright(); > // Стоп if (vcmd == 'S') < vrelease(); > // Скорость 0% if (vcmd == '0') < vspeed(0,0); > // Скорость 10% if (vcmd == '1') < vspeed(25,25); > // Скорость 20% if (vcmd == '2') < vspeed(50,50); > // Скорость 30% if (vcmd == '3') < vspeed(75,75); > // Скорость 40% if (vcmd == '4') < vspeed(100,100); > // Скорость 50% if (vcmd == '5') < vspeed(125,125); > // Скорость 60% if (vcmd == '6') < vspeed(150,150); > // Скорость 70% if (vcmd == '7') < vspeed(175,175); > // Скорость 80% if (vcmd == '8') < vspeed(200,200); > // Скорость 90% if (vcmd == '9') < vspeed(225,225); > // Скорость 100% if (vcmd == 'q') < vspeed(255,255); > > >
// Вперед void vforward() < vspeed(vspdL,vspdR); vforwardRL(); >
// Вперед для RL void vforwardRL() < motor1.run(FORWARD); motor2.run(FORWARD); >
// Назад void vbackward() < vspeed(vspdL,vspdR); vbackwardRL(); >
// Назад для RL void vbackwardRL() < motor1.run(BACKWARD); motor2.run(BACKWARD); >
// Влево void vleft() < vspeed(vspdL,vspdR); motor1.run(BACKWARD); motor2.run(FORWARD); >
// Вправо void vright() < vspeed(vspdL,vspdR); motor1.run(FORWARD); motor2.run(BACKWARD); >
// Вперед и влево void vforwardleft() < if (vspdL > vspd) < vspeed(vspdL-vspd,vspdR); > else < vspeed(0,vspdR); > vforwardRL(); >
// Вперед и вправо void vforwardright() < if (vspdR > vspd) < vspeed(vspdL,vspdR-vspd); > else < vspeed(vspdL,0); > vforwardRL(); >
// Назад и влево void vbackwardleft() < if (vspdL > vspd) < vspeed(vspdL-vspd,vspdR); > else < vspeed(0,vspdR); > vbackwardRL(); >
// Назад и вправо void vbackwardright() < if (vspdR > vspd) < vspeed(vspdL,vspdR-vspd); > else < vspeed(vspdL,0); > vbackwardRL(); >
// Стоп void vrelease() < motor1.run(RELEASE); motor2.run(RELEASE); >
// Изменение скорости void vspeed(int spdL,int spdR) < if (spdL == spdR) < vspdL=spdL; vspdR=spdR; > motor1.setSpeed(spdL); motor2.setSpeed(spdR); >