Como fiz um snowblower 3.0 com controle Bluetooth a partir de um smartphone Android

Este é o menor tempo de transformação de um cortador de grama robótico em um soprador de neve DIY com controle Bluetooth a partir de um telefone Android.




Esta é a terceira versão do soprador de neve. A primeira opção que fiz de um robô de combate. A segunda opção é de um cortador de grama, que estou preparando para a competição . Um vídeo com uma breve apresentação desses “produtos” já estava no Geektimes, também no spoiler na parte inferior do post.

O design atual do robô é muito simples. A camada superior de neve é ​​removida por um raspador. A camada inferior é jogada de lado por baixo do soprador de neve. A unidade de potência é um motor de combustão interna de um cortador de grama manual com capacidade de 0,9 hp Motores de propulsão são motores de engrenagem dos limpadores VAZ. ICE gira o parafuso. O fluxo de ar e o impacto mecânico do parafuso elevam a neve da superfície e a lançam para o lado através do duto de ar. A saia em volta do soprador de neve impede que a neve se desfaça. A borracha parafusada melhora significativamente a permeabilidade da unidade.


Gerência


Controle Bluetooth a partir de um telefone Android. Arduino nano + Monster Motor Shield + Bluetooth HC-06 O

Bluetooth HC-06 funciona a 3,3V, ou seja, é necessário que a operação adequada faça a conversão dos níveis lógicos. Sem isso, o circuito funcionará, mas pode haver problemas.

Em relação ao Monster Motor Shield, há muitas questões controversas, alguém afirmou que uma grande porcentagem de casamento. Eu realmente gosto desta placa, porque ela possui corrente de até 30A.


Arduino


Para receber dados do Bluetooth HC-06, usei o Software Serial para deixar a possibilidade de depuração através do terminal através da porta serial do hardware. Isso, em particular, foi necessário para rastrear quais dados obtemos do Arduino. No esboço mais simples, verificamos o caractere recebido via Bluetooth e ligamos o driver do motor.
Código 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


No Google Play, um grande número de aplicativos prontos para controle remoto. De todos, gostei mais desta aplicação.


Interface A

lógica do aplicativo O
aplicativo envia todo segundo código da combinação atual de botões pressionados via bluetooth.
  • "S" - pare
  • "F" - vá em frente
  • "B" - de volta
  • "L" - para a esquerda
  • "R" - à direita
  • "I" - para frente e para a direita
  • "G" - frente e esquerda
  • "H" - traseira e direita
  • "J" - traseira e esquerda

O gerenciamento é possível pressionando as teclas e usando um giroscópio. A funcionalidade do aplicativo é bastante trivial, mas é o suficiente.

Vídeo




Vídeo Snow Blower 1.0 e 2.0
, . -. , , , ..



PS: O próximo projeto é um robô subaquático autônomo. Estou me preparando para o concurso X-Prize . :). Fazer a ligação . Resta economizar US $ 2000.

O prazo de inscrição é 30 de junho de 2016 (23:59 UTC / 16: 59 PM PST). A taxa de inscrição é de US $ 2.000,00.

Source: https://habr.com/ru/post/pt388581/


All Articles