Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture de plusieurs bits (Bis)

Sujet résolu
    7 novembre 2014 à 19:41:56

    Bonsoir,

    Je suis dans le même cas que edouard62 dans le post : http://openclassrooms.com/forum/sujet/lecture-de-plusieurs-bits

    Je cherche à lire les données envoyées par l’anémomètre girouette TX20 La Crosse sur une carte arduino uno. J'ai déjà été voir pas mal de sites sans trouver comment faire.

    J'ai suivi tout ce qui était décrit mais même avec le montage intégrant le transistor 2n2222, je n'arrive pas a récupérer de signal.

    J'utilise ce code:

    int dataPin = 8;
    int dtrPin = 3;
     
    char data[41];
     
    void printData();
     
      
      
    void setup() {
        Serial.begin(9600);
        Serial.println("INIT");
        pinMode(dataPin, INPUT_PULLUP);
        pinMode(dtrPin, OUTPUT);
        digitalWrite(dtrPin, LOW);
    }
     
     
     
    void loop() {
         
        // Normalement, le module envoie les données pendant 49.2ms toutes les 2 secondes
         
        // A partir de là, il faut se syncroniser avec le récepteur
        // Pour ce faire, on va procéder en 2 étapes :
        // 1: on attend que le signal soit à LOW pendant au moins 100ms (de façon à être sure que le module n'envoie rien)
        // 2: on attend que le signal passe à HIGH (ce qui correspond au premier bit de l'envoie d'un message)
         
        Serial.println("SYNC");
         
        unsigned long currentTime = millis();
        unsigned long startTime = currentTime;
        while ( ( currentTime - startTime ) < 100 ) {
            currentTime = millis();
            if ( digitalRead(dataPin) == HIGH ) {
                startTime = currentTime;
            }
        }
         
        Serial.println("WAIT");
         
        while ( digitalRead(dataPin) == LOW ) { }
         
        // A partir de là, le module est en train d'envoyer donc il faut échantilloner tout ça !
        // Pour ce faire, on va procéder en 2 étapes :
        // 1: on attend 0.6ms (de façon à faire les échantillons en milieux de bits et non au début)
        // 2: on échantillonne 41 valeurs avec des pauses de 1.2ms
         
        delayMicroseconds(600);
         
        for ( int i = 0 ; i < 42 ; i++ ){
            data[i] = ( digitalRead(dataPin) == LOW ) ? '1' : '0';
            delayMicroseconds(1200);
        }
         
        // A partir de là, le module a tout envoyé, il ne reste plus à traiter et recommencer
         
        Serial.println("DONE");
         
        printData();
         
        Serial.println("END");
         
    }
     
     
     
    void printData() {
         
        // HEAD
        for ( int i = 0 ; i < 5 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.print(" ");
         
        // WINDDIR
        for ( int i = 5 ; i < 9 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.print(" ");
         
        // WIND SPEED
        for ( int i = 9 ; i < 18 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.print(" ");
         
        // WIND SPEED+3
        for ( int i = 19 ; i < 21 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.print(" ");
         
        // CC
        for ( int i = 21 ; i < 25 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.print(" ");
         
        // WIND DIR NEGATEIVE
        for ( int i = 25 ; i < 29 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.print(" ");
         
        // WIND SPEED NEGATIVE
        for ( int i = 29 ; i < 38 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.print(" ");
         
        // WIND SPEED NEGATIVE+3
        for ( int i = 38 ; i < 41 ; i++ ){
            Serial.print(data[i]);
        }
        Serial.println(" ");
         
    }



    Sur le moniteur série j'ai seulement :

    INIT
    SYNC
    WAIT
    DONE
    00000 0000 000000000 00 0000 0000 000000000 000
    END
    SYNC

    Merci à celui qui pourrait m'aider, je commence à désespérer !

    -
    Edité par Pascal35000 7 novembre 2014 à 19:57:06

    • Partager sur Facebook
    • Partager sur Twitter
      7 novembre 2014 à 21:15:53

      Concernant le code, je pense ne pas avoir de question (en même temps, c'est moi qui l'ai rédigé et edouard62 a réussit à obtenir un résultat avec).

      Du coup, je vais me concentrer sur la partie Hardware :)

      J'aurais donc une question : pourrais tu nous faire un schéma de tes branchements ?

      • Partager sur Facebook
      • Partager sur Twitter
        7 novembre 2014 à 21:53:33

        j'ai fais exactement le même branchement que celui du post précédent :

        La seule différence c'est que j'ai un 2N2222A au lieu du 2N2222 et des résistances 5.6 K au lieu de 5K

        J'ai branché P2 à l'entrée 8 de l'arduino et P1 à la 3.

        Là je viens de diminuer le temps de synchronisation à 10 au lieu de 100 et je capte des bits qui changent en fonction de la position de la girouette mais pas comme il faudrait il doit y avoir un décalage.

        -
        Edité par Pascal35000 7 novembre 2014 à 21:54:17

        • Partager sur Facebook
        • Partager sur Twitter
          7 novembre 2014 à 23:27:28

          En temps normal, le capteur donne un niveau logique LOW qu’il passera à HIGH en début de trame.

          La ligne 42 : while ( digitalRead(dataPin) == LOW ) { } a pour but d'attendre que le signal repasse à HIGH (début des données) et donc de finaliser la synchronisation.

          Jusque là, tout va bien, mais cela ne prend pas en compte l'utilisation d'un transistor externe.

          En effet, le transistor va amplifier les niveaux logiques mais va aussi les inverser.

          Du coup, le code doit aussi être adapté en conséquence : il faut remplacer tous les LOW par HIGH et vice versa en ce qui concerne la pin TXD (et laisser inchangé les niveaux de DTR qui n'est pas inversé).

          Le code devrait donc être :

          int dataPin = 8;
          int dtrPin = 3;
            
          char data[41];
            
          void printData();
            
             
             
          void setup() {
              Serial.begin(9600);
              Serial.println("INIT");
              pinMode(dataPin, INPUT_PULLUP);
              pinMode(dtrPin, OUTPUT);
              digitalWrite(dtrPin, LOW);
          }
            
            
            
          void loop() {
                
              // Normalement, le module envoie les données pendant 49.2ms toutes les 2 secondes
                
              // A partir de là, il faut se syncroniser avec le récepteur
              // Pour ce faire, on va procéder en 2 étapes :
              // 1: on attend que le signal soit à HIGH pendant au moins 100ms (de façon à être sure que le module n'envoie rien)
              // 2: on attend que le signal passe à LOW (ce qui correspond au premier bit de l'envoie d'un message)
                
              Serial.println("SYNC");
                
              unsigned long currentTime = millis();
              unsigned long startTime = currentTime;
              while ( ( currentTime - startTime ) < 100 ) {
                  currentTime = millis();
                  if ( digitalRead(dataPin) == LOW ) {
                      startTime = currentTime;
                  }
              }
                
              Serial.println("WAIT");
                
              while ( digitalRead(dataPin) == HIGH ) { }
                
              // A partir de là, le module est en train d'envoyer donc il faut échantilloner tout ça !
              // Pour ce faire, on va procéder en 2 étapes :
              // 1: on attend 0.6ms (de façon à faire les échantillons en milieux de bits et non au début)
              // 2: on échantillonne 41 valeurs avec des pauses de 1.2ms
                
              delayMicroseconds(600);
                
              for ( int i = 0 ; i < 42 ; i++ ){
                  data[i] = ( digitalRead(dataPin) == HIGH ) ? '1' : '0';
                  delayMicroseconds(1200);
              }
                
              // A partir de là, le module a tout envoyé, il ne reste plus à traiter et recommencer
                
              Serial.println("DONE");
                
              printData();
                
              Serial.println("END");
                
          }
            
            
            
          void printData() {
                
              // HEAD
              for ( int i = 0 ; i < 5 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.print(" ");
                
              // WINDDIR
              for ( int i = 5 ; i < 9 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.print(" ");
                
              // WIND SPEED
              for ( int i = 9 ; i < 18 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.print(" ");
                
              // WIND SPEED+3
              for ( int i = 19 ; i < 21 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.print(" ");
                
              // CC
              for ( int i = 21 ; i < 25 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.print(" ");
                
              // WIND DIR NEGATEIVE
              for ( int i = 25 ; i < 29 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.print(" ");
                
              // WIND SPEED NEGATIVE
              for ( int i = 29 ; i < 38 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.print(" ");
                
              // WIND SPEED NEGATIVE+3
              for ( int i = 38 ; i < 41 ; i++ ){
                  Serial.print(data[i]);
              }
              Serial.println(" ");
                
          }



          • Partager sur Facebook
          • Partager sur Twitter
            7 novembre 2014 à 23:45:26

            Merci beaucoup c'était bien ça !

            Ça marche parfaitement !

            • Partager sur Facebook
            • Partager sur Twitter

            Lecture de plusieurs bits (Bis)

            × 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