Partage
  • Partager sur Facebook
  • Partager sur Twitter

GRAFCET Avec Arduino

Arduino

22 avril 2013 à 23:22:37

Bonjour tout le monde ,  

         Je veux savoir comment programme/realise un grafcet , avec arduino ( langage arduino ) , et si c possible un petit exemple , merci d'avance

cordialement

  • Partager sur Facebook
  • Partager sur Twitter

The wings of Technology

23 avril 2013 à 10:09:05

Avec une machine à état (un switch)

Grossièrement ca donne :

void machineAEtat()
{
   static char etat = 0; //le mot-clé static permet de garder la variable intact entre les appels

   switch(etat) {
      case(0) : //action pour l'étape 0
          etat = 1; //puis on part vers l'étape 2
          break;
      case(1) : //action pour l'étape 1
          etat = 2;
          break;
      ...
      case(n) : //action pour l'étape 0
          if(machin) //une divergence par exemple
              etat = x;
          else
              etat = y;
          break;
   }
}



-
Edité par Eskimon 23 avril 2013 à 10:10:04

  • Partager sur Facebook
  • Partager sur Twitter

Retrouvez moi sur mon blog et ma chaine Youtube !

23 avril 2013 à 10:29:12

Sachant que la FSM (Finite State Machine) doit être exécutée en boucle, à chaque appel de la fonction donnée par Eskimon, la FSM exécute une étape.
  • Partager sur Facebook
  • Partager sur Twitter
6 mai 2013 à 19:18:08

Merci beaucoup pour les reponses , j ai un peu compris le principe , mais svp si c possible je veux un exemple simple pour bien comprendre, par exemple  :

    ->   grafcet commande verin en langage arduino   (    depart cycle -> sorti verin jusqu'a x -> entrer verin jusqu'a y .       )

    ->   et aussi commande je dois branche les entre et sortie entre  arduino et verin .


merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter

The wings of Technology

6 mai 2013 à 21:00:10

Ecrit le morceau de code de ce que tu as compris pour l'exemple que tu veux et on te donnera des conseils.

Nous ne sommes pas là pour faire tes devoirs/exercices à ta place, on (en tout cas moi) ne donnera pas des "solutions"/"exemples complexes" comme ca, c'est à toi de travailler un peu, et surtout c'est pour ton bien. :)

-
Edité par zeqL 6 mai 2013 à 21:00:25

  • Partager sur Facebook
  • Partager sur Twitter
7 mai 2013 à 14:38:16

Oui monsieur , ne t inkiete pas , j ai deja fais mon programme , presque fini , je me suis just bloque au niveau grafcet :  

