[FRENCH] Programme étapes par étapes

Bonjour à tous,

Voilà, je fais un programme de déplacement d'un robot à l'aide de moteurs qui sont commandés par la voie série (Rx1 et Tx1 / Rx2 et Tx2). Quand je donne un ordre à mes moteur, ils me répondent "P" quand ils arrive à la position souhaitée. Donc j'aimerais faire un programme par étapes, dès que je reçois un "P" sur le port série, je peux passer à l'étape suivante. Mais le problème c'est que si par exemple je fais mon étape "1" les moteur me répondent "P", se qui enclenche l'étape "2" , "3", "4",... puisque toutes les étapes attendent la réception du "P". Est-ce que vous avez une idée comment je pourrais procéder?

Merci beaucoup !

Julien

Bonjour Julien,

ça s’appelle une "finite state machine". Il y a des bibliothèques qui fait sa pour vous. Si vous comprenez Anglais : http://playground.arduino.cc/Code/FiniteStateMachine#Description

Bonjour Kevin,

j’ai bien lu ce que ous m’avez envoyer, mais c’est assez floue pour moi… (étant débutant avec Arduino) j’ai un “peu” compris l’histoire de quitter un état pour rentrer dans un autre, j’ai vu qu’il existait aussi du “Grafcet” avec Arduino.
http://www.irai.com/friends/a8arduino_e.pdf
Qu’est ce que vous en dites?

Meilleures salutations Julien

Il te suffit de stocker dans une variable l'étape à laquelle tu en es.

Pour passer à l'étape n, tu vérifies que tu as reçu un 'P' du moteur et que la variable contient n-1

Salut Bigben99 je comprends ce que tu veux dire mais je ne saurais pas le rentrenscrire en C…

Voici mon programme fait avec des delay().

je ne sais pas comment mettre les balises code pour le forum… désolé.

void setup() {
int reponse1;
int reponse2;// Lecture des données renvoyées

Serial.begin(9600); //Communication série avec le moniteur.
Serial1.begin(9600); //Communication série avec le moteur “1”
Serial2.begin(9600); //Communication série avec le moteur “2”

Serial1.println(“EN”); //Activation des drives
Serial2.println(“EN”);

Serial1.println(“HO”); //Definis la position “Home” et met la valeur actuelle à zéro.
Serial2.println(“HO”);

Serial1.println(“AC100”); //Courbe d’accéleration
Serial2.println(“AC100”);

Serial1.println(“DEC100”); //Courbe de déceleration
Serial2.println(“DEC100”);

Serial1.println(“SP8000”); //Vitesse max. pour cette commande
Serial2.println(“SP8000”);

Serial1.println(“NP”);// Le Drive réponds “P” quand il fini l’action
Serial2.println(“NP”);

////////////////////////////////////////////////////////////////////////////////

//Etape 1 Avancer de 700mm
Serial1.println(“LR100000”);
Serial2.println(“LR100000”);
Serial1.println(“M”);
Serial2.println(“M”);

delay (5000);

////////////////////////////////////////////////////////////////////////////////

//Etape 2 Rotation de 90°
Serial2.println(“LR1000”);
Serial2.println(“M”);

delay (2000)

////////////////////////////////////////////////////////////////////////////////

//Etape 3 Avancer de 300mm
Serial1.println(“LR100000”);
Serial2.println(“LR100000”);
Serial1.println(“M”);
Serial2.println(“M”);

}

void loop() {

}

En fait, le “LR…” est une position relative que j’envoie, et le “M” donne le départ de mon ordre.

Petit up.

Merci de votre aide.

Bonjour,

Il manque le code partie réception, puisque le problème se situe à cet endroit.

Tu peux faire quelque chose dans le genre (trés simplifié) :

int etape = 1;

void loop()
{

char = Serial.read();
delay(10);

if (char == "P") {etape = 2);

switch(etape)
{
case 1 : programme_1; break;
case 2 : programme_2; break;
case 3 : break;
case 4 : programme_4; break;
default : break;
}
}

@+

Zoroastre.

Normalement une machine à états se code ainsi:

