[RÉSOLU] Envoie de commande de moteur d'un arduino UNO à un autre arduino UNO

Bonjour,

Je suis en train de faire un code pour controller deux moteur. Il y a une arduino qui s'occupe de la commande et l'autre s'occupe des sorties.J'ai encore de la misère à comprendre la communication entre 2 arduino, j'ai essayer de faire des recherches,j'ai pu améliorer mon code,mais il ne marche toujours pas comme je le veux.

Explication du code: J'ai 7 boutons sur un protoboard, il y a 3 boutons qui sert a choisir la vitesse à laquelle que le moteur tourne et j'ai 4 boutons pour controller dans quelle direction l'objet attacher au moteur va (gauche, droite, haut, bas). L'arduino de commande envoie une donnée dépendament de la vitesse choisi et de la direction. Tout marche bien apart une direction , le bas. Je suis presque sur que l'erreur vient de l'information que j'envoie à l'autre arduino , car en envoyant 12, l'autre arduino le considère comme un 1 en premier. Au début, je voulais envoyer a l'arduino de l'info comme HH pour haute vitesse vers le haut, mais ça ne marchais pas. J'ai donc remplacer cela par des chiffres. Je me dis l'erreur viens aussi du CHAR.

merci d'avance
Bonne journée :slight_smile:

commande:

int Fin = 0; //determine si la vitesse va etre haute ou basse
int vitesse =0 ; //vitesse a laquelle que le moteur va tourner ecrire une valeur dependamment du moteur
int Gros =0;
const int Pin_Gros =7;
const int Pin_Fin = 8; //pin du bouton fin
const int Pin_Tres_Fin = 9;
int Tres_Fin = 0;
const int BP_haut = 10;//les chiffres seulement sont des pins D
const int BP_bas = 4;//determine le nom des pins.
const int BP_droit = 5;
const int BP_gauche = 6;
int Etat_haut = 0;
int Etat_bas = 0;
int Etat_droit = 0; //variable qui determine si les entrees sont HIGH ou LOW
int Etat_gauche = 0;

void setup() 
{
  pinMode (Pin_Gros,INPUT);
  pinMode (Pin_Fin, INPUT);
  pinMode (Pin_Tres_Fin, INPUT);
  pinMode (BP_gauche, INPUT); //pour tester la rentrer et sorti de lactuateur a laide de bouton comme le projet
  pinMode (BP_droit, INPUT);
  pinMode (BP_haut, INPUT);
  pinMode (BP_bas, INPUT);
 Serial.begin(9600);

}

void loop() {
  
  //Premierement le code détermine à quelle vitesse le moteur va tourner et la garde en mémoire
  
  Gros = digitalRead (Pin_Gros);
  Fin = digitalRead (Pin_Fin); //dependament de l'état du bouton les variable de vitesse vont changer
  Tres_Fin = digitalRead (Pin_Tres_Fin);
  if (Fin ==HIGH){
    vitesse = 122;
  }
  else if (Tres_Fin ==HIGH){ //determine a quelle vitesse le moteur va tourner dependament du bouton presser
    vitesse = 60;
  }
  else if(Gros == HIGH){
    vitesse=255;
  }


  
  Etat_haut = digitalRead (BP_haut);
  Etat_bas = digitalRead (BP_bas); //lis l`État des pins et tansfere la donner a la variable
  Etat_droit = digitalRead (BP_droit);
  Etat_gauche = digitalRead (BP_gauche);
  
  
  
  if (Etat_droit == HIGH && vitesse == 255){
    Serial.print('1');//envoie droit_gros a lautre arduino
    
  }
  else if (Etat_droit == HIGH && vitesse == 60){
    Serial.print('2');//envoie droit_tresfin a lautre arduino
    
  }
  else if (Etat_droit == HIGH && vitesse == 122){
    Serial.print('3');//envoie droit_fin a lautre arduino
  }
  
  
  else if (Etat_haut == HIGH && vitesse == 255) {
    Serial.print('4');//envoie haut gros a larduino
  }
  else if (Etat_haut == HIGH && vitesse == 60) {
    Serial.print('5');//envoie haut tresfin a larduino
  }
  else if (Etat_haut == HIGH && vitesse == 122) {
    Serial.print('6');//envoie haut gros a larduino
  }

  
  
   else if (Etat_bas == HIGH && vitesse == 255) {
    Serial.print('7');//envoie bas gros a larduino
  }
  else if (Etat_bas == HIGH && vitesse == 60) {
    Serial.print('8');//envoie bas tresfin a larduino
  }
  else if (Etat_bas == HIGH && vitesse == 122) {
    Serial.print('9');//envoie bas fin a larduino
  }



  
   else if (Etat_gauche == HIGH && vitesse == 255) {
    Serial.print("10");//envoie gauche gros a larduino
  }
  else if (Etat_gauche == HIGH && vitesse == 60) {
    Serial.print("11");//envoie gauche tresfin a larduino
  }
  else if (Etat_gauche == HIGH && vitesse == 122) {
    Serial.print("12");//envoie gauche fin a larduino
  }
  else{
    Serial.print('0');
  }

}

