Arduino - Bluetooth ile Android üzerinden robot kontrolü

Android üzerinden bluetooth ile robot kontrolü İzmir Hackerspace'de yaptığımız bir projeye. Tank görünümünde bir aracımız var. Adı Çiğdem.

Çiğdem'in üzerinde bulunan 2 adet motoru L293 ile kontrol ediyoruz. L293ün kontrollünü ise daha önce tanıtımını yaptığım Arduino Pro Mini ile sağlıyoruz. Arduino kontrol bilgilerini HC-06 bluetooth üzerinden android telefon veya tabletten alıyor. Android üzerinde kullandığımız programın adı Arduino RC car. Devre şemasına buradan olaşabilirsiniz.

Arduino kodları aşağıdaki gibi. En sonda da Çiğdem'in videosu.

 


const int FULL = 255;
const int HALF = 128;
const int MIN  = 50;
const int MTP  = 5;

int M1_A = 3;
int M1_B = 5;
int M1_en = 10;

int M2_A = 6;
int M2_B = 9;
int M2_en = 11;
char  inchar;
char oldchar;
int presscnt = 0;


// the setup routine runs once when you press reset:
void setup() {      
  Serial.begin(9600);  
  // initialize the digital pin as an output.
  pinMode(M1_A, OUTPUT); 
  pinMode(M1_B, OUTPUT);
  pinMode(M1_en, OUTPUT);
  pinMode(M2_A, OUTPUT);
  pinMode(M2_B, OUTPUT);
  pinMode(M2_en, OUTPUT);
  M1_STP(1);  
}

// the loop routine runs over and over again forever:
void loop() {
  
  if (Serial.available()) {
    inchar = Serial.read();
    Serial.write(inchar);
    if(inchar != oldchar){
      oldchar = inchar;
      presscnt = MIN/MTP;
    }
    else{
      if(((presscnt+1) * MTP < FULL)) presscnt++;
    }
    switch(inchar){
      case 'F':
        M1_FWD(presscnt * MTP);
        M2_FWD(presscnt * MTP);
        break;
      case 'B':
        M1_RWD(presscnt * MTP);
        M2_RWD(presscnt * MTP);
        break;
      case 'S':
        M1_STP(1);
        M2_STP(1);
        break;
      case 'R':
        M1_FWD(presscnt * MTP);
        M2_RWD(presscnt * MTP);
        break;
      case 'L':
        M1_RWD(presscnt * MTP);
        M2_FWD(presscnt * MTP);
        break;
    }
  }
}

void M1_FWD(int spd){
  if(spd <20) spd = 20;
  digitalWrite(M1_A, LOW);
  analogWrite(M1_B, spd);
  digitalWrite(M1_en, LOW);
}

void M1_RWD(int spd){
  if(spd <20) spd = 20;  
  digitalWrite(M1_B, LOW);
  analogWrite(M1_A, spd);
  digitalWrite(M1_en, LOW);
}

void M1_STP(int reflex){
  if (reflex==0){
    digitalWrite(M1_en, HIGH);
  }
  else{
    digitalWrite(M1_A, LOW);
    digitalWrite(M1_B, LOW);
    digitalWrite(M1_en, HIGH);
  }    
}

void M2_FWD(int spd){
  if(spd <20) spd = 20;
  digitalWrite(M2_A, LOW);
  analogWrite(M2_B, spd);
  digitalWrite(M2_en, LOW);
}

void M2_RWD(int spd){
  if(spd <20) spd = 20;  
  digitalWrite(M2_B, LOW);
  analogWrite(M2_A, spd);
  digitalWrite(M2_en, LOW);
}

void M2_STP(int reflex){
  if (reflex==0){
    digitalWrite(M2_en, HIGH);
  }
  else{
    digitalWrite(M2_A, LOW);
    digitalWrite(M2_B, LOW);
    digitalWrite(M2_en, HIGH);
  }    
}