( explication : ce que je veux faire c 'est la lecture de 3 diferent card RFID , et selon chaque carte j execute un grafcet  donc : je veu faire 3 grafcet de n importe koi , c ca l astuce je ne sai pa encore comment faire des grafcet avec langage arduino : 

mon code que j ai deja fait le voila monsieur : 

#include <LiquidCrystal.h>

int CMD[64]; // Here the max command length is set as 64 bytes. For example command "AB 02 01" is 3 bytes

boolean end_of_frame = false;

int digit;

int compt;

int test,i;

int card1,card2,card3;

int char_received = 0;

byte HEX_number, C, val;

// initializes the library with the interface pins

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//***********************************************************

//              serial_ASCII_to_Hex_digit()

//***********************************************************

// {ASCII char -> HEX digit} numeric conversion function

// any character different from 0..F will be ignored

int ASCII_to_Hex_digit()

{

   byte c = Serial.read();

   if (c >= '0' && c <= '9')

     { return c - '0';}

   else if (c >= 'a' && c <= 'f')  

     { return c - 'a' + 10;}

   else if (c >= 'A' && c <= 'F')    

     { return c - 'A' + 10;}  

   else

     { return -1;} // the character is not an HEX digit

}

void serial_init()

{

  // connect to the serial port   

  Serial.begin(115200);                                    

  // print a message to Serial

  Serial.println("13.56 MHz  RFID Reader");

  Serial.println("     Univ-Lille1");  

  Serial.println("    i-MOCCA   GSI ");

  Serial.println();

void serial1_init()

{

  Serial1.begin(9600);

  delay(10);

//  Serial1.write(0x01);  // Send the command to read RFID tag

  Serial1.write(0x02);  // Send the command to read RFID ID number  

}  

void lcd_init()

{

  // set up the LCD's number of columns and rows: 

  lcd.begin(16, 2);   

  // Print a message to the LCD.

  lcd.setCursor(0, 0);

  lcd.print("  ");

}

void error_lcd_print()

{

  lcd.setCursor(0, 0);

  lcd.print("ID: XXXXXXXXXX  ");  

  lcd.setCursor(0, 1);  

  lcd.print("  Defective tag ");   

void setup() 

{

  // connect to the serial port for screen display 

  // 115200 bauds 

  serial_init();

  // connect to the LCD  

  lcd_init();

  // connect to the serial1 port for communication with the RFID reader

  // 9600 bauds 

  serial1_init(); 

 }

//***********************************************************

//              loop()

//***********************************************************

void loop() // run over and ove

{         

           int code;

  // read ASCII DATA characters coming from the serial monitor 

  // and convert them into HEX numbers and send it to the RFID module

  while (Serial.available())

  {

    digit = ASCII_to_Hex_digit();

    if (digit >=0)

    {  

      char_received++;

      if (char_received & 1 == 1)

         HEX_number = digit << 4;

      else

      {  

        HEX_number += digit;

        Serial1.write(HEX_number);

      }  

    }

  }

  /**********************************************************************************************************************************/

  // read numeric DATA coming from the RFID module and send it to the serial monitor

  compt=6;

  test=0;

  card1=0;

lcd.setCursor(0, 0);   

lcd.print("**Lecture RFID**");

lcd.setCursor(0, 1);   

lcd.print("                ");

  while (Serial1.available())

  {

    HEX_number = Serial1.read(); 

    if (HEX_number < 10)

          Serial.print("0");

           code=HEX_number;   // lecture de code hex en dec

                  if ( code == 138 && test == 0)

               {   card1=1;

                  test=1; }

                  if ( code == 58 && test == 0)

               {   card2=1;

                  test=1; }

                  if ( code == 170 && test == 0)

               {      card3=1;

                     test=1; }

    Serial.print(HEX_number, HEX); // display in HEX

    Serial.print(" ");

         lcd.setCursor(compt, 1);   

lcd.print(HEX_number, HEX);   // display each character to the LCD

         compt+=2;

         if ( card1==1)

        { lcd.setCursor(1, 0);   

 lcd.print("**  CARD 1  **");

          card1=0;}  // display each character to the LCD

         if ( card2==1)

        { lcd.setCursor(1, 0);   

 lcd.print("**  CARD 2  **");

          card2=0;}  

         if ( card3==1)

        { lcd.setCursor(1, 0);   

  lcd.print("**  CARD 3  **");

          card3=0;}  

          lcd.setCursor(0, 1);   

 lcd.print("TAG : ");

    end_of_frame = true;

  }

  delay(1000);  

  if (end_of_frame)  

  {

    Serial.println();

    end_of_frame = false;

  }  

}  

Autre question hros sujet svp , comment je mettre mon programme dans zone  ici sur siteduzero svp merci :)

  • Partager sur Facebook
  • Partager sur Twitter

The wings of Technology

7 mai 2013 à 21:34:38

(pas de balises code -> pas de lecture ! ) et pour l'histoire du grafcet, je t'ai fourni un exemple de "comment ca marche" en programmatoir
  • Partager sur Facebook
  • Partager sur Twitter

Retrouvez moi sur mon blog et ma chaine Youtube !

12 mai 2013 à 18:47:01

/*void GrafcetEtat1()
{
   static char etat = 0; //le mot-clé static permet de garder la variable intact entre les appels
 
   switch(etat) {
      case(0) : //action pour l'étape 0
         if( digitalRead(31)== 1 && digitalRead(33)== 1  ); // etape initial -  P0
   		            etat = 1;   // 	activation etape suivant  
          break;
		  
      case(1) : //action pour l'étape 1
	              digitalWrite(22, HIGH);      // marche a droit
	  if( digitalRead(49)== 1);   // position chariot P1
          etat = 2;
          break;
		  
      case(2) : //action pour l'étape 2
	              digitalWrite(23, HIGH); // marche a gauche
	  if( digitalRead(31)== 1);   // positin initial p0
          etat = 0;
          break;
   
    }  
   
   }

Bonjour , voila j ai fai un grafcet ave langage arduino , est ce c correct svp ?  
enft c t un grafcet de chariot qui bce deplace a droit jusqu  ¨P1 ( apres clik sur bouton marche et condiction initial )  , et apre il se retourn a p0,
lmes entre sortie de l arduino seront branche avec un pupitre qui commande le chariot . merci 
  • Partager sur Facebook
  • Partager sur Twitter

The wings of Technology

12 mai 2013 à 18:52:05

Ne faut il par remettre la pin 22 à l’état bas avant de mettre la 23 à l’état haut (dans l’étape 2) ? (pareil pour la 23 au moment de l’étape initiale)

Sinon, ça ma l’air bon.

  • Partager sur Facebook
  • Partager sur Twitter
12 mai 2013 à 19:11:41

D'accord mr fscorpio merci pour votre aide , donc le programme a nouveau est  :) : 
/*void GrafcetEtat1()
{
   static char etat = 0; //le mot-clé static permet de garder la variable intact entre les appels
 
   switch(etat) {
      case(0) : //action pour l'étape 0
	            digitalWrite(23, low); 
         if( digitalRead(31)== 1 && digitalRead(33)== 1  ); // etape initial -  P0
   		            etat = 1;   // 	activation etape suivant  
          break;
		  
      case(1) : //action pour l'étape 1
	              digitalWrite(22, HIGH);      // marche a droit
	  if( digitalRead(49)== 1);   // position chariot P1
          etat = 2;
          break;
		  
      case(2) : //action pour l'étape 2
	              digitalWrite(22, low); 
				  digitalWrite(23, HIGH); // marche a gauche
	  if( digitalRead(31)== 1);   // positin initial p0
          etat = 0;
          break;
   
    }  
   
   }

  • Partager sur Facebook
  • Partager sur Twitter

The wings of Technology

12 mai 2013 à 19:25:03

Il ne faut pas de ; à la fin d’un if.
  • Partager sur Facebook
  • Partager sur Twitter
12 mai 2013 à 19:35:29

ah ui ui kel faut j ai mis lol , merci bcp ^^ .
  • Partager sur Facebook
  • Partager sur Twitter

The wings of Technology

12 mai 2013 à 19:44:43

Ton indentation est à revoir.

Voici un code un peu amélioré :

void GrafcetEtat1(void) //void entre les parenthèses signifie pas d’argument
                        //alors qu’un vide signifie n’importe quel argument
                        //(en C du moins)
{
    static enum
    {
        INITIAL,
        MARCHE_DROITE,
        MARCHE_GAUCHE
    } etat = INITIAL; //le mot-clé static permet de garder la variable intact entre les appels

    switch(etat)
    {
    case(INITIAL) : //action pour l'étape 0
        digitalWrite(23, low);
        if( digitalRead(31)== 1 && digitalRead(33)== 1  ) // etape initial -  P0
            etat = MARCHE_DROITE;   //  activation etape suivant
        break;

    case(MARCHE_DROITE) : //action pour l'étape 1
        digitalWrite(22, HIGH);      // marche a droit
        if( digitalRead(49)== 1)   // position chariot P1
            etat = MARCHE_GAUCHE;
        break;

    case(MARCHE_GAUCHE) : //action pour l'étape 2
        digitalWrite(22, low);
        digitalWrite(23, HIGH); // marche a gauche
        if( digitalRead(31)== 1)   // positin initial p0
            etat = INITIAL;
        break;

    default : //Ne devrait jamais arriver, mais on sait jamais.
        digitalWrite(22, low);
        digitalWrite(23, low);
        etat = INITIAL;
        break;
    }
}

J’utilise une énumération pour le type d’etat. une variable de type énumération peut prendre comme valeur celle spécifié à la définition du type (ici, INITIAL, MARCHE_DROITE, MARCHE_GAUCHE) et aussi des valeurs entières (1, 42, …), mais ces valeurs ne doivent pas être utilisé.

Je n’ai jamais utilisé Arduino, ce que je dit est vrai en C. Comme le langage Arduino est très proche du C, je pense que tout ce que j’ai dit est aussi vrai en Arduino.

-
Edité par fscorpio 12 mai 2013 à 19:46:31

  • Partager sur Facebook
  • Partager sur Twitter
12 mai 2013 à 19:53:14

Merci beaucoup fscorpio , ca marche tres bien , et c vraiment un programme pro ^^ , merci beaucoup encore une fois :)
  • Partager sur Facebook
  • Partager sur Twitter

The wings of Technology

13 mars 2014 à 11:35:37

Bonjour, j'ai essayé de mettre en pratique ce que j' ai vu ici pour interpréter la mesure d'un capteur de courant

mais cela ne fonctionne pas, je dois faire une erreur quelques part mais je ne sais pas ou, est ce que vous voyez une grosse erreur quelques part?

void loop(){
 
     float sensorVal= analogRead(sensorPin); // Lecture de la tension emise par le capteur de courant
     float voltage = (sensorVal*5.0)/1023.0; //Conversion de la lecture du capteur
     float current = (voltage-2.545)*959.692898; //Conversion de la lecture en courant
  static char etat = 0; //le mot-clé static permet de garder la variable intact entre les appels
 
  switch(etat){
   
    case(0):
   
     digitalWrite(3,LOW); // on éteint la LED
     digitalWrite(4,HIGH); // on selectionnne un sens de courant
      if (current>=baselineCurrent)  // Si le courant est superieur a la valaur minimale
      etat = 1;
   
    case(1):
   
      it = it + current; // calcul de la concomation de courant
     Serial.print ("Signal: ");// Ecriture dans le moniteur serie
     Serial.print (voltage) ;// Ecriture dans le moniteur serie
     Serial.print ("Current: ");// Ecriture dans le moniteur serie
     Serial.print (current); // Ecriture dans le moniteur serie
     Serial.print ("it: "); // Ecriture dans le moniteur serie
     Serial.println (it); // Ecriture dans le moniteur serie
      delay(1000);// On temporise pour etaler les mesures a  chaque seconde
      if (it >2000.0)//Si la consommation est suffisante ( le chlore est prêt)
      etat=2;
      break;
     
      case(2):
     
      it=0;
      digitalWrite(3,HIGH); // on allume la LED de signalement
      switchState = digitalRead(2);// on dit ou effectuer la lecture du niveau du bouton poussoir
      if (switchState=HIGH) // si le BP est enclenché
      etat=3;

      break;
     
      case(3):
    
       cycle=cycle+1; // on ajoute un cycle au nombre déjà effectué
      
        if (cycle>5)// Si le nombre de cycle est inférieur à 5
        etat=1;
         if (cycle=5)// Si le nombre de cycle est inférieur à 5
        etat=0;
  }
 
}

-
Edité par Petrus036 13 mars 2014 à 11:36:57

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2014 à 17:56:12

Plutôt que d'aller polluer le sujet des autres en faisant du déterrage tu pourrais pas appliquer ce que je te propose dans TON sujet d'hier ? http://fr.openclassrooms.com/forum/sujet/grafset-sur-arduino

  • Partager sur Facebook
  • Partager sur Twitter

Retrouvez moi sur mon blog et ma chaine Youtube !