8 (800) 350-30-16

Манипулятор. Управление по bluetooth

Дата: / Категория: Механика / Автор: DOC_tr

В прошлой статье мы научились передавать данные с Arduino посредством Bluetooth модуля HC-05 на мобильное устройство, ну или любое устройство у которого есть bluetooth и Android.

В этой статье я расскажу вам о том как я научил манипулятор реагировать на команды, и просто сидел в нескольких метрах от него и игрался с ним с помощью своего телефона.

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

Сел я за компьютер в 2 часа дня, когда отвлекся было уже 10 часов вечера, а результата все не было. У меня уже было готовое приложение, но он ломалось как только я пытался отправить любые данные на Arduino. Но в 10 часов мне на глаза попалась очень интересная ссылка из Google Play - Arduino Bluetooth Controller

Сказать что я был зол - не сказать ничего. 8 часов попыток разобраться и все впустую. А тут готовое приложение для этих целей!

Ладно, успокоившись я начал разбираться в нем.

Интерфейс подключения bluetooth устройства не отличается от того, который я описывал в прошлой статье, а главный экран программы выглядит следующим образом.

 Есть несколько вариантов управления. Так как нам нужно 8 кнопок для управления манипулятором я выбрал Controller Mode.

Выглядит он вот так. Единственный косяк - это то, что кнопки справа нельзя зажимать и держать. Они срабатывают только один раз при нажатии, и если их держать, данные отправлять они больше не будут.

Так что если нажать и держать стрелочки, то манипулятор будет двигаться до тех пор, пока вы их не отпустите. А кнопку нужно будет нажимать очень много раз.

Повесим на них клешню (у нее не так много возможных положений) и двигатель, который поворачивает платформу вокруг оси.

При нажатии на кнопку по середине экрана появляются данные, которые она передает на сервер.

В меню выбираем "Set Commands"

 

И попадаем в следующее меню, где можно задать данные, которые будут отправляться на Arduino при нажатии на определенную кнопку.

Я задал всем от 1 до 8 чтобы не особо заморачиваться. 

Все, пульт управления готов. Теперь перейдем к скетчу.

Для простоты я добавил в наш класс, которым мы расширили класс Servo, метода up() и down(), которые поворачивают двигатель вперед или назад на угол speed.

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

Собственно сам скетч. 

#include <Servo.h>

class Servo_extend : public Servo {
public:
void up(){
if(this->angle >= 180){
this->angle = 180;
} else {
this->angle += this->speed;
}
this->write(this->angle);
}
void down(){
if(this->angle <= 0){
this->angle = 0;
} else {
this->angle -= this->speed;
}
this->write(this->angle);
}
void rotate(int angle){
// если скорость минимальная, то метод rotate
// дублирует метод write
if(this->speed <= 1){
this->angle = angle;
this->write(angle);
return;
}
if(angle > this->angle){
for(this->angle; this->angle <= angle; this->angle ++){
this->write(this->angle);
delay(this->speed);
}
} else {
for(this->angle; this->angle >= angle; this->angle --){
this->write(this->angle);
delay(this->speed);
}
}
}
// устанавливаем угол
void setAngle(int angle){
this->angle = angle;
this->write(angle);
}
// Устанавливаем скорость
// чем меньше число тем выше скорость
void setSpeed(int speed){
this->speed = speed;
}
private:
int angle = 0, speed = 1;
};

Servo_extend servo0;
Servo_extend servo1;
Servo_extend servo2;
Servo_extend servo3;

void setup(){
// Привязка моторчиков к пинам
servo0.attach(7); //левый (20-60)
servo3.attach(6); //правый (180-100)
servo1.attach(5); //клешня
servo2.attach(4); //клешня

// Задаем стартовый угол для всех двигателей
// Если стартовый угол 0, можно не устанавливать
servo0.setAngle(30);
servo1.setAngle(90);
servo3.setAngle(60);

// Скорость для всех двигателей
servo0.setSpeed(10);
servo2.setSpeed(50);
servo1.setSpeed(20);
servo3.setSpeed(10);
Serial.begin(9600); // start serial communication at 9600bps
// клешня должна двигаться быстро.
// Можно просто у клешни все методы rotate
// заменить на write
}

char incomingByte;
void loop(){
// считываем пришедшие данные
if( Serial.available() > 0 ){
incomingByte = Serial.read();

Serial.println(incomingByte);
switch(incomingByte){
case '1':
servo0.up();
break;
case '2':
servo0.down();
break;
case '4':
servo3.up();
break;
case '3':
servo3.down();
break;
case '5':
servo1.up();
break;
case '6':
servo1.down();
break;
case '7':
servo2.up();
break;
case '8':
servo2.down();
break;
}
}
}

 В функции void вы можете видеть как в зависимости от цифры, пришедшей с джойстика, мы управляем тем или иным двигателем.

Теперь расскажу немного о подключении. По нормальному, для такого количества двигателей, нам нужен дополнительный источник питания. Но у меня его не было, и поэтому пришлось запитывать Bluetooth от одной Arduino, сервоприводы от другой.

В процессе всего этого у меня сгорела одна из них. В общем не пытайтесь повторить это дома без дополнительного питания для двигателей.

В связи с этим, а также с тем, что кнопки на джойстике достаточно маленькие, и у меня не всегда получалось попасть в них (плюс ко всему я не до конца запомнил их назначение), движения манипулятора получились не слишком плавные, но суть эксперименты данное видео передаст в полном объеме. 

Теги: #Манипулятор, #Bluetooth, #HC-05, # Mega Sensor Shield

Ваша оценка:

Рейтинг: 10.0 (Оценок: 2)

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены