IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problème détection RFID en boucle avec Arduino


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Problème détection RFID en boucle avec Arduino
    Hello World,

    J'ai besoin d'un petit coup de pouce sur du développement arduino :/

    Le projet :

    Avec un lecteur RFID cablé sur un Arduino (actuellement Lecteur RFID Grove 125 kHz 113020002) je souhaite lire un tag RFID qui sera ensuite lu par un développement WINDEV pour être affiché sur une interface sur PC.

    Le but est de contrôler la présence ou non du tag à proximité du lecteur tous les 10sec

    MON CODE ARDUINO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    //link between the computer and the Serial2 Shield 
    //at 9600 bps 8-N-1 
    //Computer is connected to Hardware UART 
    //Serial2 Shield is connected to the Software UART:D2&D3  
     
    unsigned char buffer[12]; //64 caracteres lus à 
    changer selon longueur tag
     
    // buffer array for data receive over serial port 
    int count=0;     
    // counter for buffer array  
    void setup() 
    { 
      Serial2.begin(9600);     // the Serial2 baud rate         
    Serial.begin(9600);             
    // the Serial port of Arduino baud rate. } 
    Serial.write("demarrer");
    }
    void loop() 
    {     
    //checker si information disponible  'available' qqlchose
    // serial.
     
     
      {             buffer[count++]=Serial2.read();     // writing data into array             
      if(count == 64)break;        
      }         
       Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port         
      clearBufferArray();              // call clearBufferArray function to clear the stored data from the array         
      count = 0;                       // set counter of while loop to zero 
        }     
        if (Serial.available())            // if data is available on hardware serial port ==> data is coming from PC or notebook     
        Serial2.write(Serial.read());       // write it to the Serial2 shield 
        } 
        void clearBufferArray()              // function to clear buffer array 
        {     
          for (int i=0; i<count;i++)     
          { buffer[i]=NULL;}                  // clear all index of array with command NULL 
     
        Delay(1000);
    }

    La problématique :

    J'arrive à faire la lecture avec l'arduino, j'arrive à le lire sur WINDEV, mais je ne sais pas comment développer une boucle permettant de lire toutes les 10sec le tag permettant de voir sur le moniteur série le numéro du tag apparaître de nouveau à chaque cycle.


    J'espère que mon explication est assez exhaustive.
    Auriez-vous quelques pistes pour moi ?

    A bientôt

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    Voici un bout de code qui permet d'effectuer quelque chose toutes les 10 secondes en s'appuyant sur millis(). (cf l'exemple "blink without delay" pour la technique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void loop()
    {
      static unsigned long chronometre = 0;
      const unsigned long temporisation = 10000UL;
     
      if (millis() - chronometre >= temporisation) { // 10 secondes sont écoulées
        // faire ici le test de présence du tag
        ....
        // puis mémoriser le moment de cette vérification
        chronometre = millis(); // ou chronometre += temporisation; 
      }
     
      // ici votre arduino n'est pas bloqué, il peut faire autre chose
      // --> notamment écouter le port série pour de l'info des tags et noter dans une autre variable
      // le moment (millis()) de réception du dernier caractère reçu
      // Ça devrait vous donner une idée
     
    }

    Attention, dans votre code vous faites mais vous avez modifié la taille du buffer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char buffer[12]; //64 caracteres lus à changer selon longueur tag
    donc vous n'avez que 12 cases mémoires, pas 64. Le mieux serait de mettre cela dans une constante et de se référer à cette constante pour la dimension du tableau et les tests.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour les conseils, j'ai essayé de placer ces bouts de codes au sein de ce que j'avais déjà.
    J'ai un nouveau message d'erreur qui apparait, et je ne comprend pas pourquoi

    exit status 1
    'clearBufferArray' was not declared in this scope

    De plus, je n'arrive plus à faire fonctionner mon code de cette manière.
    J'avoue être un peu perdu, mes bases n'étant apparemment pas suffisantes

    Voici la dernière version de mon code. J'ai également essayer de placer une variable pour le buffer, mais il me demande un integer dans les crochets..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    //link between the computer and the Serial2 Shield 
    //at 9600 bps 8-N-1 
    //Computer is connected to Hardware UART 
    //Serial2 Shield is connected to the Software UART:D2&D3 
     
     
    // int buff = 64; ici j'ai essayé cela pour déclarer une variable à placer dans 'unsigned char buffer [buff]; mais il me demande un integer
     
    unsigned char buffer [64]; 
     
    // buffer array for data receive over serial port 
    int count=0;     
    // counter for buffer array  
    void setup() 
    { 
      Serial2.begin(9600);     // the Serial2 baud rate         
    Serial.begin(9600);             
    // the Serial port of Arduino baud rate. } 
     
    Serial.write("demarrer");
    }
     
    void loop()       
    {
      static unsigned long chronometre = 0;
     
      const unsigned long temporisation = 1000UL; //réduit à 1 seconde pour les tests
     
      if (millis() - chronometre >= temporisation)      
     
     
            {     
             if (Serial2.available()) // if date is coming from software serial port ==> data is coming from SoftSerial shield
              {    
                    while(Serial2.available())          // reading data into char array         
              {             buffer[count++]=Serial2 .read();     // writing data into array             
              if(count == 64)break;        
              }         
              Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port         
              clearBufferArray();              // call clearBufferArray function to clear the stored data from the array         
              count = 0;                       // set counter of while loop to zero 
     
     
                }     
                if (Serial.available())            // if data is available on hardware serial port ==> data is coming from PC or notebook     
                Serial2.write(Serial.read());       // write it to the Serial2 shield 
                } 
                void clearBufferArray()              // function to clear buffer array 
                {     
                  for (int i=0; i<count;i++)     
                  { buffer[i]=NULL;}                  // clear all index of array with command NULL 
            }
    chronometre = millis();
     
    }


    Thanks for the help

  4. #4
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Kiwiarduino
    Citation Envoyé par Kiwiarduino Voir le message
    J'ai un nouveau message d'erreur qui apparait, et je ne comprend pas pourquoi
    C'est la ligne
    qui provoque cette erreur. Le compilateur ne trouve pas cette fonction, car tu 'as écrite dans la boucle void loop().
    voici ton code corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    //link between the computer and the Serial2 Shield
    //at 9600 bps 8-N-1
    //Computer is connected to Hardware UART
    //Serial2 Shield is connected to the Software UART:D2&D3
     
     
    // int buff = 64; ici j'ai essayé cela pour déclarer une variable à placer dans 'unsigned char buffer [buff]; mais il me demande un integer
     
    unsigned char buffer [64];
     
    // buffer array for data receive over serial port
    int count=0;
    // counter for buffer array
    void setup()
    {
    	Serial2.begin(9600);     // the Serial2 baud rate
    	Serial.begin(9600);
    	// the Serial port of Arduino baud rate. }
     
    	Serial.write("demarrer");
    }
     
    void loop()
    {
    	static unsigned long chronometre = 0;
     
    	const unsigned long temporisation = 1000UL; //réduit à 1 seconde pour les tests
     
    	if (millis() - chronometre >= temporisation)
     
     
    	{
    		if (Serial2.available()) // if date is coming from software serial port ==> data is coming from SoftSerial shield
    		{
    			while(Serial2.available())          // reading data into char array
    			{             buffer[count++]=Serial2 .read();     // writing data into array
    				if(count == 64)break;
    			}
    			Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
    			clearBufferArray();              // call clearBufferArray function to clear the stored data from the array
    			count = 0;                       // set counter of while loop to zero
     
     
    		}
    		if (Serial.available())            // if data is available on hardware serial port ==> data is coming from PC or notebook
    		Serial2.write(Serial.read());       // write it to the Serial2 shield
    	}
    	chronometre = millis();
     
    }
     
    	void clearBufferArray()              // function to clear buffer array
    	{
    		for (int i=0; i<count;i++)
    		{ buffer[i]=NULL;}                  // clear all index of array with command NULL
    	}

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Super merci !
    J'ai plus de défaut concernant l'erreur.

    En revanche ca ne lit plus du tout mes données.
    Je n'ai plus la lecture des tags, et encore moins de tempo entre lecture.

    Je me pose la question quant à la possibilité de lire en boucle avec mon Lecteur RFID Grove 125 kHz 113020002
    Dans la documentation, il n'y a rien qui a l'air de s'y opposer

    Si je comprend bien dans le programme :

    - Je lance une tempo de 1sec
    - Je lis mon tag
    - J'écris la valeur lue
    - je relance ma tempo ?

    C'est bien cela ? arrivé à la fin du code on repart donc au début de 'void loop', je ne comprend donc pas pourquoi la lecture ne se fait plus comme précédemment. La fonction Millis() n'a pas d'impact sur cette lecture ...

  6. #6
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonsoir Kiwiarduino
    Citation Envoyé par Kiwiarduino Voir le message
    - je relance ma tempo ?
    Oui, mais à la bonne place
    Tu as mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	}
    	chronometre = millis();
     
    }
    Donc ton chrono est relancé à chaque "tour" de loop

    Il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	chronometre = millis();
    	}
     
    }
    Ainsi ton chrono se relance dans la condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (millis() - chronometre >= temporisation)
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

Discussions similaires

  1. Problème pour arréter une boucle avec un bouton
    Par Zizook dans le forum Tkinter
    Réponses: 17
    Dernier message: 17/03/2014, 13h26
  2. Problème de boucle avec for
    Par ions dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 20/11/2007, 08h58
  3. Problème boucle avec affichage tableaux
    Par lamouette76 dans le forum C
    Réponses: 11
    Dernier message: 08/10/2007, 19h05
  4. Problème de boucle avec un find
    Par mick77 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 21/06/2007, 16h46
  5. Problème de requête dans une boucle avec ADOQuery
    Par Ekik dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/05/2007, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo