[Urgent-BAC] Arduino et Bluetooth

Hello !

On a un projet pour le bac et on a un petit problème au niveau du programme Arduino ...
A l'aide d'une tablette on doit pouvoir faire se mouvoir une voiture RC et tout cela par bluetooth
Tout fonctionne sauf que l'on dirait qu'il y a des problèmes lors de l'envoi des commandes.

Par exemple lors de l'appui sur le bouton avancer, des fois la voiture avance jusqu'à que l'on relâche le bouton et des fois même quand l'on relâche les roues continuer d'avancer. Ensuite pour changer la direction lorsqu'on veut tourner les roues et que l'on appuie sur le bouton correspondant, il faut appuyer 5/6 fois avant que les roues tournent...

Voici notre programme et si vous avez des questions je peux mieux m'expliquer sur comment nous avons fait.

Merci beaucoup et bonne journée ! :slight_smile:

#include <Servo.h>;
String trame,text,valeurvit;
String trame1,text1;
int vitesse;
int vitessemot;
const int pinPwm = 5;
const int pinDir = 2;
Servo monservodir;
int pos=90; 

void setup(){
 Serial.begin(9600); 
 pinMode(pinPwm,OUTPUT);
 pinMode(pinDir,OUTPUT);
 monservodir.attach(3);
}

void traittrame(){
  if(trame.startsWith("o")){
    text = trame;
  }
  else {
    valeurvit = trame;
  }
}
void traittrame2(){
  if(trame1.startsWith("o")){
    text1 = trame1;
  }
  }

void loop(){
  moteuravar();
    servomoteurdir();
}
  
  

void moteuravar (){
  
  if (Serial.available()) {
    trame = String("");
    while (Serial.available()) {
      trame = trame + char(Serial.read());
      delay(1);
    }
    traittrame();
    
    vitesse = valeurvit.toInt();
    vitessemot = 35;
    
    if (text=="on1"){
      analogWrite (pinPwm,vitessemot);
      digitalWrite(pinDir, HIGH);
    }
    if (text=="off1"){
      digitalWrite (pinPwm,LOW);
    }
    if (text=="on2"){
      analogWrite (pinPwm,vitessemot);
      digitalWrite(pinDir, LOW);
    }
    if (text=="off2"){
      digitalWrite (pinPwm,LOW);
  }
 }
}

void servomoteurdir(){

 if (Serial.available()) {
    trame1 = String("");
    while (Serial.available()) {
      trame1 = trame1 + char(Serial.read());
      delay(1);
    }
    traittrame2();
    
 if(text1=="on4") 
    {
      pos+=10;
        monservodir.write(pos); 
    }
    if (text=="off4"){
      monservodir.write (pos=pos);
    
    if(text1=="on3") 
    {
      pos-=10;
        monservodir.write(pos); 
    }
    if (text=="off3"){
      monservodir.write (pos=pos);
 }
}

On a modifié le programme mais il nous reste un seul petit problème :

Tout tourne en même temps ...
Lorsque que l'on avance les roues tournes
Le 3em servomoteur est placé à l'arrière de la voiture et il y a une go pro placé dessus pour voir en temps réel la vue de la voiture. Lorsqu'on tourne le servomoteur de la gopro les roues tournent aussi et lorsqu'on avance le servomoteur de la gopro tourne encore...

Je reste présent pour répondre à vos questions pour le coté AppInventor de notre application ou pour des schémas de câblage.

Voici notre nouveau code :

#include <Servo.h>;
String trame,text,valeurvit;
int vitesse;
int vitessemot;
const int pinPwm = 5;
const int pinDir = 2;
Servo monservodir;
int pos=90;

void setup(){
 Serial.begin(9600); 
 pinMode(pinPwm,OUTPUT);
 pinMode(pinDir,OUTPUT);
 monservodir.attach(3);
}

void traittrame(){
  if(trame.startsWith("o")){
    text = trame;
  }
  else {
    valeurvit = trame;
  }
}
void traittrame2(){
  if(trame.startsWith("o")){
    text = trame;
  }
  }
  
void loop(){
  moteuravar();
  servomoteurdir();
   if (Serial.available()) {
    trame = String("");
    while (Serial.available()) {
      trame = trame + char(Serial.read());
      delay(1);
}
   }
}
  
  

void moteuravar (){
  
    traittrame();
    
    vitesse = valeurvit.toInt();
    vitessemot = 45;
    
    if (text=="on1"){
      analogWrite (pinPwm,vitessemot);
      digitalWrite(pinDir, HIGH);
    }
    if (text=="off1"){
      digitalWrite (pinPwm,LOW);
    }
    if (text=="on2"){
      analogWrite (pinPwm,vitessemot);
      digitalWrite(pinDir, LOW);
    }
    if (text=="off2"){
      digitalWrite (pinPwm,LOW);
  }
 }


void servomoteurdir(){
  
    traittrame2();
    
 if(text=="on4") 
    {
      pos+=10;
      delay(70);
        monservodir.write(pos);
    }
    
  if(text=="off4") 
    {
      monservodir.write(pos);
    }
    
    if(text=="on3") 
    {
      pos-=10;
      delay(70);
        monservodir.write(pos);
    }
    if(text=="off3") 
    {
      monservodir.write(pos);
    }
 }

Bonne journée et merci de nous lire :slight_smile:

EDIT : Je m'étais tromper de programme ....

Bonjour,

Dans ton code on ne voit pas de pilotage des moteurs, on ne voit que le pilotage du servo de la gopro.
Comment sont commandés les moteurs? Comment ce code peut piloter les moteurs?

Bonjour, voici comment est piloté le moteur pour avancer et reculer (nous avons un shield moteur) :

void moteuravar (){
  
    traittrame();
    
    vitesse = valeurvit.toInt();
    vitessemot = 45;
    
    if (text=="on1"){
      analogWrite (pinPwm, vitessemot);
      digitalWrite(pinDir, HIGH);
    }
    if (text=="off1"){
      digitalWrite (pinPwm, LOW);
    }
    if (text=="on2"){
      analogWrite (pinPwm, vitessemot);
      digitalWrite(pinDir, LOW);
    }
    if (text=="off2"){
      digitalWrite (pinPwm, LOW);
  }
 }

Pour te rendre compte de ce qui se passe, il faudrait que tu traces les messages reçus avec SoftwareSerial.
Dans traittrame et traittrame2 si tu reçois une vitesse, text reste avec la commande précédente. Il faudrait réinitialiser text.

void traittrame2() {
  if (trame.startsWith("o")) {
    text = trame;
  }
  else
  {
    text="";
  }
}