Robot comandat prin bluetooth cu Android

In micul meu tutorial de astazi va voi invata cum sa faceti un robot controlat prin bluetooth de pe un telefon cu Android. Robot cu Arduino controlat prin Android via bluetooth

Materiale

  • kitul Robotului care il gasiti la ROBOFUN
  • 4 Distantiere
  • 1 sasiu din policarbonat transparent sau orice alt material doriti
  • 2 Acumulatoare Li-po Kingmax
  • 4 suruburi
  • 4 piulite M3

Asamblare

Trebuie sa asamblati kitul robotului si taiati sasiul. Dimensiunile sunt l=11 si L=18(11X18).

Electronica

Infigeti L298 peste Arduino UNO ATENTIE!!!! cand veti alimenta robotul este necesar ca arduino sa fie alimentat de primul acumulator iar L298 sa fiealimentat din celalat acumulator Bluetooth Mate Se conecteaza la L298 astfel GND->GND(L298) VIN->5V TX->RX(L298) RX este marcat pe driver cu 0 RX->TX(L298) iar TX este marcat cu cifra 1 CTS-1->RTS-o(Ambele sunt de pe bluetooth mate) montati toata partea electronica pe sasiu. Urmeaza sa incarcati codul pe arduino:

Program1

Este pentru cei care vor sa il controleze din aplicatie: 

int MOTOR1_PIN1 = 3;
int MOTOR1_PIN2 = 5;
int MOTOR2_PIN1 = 6;
int MOTOR2_PIN2 = 9;
#define DEBUG true  
#define STX 0x02  // Necesar pentru soft
#define ETX 0x03  // Necesar pentru soft
int i=0;
byte cmd[5] = {0, 0, 0, 0,0}; // Aici se stocheaza valorle primite prin Bluetooth
int x,y, A,B;
void stopIfFault(); // Motor
void setup() {
  
  Serial.begin(9600); // adjust to your Bluetooth card
  Serial.println("Johny Five");
}
void loop() {
  if(Serial.available()) { // received from smartphone
    delay(5);
    cmd[0] = Serial.read();
    if(DEBUG) Serial.println(cmd[0]); // to serial monitor
    if(cmd[0] == STX) {
      i=1;
      while(Serial.available() && ((cmd[i]=Serial.read()) != ETX)) {
        if(i>4) break;
        if(DEBUG) {Serial.print(i); Serial.print(": "); Serial.println(cmd[i]);}
        i++;
      }
    }
// Cei 4 biti cititi sunt valori de voltaje, nu coordonate
    if (cmd[1]==0)
    x=cmd[2]-200;
    else if (cmd[1]==1)
     x=cmd[2]-72;
    else if (cmd[1]==2)
    x=cmd[2]+56;
  
    if (cmd[3]==0)
    y=cmd[4]-200;
    else if (cmd[3]==1)
    y=cmd[4]-72;
    else if (cmd[3]==2)
    y=cmd[4]+56;
// pana aici am calculat valorile X,Y ale coordantelor joystick-ului 
    Serial.print("X: "); Serial.println(x);
    Serial.print("Y: "); Serial.println(y);
  
    if (y>0)
    {
      if (x>0)
       {
        A=y;
        B=y-x;
       }
    else
      {
        A=x+y;
        B=y;
      }  
    }
  
    else
      {
        if (x>0)
          {
            A=y;
            B=x+y;
          }
        else
          {
            A=y-x;
            B=y;
          }
      }  
// cu un algoritm matematic propriu am calculat valorile A si B pe care le trimit motoarelor pentru a functiona cum planuisem 
    go (A*4, B*4);
  
    Serial.print("A: "); Serial.println(A);
    Serial.print("B: "); Serial.println(B);
  }
  delay(5);
}
void go(int speedLeft, int speedRight) {
  if (speedLeft > 0) {
    analogWrite(MOTOR1_PIN1, speedLeft);
    analogWrite(MOTOR1_PIN2, 0);
  } 
  else {
    analogWrite(MOTOR1_PIN1, 0);
    analogWrite(MOTOR1_PIN2, -speedLeft);
  }
  if (speedRight > 0) {
    analogWrite(MOTOR2_PIN1, speedRight);
    analogWrite(MOTOR2_PIN2, 0);
  } 
  else {
    analogWrite(MOTOR2_PIN1, 0);
    analogWrite(MOTOR2_PIN2, -speedRight);
  }
}