on définit une liste des états enum {INIT, ATTENTE, ETAT1, ETAT2, FIN}; // exemple d'états possible le nom importe peu mais pas de doublons

ensuite on a une variable qui contient l'état courant

int etat= INIT; // on initialise la machine à états

Dans le corps du programme on a une structure de ce type

switch(etat){
     case INIT:
          // actions exécutés dans cet état
          
          // teste des conditions pour passer à un autre état
          if (bouton1){
                etat= ETAT1;
          } else if (bouton3){
                etat = ETAT2;
          } else {
                etat = ATTENTE;
          }
          break;
     case ATTENTE:
          // actions exécutés dans cet état
          
          // teste des conditions pour passer à un autre état
          break;

     case ETAT1:
          // actions exécutés dans cet état
          
          // teste des conditions pour passer à un autre état
          break;

     case ETAT2:
          // actions exécutés dans cet état
          
          // teste des conditions pour passer à un autre état
          break;

    case default:
        // gestion des états inattendus
}

Dans l'exemple je teste des boutons mais la condition de passage peut être quelconque. Il est préférable de faire en sorte que la machine ne soit pas bloquante.

Bonjour zoroastre,

tous d'abord merci de votre réponse, (en fait je reçois 112, ce qui équivaut à un "P") Excuser moi, mais je ne comprends pas comment vous "switcher" entre les étapes, ni le conditions pour le activer.

Je pensais faire comme bigben99 à dit plus haut, stocker un variable de l'étape en cours que l'on met à "1", et l'orsque l'on reçoit "P" (112) on démarre l^étape suivante.

Merci de votre aide

Julienbot

Je pensais faire un truc qui rassemble a ça, est-ce que cela pourrais jouer?

void setup() {
int reponse1; 
int reponse2;// Lecture des données renvoyées

int etape1;
int etape2;
int etape3;
int etape4;


Serial.begin(9600); //Communication série avec le moniteur. 
Serial1.begin(9600); //Communication série avec le moteur "1"
Serial2.begin(9600); //Communication série avec le moteur "2"

Serial1.println("EN"); //Activation des drives
Serial2.println("EN");

Serial1.println("HO"); //Definis la position "Home" et met la valeur actuelle à zéro.
Serial2.println("HO");

Serial1.println("AC50"); //Courbe d'accéleration 
Serial2.println("AC50");

Serial1.println("DEC50"); //Courbe de déceleration
Serial2.println("DEC50");

Serial1.println("SP8000"); //Vitesse max. pour cette commande
Serial2.println("SP8000");

Serial1.println("NP");// Le Drive réponds "P" quand il fini l'action
Serial2.println("NP");

////////////////////////////////////////////////////////////////////////////////

//Etape 1      Avancer de 700mm

digitalWrite (etape1, HIGH);
Serial1.println("LR100000");
Serial2.println("LR100000");
Serial1.println("M");
Serial2.println("M");

delay (5000);

////////////////////////////////////////////////////////////////////////////////
//Etape 2      Rotation de 90°

if (etape1 == HIGH) {
  if (112 == Serial.read()){
    digitalWrite (etape2, HIGH);
    Serial2.println("LR1000");
    Serial2.println("M");
  }
}


////////////////////////////////////////////////////////////////////////////////


//Etape 3      Avancer de 300mm
if (etape2 == HIGH) {
  if (112 == Serial.read()){
    Serial1.println("LR100000");
    Serial2.println("LR100000");
    Serial1.println("M");
    Serial2.println("M");
  }
}



}

void loop() {

}

bonjour a tous et désolé encore pour ces question qui se repete

mais je n'y comprend rien vraiment,

je veux envoyer les valeur de courant lu par mon arduino dans un tableau excel en temps réel!!

alors on me parle de processing de PLX-DAQ de Vba je ny comren plus rien serait - il possible de m'expliquer en français le principe pour mettre tout sa en oeuvre s'il vous plait !!!!

Barbudor avait fait un tuto il me semble....

Il me semble qu'on en avait parlé dans ce post : http://forum.arduino.cc/index.php?topic=143810.0