Puissance/sorties

int G = 255;
int TF = 60; //vitesse du moteur Dépendament de celle-demander
int F = 122;
const int PWMD= 3;
const int PWMG = 11; //foward and reverse pour le moteur de l'actuateur
const int PWMH = 9;
const int PWMB = 10;
char BitArrive = 0;

void setup() 
{
  pinMode (PWMG, OUTPUT);
  pinMode (PWMD, OUTPUT);
  pinMode (PWMH, OUTPUT);
  pinMode (PWMB, OUTPUT);

 Serial.begin(9600);

}

void loop() {

  if (Serial.available() > 0) {
  BitArrive = Serial.read();
  }
  Serial.println(BitArrive);
  
if (BitArrive == '1'){
    analogWrite(PWMD , G );
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    digitalWrite(PWMB , LOW);
    }
else if (BitArrive == '3'){
    analogWrite(PWMD , F );
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    digitalWrite(PWMB , LOW);
    }
else if (BitArrive == '2'){
    analogWrite(PWMD , TF );
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    digitalWrite(PWMB , LOW);
    }


  else if (BitArrive == '4'){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    analogWrite(PWMH , G);
    digitalWrite(PWMB , LOW);
    }
  else if (BitArrive == '6'){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    analogWrite(PWMH , F);
    digitalWrite(PWMB , LOW);
    }
    
 else if (BitArrive == '5'){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    analogWrite(PWMH , TF);
    digitalWrite(PWMB , LOW);
    }



  else if (BitArrive == '7'){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , G);
    }
  else if (BitArrive == '9'){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , F);
    }
    else if (BitArrive == '8'){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , TF);
    }




    else if (BitArrive == "10"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , G);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , LOW);
    }
  else if (BitArrive == "12"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , F);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , LOW);
    }
    else if (BitArrive == "11"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , TF);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , LOW);
    }
    
  
  else{
     digitalWrite(PWMD , LOW);// si aucun bouton n'est peser, le systeme reste en place.
     digitalWrite(PWMG , LOW);
     digitalWrite(PWMH , LOW);
     digitalWrite(PWMB , LOW);
  }

}
    else if (BitArrive == "10"){
  else if (BitArrive == "12"){

Un char ne peut être égal à "10" ou "12" puisque ces chaînes en comportent 2.

Il faut soit envoyer un seul caractère ou être à même d'en recevoir plusieurs dans une chaîne.

Je m'en doutais du qu'il envoie un byte à la fois. Je ne comprends pas la fin de votre phrase :"ou être à même d'en recevoir plusieurs dans une chaîne."

Est-ce que vous vouliez dire que l'arduino prenne plus qu'un char a la fois comme une chaîne de caractère?

Par exemple avec l'aide de Serial.readBytesUntil()

Il est évident que si le récepteur doit être capable de recevoir 1 ou 2 caractères ce n'est pas la même problématique que s'il doit en recevoir systématiquement un seul.
Il faut un caractère terminateur. Ce caractère indique au récepteur : fin de transmission.

On peut utiliser classiquement le caractère NEWLINE '\n'.

Serial.print("12\n");//envoie gauche fin a larduino

Ensuite la méthode readBytesUntil() sera appelée comme ceci :

char buffer[2];
Serial.readBytesUntil('\n', buffer, 2);

Ensuite on ne compare pas une chaîne à une autre avec l'opérateur ==.
On utilise strcmp().

J'ai fait des recherches en ligne des 2 fonctions dont tu m'as parlé. J'ai donc modifier mon code en conséquent , comme je crois qu'il le fallait. Ça marche encore moins qu'avant. Ma fonction Serial.print ne m'affiche rien, apart le \n. (J'ai juste fait 2 strcmp pour voir si je comprennais la fonction)et elle n'a pas l'air de marcher. Je débute la programmation, j'ai donc encore de la misère à saisir les concept ou certaines fonctions.

commande

int Fin = 0; //determine si la vitesse va etre haute ou basse
int vitesse =0 ; //vitesse a laquelle que le moteur va tourner ecrire une valeur dependamment du moteur
int Gros =0;
const int Pin_Gros =7;
const int Pin_Fin = 8; //pin du bouton fin
const int Pin_Tres_Fin = 9;
int Tres_Fin = 0;
const int BP_haut = 10;//les chiffres seulement sont des pins D
const int BP_bas = 4;//determine le nom des pins.
const int BP_droit = 5;
const int BP_gauche = 6;
int Etat_haut = 0;
int Etat_bas = 0;
int Etat_droit = 0; //variable qui determine si les entrees sont HIGH ou LOW
int Etat_gauche = 0;

void setup() 
{
  pinMode (Pin_Gros,INPUT);
  pinMode (Pin_Fin, INPUT);
  pinMode (Pin_Tres_Fin, INPUT);
  pinMode (BP_gauche, INPUT); //pour tester la rentrer et sorti de lactuateur a laide de bouton comme le projet
  pinMode (BP_droit, INPUT);
  pinMode (BP_haut, INPUT);
  pinMode (BP_bas, INPUT);
 Serial.begin(9600);

}

void loop() {
  
  //Premierement le code détermine à quelle vitesse le moteur va tourner et la garde en mémoire
  
  Gros = digitalRead (Pin_Gros);
  Fin = digitalRead (Pin_Fin); //dependament de l'état du bouton les variable de vitesse vont changer
  Tres_Fin = digitalRead (Pin_Tres_Fin);
  if (Fin ==HIGH){
    vitesse = 122;
  }
  else if (Tres_Fin ==HIGH){ //determine a quelle vitesse le moteur va tourner dependament du bouton presser
    vitesse = 60;
  }
  else if(Gros == HIGH){
    vitesse=255;
  }


  
  Etat_haut = digitalRead (BP_haut);
  Etat_bas = digitalRead (BP_bas); //lis l`État des pins et tansfere la donner a la variable
  Etat_droit = digitalRead (BP_droit);
  Etat_gauche = digitalRead (BP_gauche);
  
  
  
  if (Etat_droit == HIGH && vitesse == 255){
    Serial.print("01\n");//envoie droit_gros a lautre arduino
    
  }
  else if (Etat_droit == HIGH && vitesse == 60){
    Serial.print("02\n");//envoie droit_tresfin a lautre arduino
    
  }
  else if (Etat_droit == HIGH && vitesse == 122){
    Serial.print("03\n");//envoie droit_fin a lautre arduino
  }
  
  
  else if (Etat_haut == HIGH && vitesse == 255) {
    Serial.print("04\n");//envoie haut gros a larduino
  }
  else if (Etat_haut == HIGH && vitesse == 60) {
    Serial.print("05\n");//envoie haut tresfin a larduino
  }
  else if (Etat_haut == HIGH && vitesse == 122) {
    Serial.print("06\n");//envoie haut gros a larduino
  }

  
  
   else if (Etat_bas == HIGH && vitesse == 255) {
    Serial.print("07\n");//envoie bas gros a larduino
  }
  else if (Etat_bas == HIGH && vitesse == 60) {
    Serial.print("08\n");//envoie bas tresfin a larduino
  }
  else if (Etat_bas == HIGH && vitesse == 122) {
    Serial.print("09\n");//envoie bas fin a larduino
  }



  
   else if (Etat_gauche == HIGH && vitesse == 255) {
    Serial.print("10\n");//envoie gauche gros a larduino
  }
  else if (Etat_gauche == HIGH && vitesse == 60) {
    Serial.print("11\n");//envoie gauche tresfin a larduino
  }
  else if (Etat_gauche == HIGH && vitesse == 122) {
    Serial.print("12\n");//envoie gauche fin a larduino
  }
  else{
    Serial.print("0\n");
  }

}

puissance:

int G = 255;
int TF = 60; //vitesse du moteur Dépendament de celle-demander
int F = 122;
const int PWMD= 3;
const int PWMG = 11; //foward and reverse pour le moteur de l'actuateur
const int PWMH = 9;
const int PWMB = 10;
char BitArrive=0;

void setup() 
{
  pinMode (PWMG, OUTPUT);
  pinMode (PWMD, OUTPUT);
  pinMode (PWMH, OUTPUT);
  pinMode (PWMB, OUTPUT);

 Serial.begin(9600);

}

void loop() {

  if (Serial.available() > 0) {
    char BitArrive[2];
  Serial.readBytesUntil('\n',BitArrive,2);
  }
  Serial.println(BitArrive);
  
if (strcmp(BitArrive,"01")==0){
    analogWrite(PWMD , G );
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    digitalWrite(PWMB , LOW);
    }
else if (strcmp(BitArrive,"01")==0){
    analogWrite(PWMD , F );
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    digitalWrite(PWMB , LOW);
    }
else if (BitArrive == "02"){
    analogWrite(PWMD , TF );
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    digitalWrite(PWMB , LOW);
    }


  else if (BitArrive == "04"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    analogWrite(PWMH , G);
    digitalWrite(PWMB , LOW);
    }
  else if (BitArrive == "06"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    analogWrite(PWMH , F);
    digitalWrite(PWMB , LOW);
    }
    
 else if (BitArrive == "05"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    analogWrite(PWMH , TF);
    digitalWrite(PWMB , LOW);
    }



  else if (BitArrive == "07"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , G);
    }
  else if (BitArrive == "09"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , F);
    }
    else if (BitArrive == "8"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , LOW);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , TF);
    }




    else if (BitArrive == "10"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , G);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , LOW);
    }
  else if (BitArrive == "12"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , F);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , LOW);
    }
    else if (BitArrive == "11"){
    digitalWrite(PWMD , LOW);
    digitalWrite(PWMG , TF);
    digitalWrite(PWMH , LOW);
    analogWrite(PWMB , LOW);
    }
    
  
  else{
     digitalWrite(PWMD , LOW);// si aucun bouton n'est peser, le systeme reste en place.
     digitalWrite(PWMG , LOW);
     digitalWrite(PWMH , LOW);
     digitalWrite(PWMB , LOW);
  }

}
else if (strcmp(BitArrive,"01")==0){
    else if (BitArrive == "10"){

Il y a des oublis.

J'ai trouvé une façon dont ça marche ,la façon ne marchais pas avant à cause j'avais mis des " " à la place de ' '

Merci de l'aide apporté et bonne journée! :slight_smile: