Go Down

Topic: consigli su macchina bluetooth (Read 362 times) previous topic - next topic

skitarrata

ciao ragazzi da poco ho montato e programmato la mia macchina bluetooth e come già sospettavo ho riscontrato problemi nella programmazione, in pratica quando mando i comandi da cellulare arduino li riceve entrando nello switch ma poi quando lascio il comando la macchina continua a fare ciò che stava facendo fin quando non cambio tasto o meglio stato dello switch, volevo qualche consiglio se mettere uno stato di stop e finirla lì oppure cercare un modo (che vorrei trovare piuttosto di arronzarlo mettendo un nuovo case per lo stop) per farla fermare quando non si da più nessun comando, inoltre ho messo anche un controllo di prossimità con un sensore, ma non so se non mi calcola la distanza oppure non entra nell'if cosa quest'ultima penso sia più probabile, gradirei molto i vostri aiuti o consigli :)

il codice è questo:
Code: [Select]

#define echoPin 8 // Pin che riceve la pulsazione echo
#define trigPin 9

const int ms = 6; //pin A motore SX ponteH
const int ms2= 7; //pin B motore SX ponteH
const int md = 4; //pin A motore DX ponteH
const int md2= 5; //pin B motore DX ponteH

char state;
int distance;
int vSpeed=200;   

void setup() {
    Serial.begin(38400); 
  pinMode(ms, OUTPUT);
  pinMode(ms2, OUTPUT);
  pinMode(md, OUTPUT);
  pinMode(md2, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}
 
void loop() {

  //prendo lo stato dal seriale
    if(Serial.available() > 0){   
        state = Serial.read();
        Serial.write(state);
    }
    switch(state){
      //avanti
      case 'B': distanza(distance);
                avanti();
                break;
      //destra         
      case 'C': distanza(distance);
                destra();
                break;
      //sinistra
      case 'A': distanza(distance);
                sinistra();
                break;
      //indietro
      case 'D': indietro();
                break;
      //stop
      default: Stop();     
      }
      if((distance<=6)&&(distance!=0)){
          Stop();
          indietro();
          delay(3000);
          }
}
void avanti (){
      digitalWrite(ms,LOW);
      digitalWrite(ms2, vSpeed);
      digitalWrite(md,LOW);     
      digitalWrite(md2, vSpeed);
  }
void destra (){
      digitalWrite (ms,vSpeed);
      digitalWrite (ms2,LOW);
      digitalWrite (md,LOW);
      digitalWrite (md2,vSpeed);
  }
void sinistra(){
      digitalWrite (ms,LOW);
      digitalWrite (ms2,vSpeed);
      digitalWrite (md,vSpeed);
      digitalWrite (md2,LOW);
  }
void indietro (){
      digitalWrite(ms,vSpeed);
      digitalWrite(ms2,LOW);
      digitalWrite(md,vSpeed);     
      digitalWrite(md2,LOW);
  }
void Stop() {
      digitalWrite (ms,LOW);
      digitalWrite (ms2,LOW);
      digitalWrite (md,LOW);
      digitalWrite (md2,LOW);
}

void distanza(int &distance){
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        distance = pulseIn(echoPin, HIGH); 
        distance= distance/58;   
      }

skitarrata

ah ho dimenticato i componenti che uso, non so se vi possono aiutare a capire meglio, il modulo bluetooth e' un hc-05, due motori DC pilotati da un L293B, arduino e un sensore di distanza

-zef-

alla fine di switch dovrebbe bastare scrivere state = 0

skitarrata

Quindi potrei anche evitare di mettere il default, ok domani proverò, mentre per il sensore secondo voi l'if va bene come sta ?

skitarrata

Ah no ho detto una stupidaggine serve e come hahaha pensandoci alla fine mi sono reso conto, in realtà mi chiedo come ho fatto a non pensarci prima ad azzerare lo stato hahahah di sicuro funzionerà mi manca solo il sensore

skitarrata

comunque ho provato a mettere lo stato a 0 ma si sente solo un ticchettio nei motori :(

skitarrata

ok il problema l'ho risolto mettendo dei delay all'interno dei casi e settando lo stato a 0 ogni volta fuori ciclo ;)

cosi :
Code: [Select]

#define echoPin 8 // Pin che riceve la pulsazione echo
#define trigPin 9

const int ms = 6; //pin A motore SX ponteH
const int ms2= 7; //pin B motore SX ponteH
const int md = 4; //pin A motore DX ponteH
const int md2= 5; //pin B motore DX ponteH

char state;
int distance;
int vSpeed=10;   

void setup() {
    Serial.begin(38400); 
  pinMode(ms, OUTPUT);
  pinMode(ms2, OUTPUT);
  pinMode(md, OUTPUT);
  pinMode(md2, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}
 
void loop() {

  //prendo lo stato dal seriale
    if(Serial.available() > 0){   
        state = Serial.read();
        Serial.write(state);
    }
    switch(state){
      //avanti
      case 'B': distanza(distance);
                avanti();
                delay(100);
                break;
      //destra         
      case 'C': distanza(distance);
                destra();
                delay(100);
                break;
      //sinistra
      case 'A': distanza(distance);
                sinistra();
                delay(100);
                break;
      //indietro
      case 'D': indietro();
                delay(100);
                break;
      //stop
      default: Stop();     
      }
      state=0;
      if((distance<=6)&&(distance!=0)){
          Stop();
          indietro();
          delay(3000);
          }
}
void avanti (){
      digitalWrite(ms,LOW);
      digitalWrite(ms2, vSpeed);
      digitalWrite(md,LOW);     
      digitalWrite(md2, vSpeed);
  }
void destra (){
      digitalWrite (ms,vSpeed);
      digitalWrite (ms2,LOW);
      digitalWrite (md,LOW);
      digitalWrite (md2,vSpeed);
  }
void sinistra(){
      digitalWrite (ms,LOW);
      digitalWrite (ms2,vSpeed);
      digitalWrite (md,vSpeed);
      digitalWrite (md2,LOW);
  }
void indietro (){
      digitalWrite(ms,vSpeed);
      digitalWrite(ms2,LOW);
      digitalWrite(md,vSpeed);     
      digitalWrite(md2,LOW);
  }
void Stop() {
      digitalWrite (ms,LOW);
      digitalWrite (ms2,LOW);
      digitalWrite (md,LOW);
      digitalWrite (md2,LOW);
}

void distanza(int &distance){
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        distance = pulseIn(echoPin, HIGH); 
        distance= distance/58;   
      }

Go Up