Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона

в 10:44, , рубрики: android, arduino, bluetooth, Bluetooth Android, DIY, diy или сделай сам, Блог компании Битва робокосилок, радиоуправление, радиоуправляемые модели, снегоуборщик

Это кратчайшая история времени превращения робота-газонокосилки в DIY снегоуборщик с управлением по Bluetooth с Android телефона.

Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона - 1

Это уже третий вариант снегоуборщика. Первый вариант я сделал из боевого робота. Второй вариант из газонокосилки, которую я готовлю к конкурсу. Видео с краткой презентацией этих «изделий» уже было на Geektimes, так же в спойлере внизу поста.

Текущая конструкция робота очень простая. Верхний слой снега снимается скребком. Нижний слой выбрасывается из-под снегоуборщика вбок. Силовым агрегатом служит двигатель внутреннего сгорания от ручной газонокосилки мощностью 0.9 л.с. Ходовые двигатели — это мотор-редукторы от стеклоочистителей ВАЗ. ДВС крутит винт. Воздушный поток и механическое воздействие винта поднимает снег с поверхности и по воздуховоду отбрасывает в сторону. Юбка вокруг снегоуборщика не дает снегу разлетаться в стороны. Шурупованная резина существенно улучшает проходимость агрегата.
Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона - 2

Управление

Управлением по Bluetooth с Android телефона. Arduino nano+Monster Motor Shield+Bluetooth HC-06
Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона - 3
Bluetooth HC-06 работает на 3.3В, т.е. необходимо для правильной работы сделать преобразование логических уровней. Без этого схема будет работать, но могут быть проблемы.
Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона - 4
По поводу Monster Motor Shield много спорных вопросов, кто-то утверждал, что большой процент брака. Мне данная плата очень нравится, потому что она держит ток до 30А.

Arduino

Для получения данных от Bluetooth HC-06 я использовал Software Serial для того чтобы оставить возможность отладки через терминал по аппаратному Serial port. Это, в частности, понадобилось чтобы отслеживать какие данные мы получаем от Arduino. В простейшем скетче проверяем полученный символ по Bluetooth и включаем драйвер двигателей.

Код Arduino
#include <SoftwareSerial.h>
#define BRAKEVCC 0
#define CW   1
#define CCW  2
#define BRAKEGND 3
#define CS_THRESHOLD 100

int inApin[2] = {7, 4};  // INA: Clockwise input
int inBpin[2] = {8, 9}; // INB: Counter-clockwise input
int pwmpin[2] = {5, 6}; // PWM input

int statpin = 10;

SoftwareSerial mySerial(2, 3); // RX, TX
char a,b;

void setup()  
{
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


 pinMode(statpin, OUTPUT);

  // Initialize digital pins as outputs
  for (int i=0; i<2; i++)
  {
    pinMode(inApin[i], OUTPUT);
    pinMode(inBpin[i], OUTPUT);
    pinMode(pwmpin[i], OUTPUT);
  }
  // Initialize braked
  for (int i=0; i<2; i++)
  {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
  }

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
    digitalWrite(statpin, HIGH);
    
  if (mySerial.available()){
        a=mySerial.read();

    if(a=='F'){
  motorGo(0, CW, 1023);
  motorGo(1, CW, 1023);
    }
    if(a=='B'){
  motorGo(0, CCW, 1023);
  motorGo(1, CCW, 1023);
    }
    if(a=='L'){
  motorGo(0, CW, 1023);
  motorGo(1, CCW, 1023);
    }
    if(a=='R'){
  motorGo(0, CCW, 1023);
  motorGo(1, CW, 1023);
    }
     if(a=='I'){
  motorGo(0, CW, 500);
  motorGo(1, CW, 1023);
    }
    if(a=='G'){
  motorGo(0, CW, 1023);
  motorGo(1, CW, 500);
    }
    if(a=='H'){
  motorGo(0, CCW, 1023);
  motorGo(1, CCW, 500);
    }
    if(a=='J'){
  motorGo(0, CCW, 500);
  motorGo(1, CCW, 1023);
    }
       if(a=='S'){
  motorOff(1);
  motorOff(2);
    }

    Serial.write(a);
    }else{
      
    }
  
}


void motorOff(int motor)
{
  // Initialize braked
  for (int i=0; i<2; i++)
  {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
  }
  analogWrite(pwmpin[motor], 0);
}

void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
{
  if (motor <= 1)
  {
    if (direct <=4)
    {
      // Set inA[motor]
      if (direct <=1)
        digitalWrite(inApin[motor], HIGH);
      else
        digitalWrite(inApin[motor], LOW);

      // Set inB[motor]
      if ((direct==0)||(direct==2))
        digitalWrite(inBpin[motor], HIGH);
      else
        digitalWrite(inBpin[motor], LOW);

      analogWrite(pwmpin[motor], pwm);
    }
  }
}

Andoid

На Google Play огромное количество готовых приложений для удаленного управления. Из всех больше всего мне понравилось это приложение.
Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона - 5

Интерфейс
Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона - 6
Логика работы приложения
Приложение отправляет каждую секунду код текущей комбинации нажатых кнопок по bluetooth.

  • «S» — стоп
  • «F» — вперед
  • «B» — назад
  • «L» — влево
  • «R» — вправо
  • «I» — вперед и вправо
  • «G» — вперед и влево
  • «H» — назад и вправо
  • «J» — назад и влево

Управление возможно как с помощью нажатия клавиш, так и с помощью гироскопа. Функционал приложения достаточно тривиальный, но этого достаточно.

Видео

Видео Снегоуборщик 1.0 и 2.0
Время идет, а тренироваться в управлении роботами нужно. Я решил не терять времени до следующих боев Бронебот и до конкурса роботов-газонокосилок. К боевому роботу я прикрепил скребок, немного поработал над повышением трения колес, путем модификации протектора, поставил спец.сигнал.

P.S.: Следующим проектом является автономный подводный робот. Я готовлюсь к конкурсу X-Prize. :).Ссылка. Осталось накопить 2000$.
Как я сделал снегоуборщик 3.0 с управлением по Bluetooth с Android смартфона - 7

The registration deadline is 30 June, 2016 (11:59 PM UTC/4:59 PM PST). The registration fee is $2,000.00 USD.

Автор: Битва робокосилок

Источник

Поделиться новостью

* - обязательные к заполнению поля