Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino probleme de programme

    16 mars 2021 à 14:51:30

    Bonjour, je suis un élève de terminal STI2D qui doit réaliser un projet de fin d'année.

    Mon programme consiste à verrouiller manuellement une carte sur un lecteur RFID ( 125 KHz RFID Reader) et à la déverrouiller manuellement. Elle se verrouille manuellement mais le problème est qu'elle se déverrouille automatiquement.

    Voici mon programme:

    #include <SoftwareSerial.h>
    SoftwareSerial SoftSerial(2, 3);
    unsigned char buffer[64]; // buffer array for data receive over serial port
    int count = 0; // counter for buffer array
    int deverrouiller = 1;
    unsigned char card[64];
    int bon = 0;
    int i = 0;
    void setup()
    {
        SoftSerial.begin(9600); // the SoftSerial baud rate
        Serial.begin(9600); // the Serial port of Arduino baud rate.
    }
    void loop()
    {
        while (deverrouiller == 1) {
            // if date is coming from software serial port ==> data is coming from SoftSerial shield
            if (SoftSerial.available())
            {
                while (SoftSerial.available()) // reading data into char array
                {
                    buffer[count++] = SoftSerial.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;
                Serial.print("verrouiller");
                deverrouiller = 0;
                for (i = 0; i < 12; i++) {
                    buffer[i] = card[i];
                    deverrouiller = 0;
                }
            }
        }
        delay(1000);
    }
    }
    {
        while (deverrouiller == 1) {
            // if date is coming from software serial port ==> data is coming from SoftSerial shield
            if (SoftSerial.available())
            {
                while (SoftSerial.available()) // reading data into char array
                {
                    buffer[count++] = SoftSerial.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;
                Serial.print("verrouiller");
                deverrouiller = 0;
                for (i = 0; i < 12; i++) {
                    buffer[i] = card[i];
                    deverrouiller = 0;
                }
            }
        }
    }
    }
    void clearBufferArray() // function to clear buffer array
    {
        // clear all index of array with command NULL
        for (int i = 0; i < 12; i++)
        {
            buffer[i] = NULL;
        }
    }


    Merci d'avance pour votre aide !

    -
    Edité par lorrio 17 mars 2021 à 8:18:50

    • Partager sur Facebook
    • Partager sur Twitter
      17 mars 2021 à 8:29:42

      Bonjour Aladin781,

      Je viens d'éditer ton message pour y ajouter les balises code (le petit bouton </> au dessus de l'éditeur), penses-y la prochaine fois car c'est illisible sans ces balises.

      J'ai un peu de mal à voir comment le code que tu as posté peut compiler étant donné qu'il y a des bouts de code en dehors des fonctions ainsi que plus d'accolades fermantes que d'accolades ouvrantes.

      Tu as forcément une erreur de compilation sur ce code, sauf si tu as volontairement supprimé des parties pour ne pas nous donner l'intégralité de ton code.

      Néanmoins, voici quelques pistes de réflexions :

      - tu as 2 boucles while (deverrouiller == 1), ce qui parait étrange car une fois que tu auras passé deverrouillerà 0, alors ton code ne fera plus rien

      - à aucun endroit tu ne vérifies le contenu de tes buffer pour voir si c'est la bonne carte qui a été scannée pour faire le verrouillage/déverrouillage

      - le Serial est un périphérique asynchrone qui reçoit les caractères un par un donc rien ne garanti qu'il va tout recevoir d'un coup lorsque tu rentreras dans la boucle while (SoftSerial.available()) qui remplie ton buffer... il te faudrait faire la vérification qu'une fois que les 12 caractères de la cartes sont reçus

      Et sinon, question bonus :

      - pourrais-t-on avoir la référence de ton lecteur RFID ? ou la doc de celui-ci ?

      - pourquoi n'utilises tu pas une des nombreuses lib RFID disponibles ?

      • Partager sur Facebook
      • Partager sur Twitter
        17 mars 2021 à 9:04:35

        Bonjour,

        Déplacement vers un forum plus approprié

        Le sujet est déplacé de la section Discussions générales vers la section Électronique

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          18 mars 2021 à 12:33:33

          Bonjour lorrio,

          J'ai réussi à régler mon problème malheureusement il me manque une dernière chose. Mon programme me permet d'ouvrir un servo moteur avec la première carte que lit mon lecteur RFID et que seule cette dernière me permet de la refermer mais je ne sais pas comment est-ce que je pourrais faire pour que lorsque ma deuxième carte soit lu par le lecteur, elle puisse ouvrir le deuxième servo moteur.

          Voici mon programme:

          #include <SoftwareSerial.h>

          #include <Servo.h>

          Servo myservo;

          SoftwareSerial RFID(2,3);

          char buffer[14];

          int nByte = 0;

          int bon=0;

          char carte [14];

          int deverrouiller=1;

           #include <Wire.h>

          void setup() {

           myservo.attach(5); 

          RFID.begin(9600);

          Serial.begin(9600);

          delay(1000);

          Serial.println("swift tag RFID");

          }

          void loop() {

          while(deverrouiller == 1){

          nByte=0;

          if(RFID.available()) {

            while(RFID.available()) {

              buffer[nByte++] = RFID.read();

              delay(1);

            }

           Serial.print("verrouiller  ");

           myservo.write(90);

            for(char i=0;i<14;i++){

          carte[i]=buffer[i];

              deverrouiller = 0;

          }

          }

          }

          while(deverrouiller == 0){

          nByte=0;

          if(RFID.available()) {

            while(RFID.available()) {

              buffer[nByte++] = RFID.read();

              delay(1);

            }

            for(char i=0;i<14;i++){

          if (carte[i]== buffer[i]){

            bon=bon+1;

          }

            }

          if (bon==14){ deverrouiller = 1; 

           Serial.print("deverrouiller  ");

           myservo.write(160);

          }

            bon=0;

          }

          }

          }

          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2021 à 9:48:33

            Je t'invite à relire les premier mot de mon message précédant :

            lorrio a écrit:

            Je viens d'éditer ton message pour y ajouter les balises code (le petit bouton </> au dessus de l'éditeur), penses-y la prochaine fois car c'est illisible sans ces balises.

            Je ne vais pas éditer tous tes messages... c'est illisible...

            Si tu veux pouvoir gérer plusieurs cartes et plusieurs servo en même temps, il va te falloir revoir un peu l'architecture de ton programme.

            En effet, tu as un programme assez linéaire avec des actions qui s'enchainent :

            1. Attente d'une carte pour vérouiller

            2. Attente de cette même carte pour déverrouiller

            Sauf que si tu tu veux gérer une seconde carte, tu ne peux pas te permettre de faire ces phases d'attentes d'une action précise associée à une carte car tu ne sais pas dans quel ordre seront présentées ces cartes.

            Il te faut plutôt opter pour un programme qui lit une carte (peu importe laquelle) et prend une décision en fonction de l'état actuel et de la carte lue.

            Par exemple, tu pourrais commencer par créer des variables retenant l'état de chaque servo ainsi que la carte qui sera associé au déverrouillage.

            bool servo1verou = false; // Etat de verrouillage du servo 1
            bool servo2verou = false; // Etat de verrouillage du servo 2
            
            char carte1[14]; // Carte associée au servo 1
            char carte2[14]; // Carte associée au servo 2

            Et pour ton programme, il te faudrait faire quelque chose dans ce style :

            while ( ... ) {
                ... // Attente de lecture d'une carte
            }
            
            // Ok, le programme sort de la boucle, une carte vient d'être lue
            
            if ( servo1verou == false ) { // Si le servo 1 est pas verouillé
            
                // Alors on verrouille
                Servo.write(...);
            
                // On enregistre l'état
                servo1verou = true;
            
                // Et on copie la carte
                for (...) carte1[i] = buffer[i];
            
            } else { // Et si le servo 1 est verouillé
            
                // On test si c'est la bonne carte
                bon = 0;
                for (...) if carte1[i] == buffer[i] bon++;
            
                // Si c'est bien la bonne carte, alors on déverrouille
                if ( bon == 14 ) {
                    Servo.write(...);
                    // Et on enregistre le changement d'état
                    servo1verou = false;
                }
            
            }
            
            // Et maintenant, on peut aussi voir si cette carte scannée peut être utilisée pour le servo2
            
            if ( servo2verou == false ) {
                ...
            } else {
                ...
            }
            
            





            -
            Edité par lorrio 19 mars 2021 à 9:49:24

            • Partager sur Facebook
            • Partager sur Twitter

            Arduino probleme de programme

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown