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




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

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


Управление


Управлением по Bluetooth с Android телефона. Arduino nano+Monster Motor Shield+Bluetooth HC-06

Bluetooth HC-06 работает на 3.3В, т.е. необходимо для правильной работы сделать преобразование логических уровней. Без этого схема будет работать, но могут быть проблемы.

По поводу 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 огромное количество готовых приложений для удаленного управления. Из всех больше всего мне понравилось это приложение.


Интерфейс

Логика работы приложения
Приложение отправляет каждую секунду код текущей комбинации нажатых кнопок по bluetooth.
  • «S» — стоп
  • «F» — вперед
  • «B» — назад
  • «L» — влево
  • «R» — вправо
  • «I» — вперед и вправо
  • «G» — вперед и влево
  • «H» — назад и вправо
  • «J» — назад и влево

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

Видео




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



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

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

Комментарии (15)


  1. NikitosZs
    29.12.2015 14:58

    Из всех больше всего мне понравилось это приложение.

    А в интервью
    Я написал программу для своего смартфона

    Но всё это не важно! Как эта кроха, пусть и не одна, а несколько штук, смогут убирать снег на целой улице?! Куда убирать? Нужно же не просто его сдвигать, а именно убирать, вывозить.
    Но мне нравится, это забавно всё, роботы, автоматизация.


    1. webzuweb
      29.12.2015 15:02

      Программу я и правда написал, но на SL4A. Я про SL4A сделаю отдельный пост. Как готовое решение, которое легче повторить я предлагаю этот вариант.

      Вы же понимаете, что это тестовый образец, работы еще очень много. Вопрос про улицы, вообще преждевременный. Нормативно-правовая база с автономными сервисными роботами и роботизированными автомобилями нуждается в создании, тестировании и доработке.

      Что касается уборки снега, к примеру, на парковках. Сейчас ведь самоходными снегоуборщиками отбрасывают снег в сторону и никого это не смущает.

      В этом больше веселья, пока…


  1. IronHead
    29.12.2015 15:39
    +9

    Больше всего в таких статьях меня поражает раздутость информации в СМИ.
    Автор по сути прикрутил ардуину к самоходной тележке, а репортеры подают это как: Русский левша переплюнул DARPA и создал в своем гараже робота снегоуборщика.


    1. DMGarikk
      29.12.2015 16:05

      Чтото напомнило про «незначимость» самоходной тележки

      www.parovoz.com/newgallery/pg_view.php?ID=238614&LNG=RU#picture

      хоть кто бы вспомнил былые успехи наших самодельщиков


    1. webzuweb
      29.12.2015 16:06

      ++
      :) Это точно.


  1. r00tGER
    29.12.2015 16:00

    На плате «JY-MCU BT_Board», уже есть резисторы. Отдельно нужны, когда используется «голый» модуль HC-0* в 5-ти вольтовых схемах.


    1. webzuweb
      29.12.2015 16:08



      Это правда, но при этом на задней стороне явно указано напряжение порта.


      1. r00tGER
        29.12.2015 16:40

        Надписям на «китайских» модулях лучше не доверять, всегда стоит проверить :)


  1. diller61
    29.12.2015 17:26

    задам глупый наверное вопрос насчет второго фото: а почему на одном колесе саморезы шляпками наружу, а на другом шляпками внутрь? тут есть некий сакральный смысл?


  1. webzuweb
    29.12.2015 17:55

    На обоих колесах есть саморезы в обоих направлениях. Просто в какой-то омомент я подумал что увеличение пятна контакта от снятия камеры будет только на пользу.


    1. diller61
      29.12.2015 20:40

      Ясно, я так и думал что неспроста


  1. s5656
    30.12.2015 12:37

    Автор молодец бесспорно, но блин, новости? Серьезно?
    Давайте каждую поделку на ардуине (а уж если там все «по-взрослому»), которую собирают от мал до велика, по новостям показывать…


    1. diller61
      30.12.2015 12:46

      там вроде местные новости, на наших местных новостях события и меньше освещаются


      1. s5656
        30.12.2015 12:56

        Ну, в московских новостях-то показывать нечего, да…


    1. lubezniy
      30.12.2015 15:52
      +1

      А какого уровня поделка должна быть, чтобы её можно было в новостях показывать? Если брать маленький городок, то в нём в принципе не так много выходит поделок, чтобы ими даже одну местную новостную программу забить. По хорошему счёту выпуск таких материалов в свет может подстегнуть заняться подобными делами кого-то ещё, и именно этим он как раз полезен. А что на чём сделано — это детали.