Program2

Este pentru cei care vor sa ii puna leduri robotului in fata si in spate (sau doar in fata) daca aveti de exemplu 4 leduri puteti modifica in cod sa fie pinii 10,11,12 si 13 (eu mi-am pus doar 10 si 11 deoarece am cate doua circuite care functioneaza ca 1 singur adica este legat unu de altu iar din al doilea ies doar 2 fire care aprind 2 circuite,la fel si in spate) cand robotul merge in fata se vor aprinde cele din fata,cand merge in spate se vor aprinde cele din spate:

int MOTOR1_PIN1 = 3;
int MOTOR1_PIN2 = 5;
int MOTOR2_PIN1 = 6;
int MOTOR2_PIN2 = 9;
#define DEBUG true
#define STX 0×02  // Necesar pentru soft
#define ETX 0×03  // Necesar pentru soft
int i=0;
byte cmd[5] = {0, 0, 0, 0,0}; // Aici se stocheaza valorle primite prin Bluetooth
int x,y, A,B;
void stopIfFault(); // Motor
void setup() {
    Serial.begin(9600); // adjust to your Bluetooth card
    Serial.println(“Johny Five”);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
}
void loop() {
    if(Serial.available()) { // received from smartphone
        delay(5);
        cmd[0] = Serial.read();
        if(DEBUG) Serial.println(cmd[0]); // to serial monitor
            if(cmd[0] == STX) {
                i=1;
                while(Serial.available() && ((cmd[i]=Serial.read()) != ETX)) {
                if(i>4) break;
                if(DEBUG) {Serial.print(i); Serial.print(“: “); Serial.println(cmd[i]);}
                i++;
            }
        }
        // Cei 4 biti cititi sunt valori de voltaje, nu coordonate
        if (cmd[1]==0)
            x=cmd[2]-200;
        else if (cmd[1]==1)
            x=cmd[2]-72;
        else if (cmd[1]==2)
            x=cmd[2]+56;
        if (cmd[3]==0)
            y=cmd[4]-200;
        else if (cmd[3]==1)
            y=cmd[4]-72;
        else if (cmd[3]==2)
            y=cmd[4]+56;
            
        // pana aici am calculat valorile X,Y ale coordantelor joystick-ului
        Serial.print(“X: “); Serial.println(x);
        Serial.print(“Y: “); Serial.println(y);
        if (y>0){
            if (x>0){
                A=y;
                B=y-x;
            }
            else{
                A=x+y;
                B=y;
            }
        }
        else{
            if (x>0){
                A=y;
                B=x+y;
            }
            else{
                A=y-x;
                B=y;
            }
        }
        // cu un algoritm matematic propriu am calculat valorile A si B pe care le trimit motoarelor pentru a functiona cum planuisem
        Serial.print(“A: “); Serial.println(A);
        Serial.print(“B: “); Serial.println(B);
        // AICI PORNIM MOTOARELE SI APRINDEM SI BECURILE
        if (A>0 && B>0){
            digitalWrite(11, LOW);
            digitalWrite(10, HIGH);
        }
        else if (A<0 && B<0){
            digitalWrite(10, LOW);
            digitalWrite(11, HIGH);
        }
        
        go (A*4, B*4);
    }
    delay(5);
}
void go(int speedLeft, int speedRight) {
    if (speedLeft > 0){
        analogWrite(MOTOR1_PIN1, speedLeft);
        analogWrite(MOTOR1_PIN2, 0);
    }
    else {
        analogWrite(MOTOR1_PIN1, 0);
        analogWrite(MOTOR1_PIN2, -speedLeft);
    }
    if (speedRight > 0) {
        analogWrite(MOTOR2_PIN1, speedRight);
        analogWrite(MOTOR2_PIN2, 0);
    }
    else {
        analogWrite(MOTOR2_PIN1, 0);
        analogWrite(MOTOR2_PIN2, -speedRight);
    }
}

Download aplicatie Android 

Aplicatia o gasiti in Google Play: https://play.google.com/store/apps/details?id=org.projectproto.btjoystick

comentarii

  • kaewthep

    please help me. sch 24v 10A

    2016-01-15 15:45:07

    Raspunde