Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Roue codeuse et perturbation

Anonyme
    19 juillet 2012 à 23:02:06

    Bonjour,

    >>>J'avais envie de m'implémenter un peu d’asservissement sur un robot.

    >>>J'ai réussi a fixer un capteur (genre Mouse) avec un roue codeuse de sourie.


    >>>Sauf que lorsque j'ai une roue qui tourne et pas l'autre j'ai mon compteur de la seconde qui compte aussi.
    >>>(ça le fait surement quand les deux tournent mais c'est moins flagrant)
    >>>Enfaite les perturbations arrivent surtout quand le capteur qui ne devrait pas compter sort du 5v.
    >>>Je peux pas vous faire de Screenshot de mon oscilloscope mais en gros on a une petite chute de tension.

    >>>Je me demandais si un petit 7414 ou autre circuit du genre ferai l'affaire ou si y avais pas une solution moins couteuse en bidouillage.
    >>>J'ai un doute sur l’efficacité d'un blindage des lignes.

    >>>Vous en pensez quoi ?

    Robotiquement


    Le code test en cadeau:
    #include <simpletimer.h>
    
    SimpleTimer timer;// the timer object
    
    //Standard PLL DC control
    int E1 = 4;     //M1 Speed Control
    int E2 = 7;     //M2 Speed Control
    int M1 = 5;    //M1 Direction Control
    int M2 = 6;    //M1 Direction Control
    
    #define LED 13
    
    volatile unsigned long int deltaCodeur[2];
    volatile unsigned long int codeur[2];
    volatile unsigned long int tempCodeur[2];
    
    //======================================[DEBUT MOTEUR]====================================== 
    void DriveMotorP(byte m1p, byte m2p) {
      digitalWrite(E1, HIGH);
      analogWrite(M1, (m1p));
     
      digitalWrite(E2, HIGH);
      analogWrite(M2, (m2p));
    }
    //When m1p/m2p is 127, it stops the motor
    //when m1p/m2p is 255, it gives the maximum speed for one direction
    //When m1p/m2p is 0, it gives the maximum speed for reverse direction
    
    //======================================[FIN MOTEUR]======================================
    
    //======================================[DEBUT SETUP]======================================
    void setup() {
      pinMode (LED, OUTPUT);
     
      Serial.begin(9600);
      attachInterrupt(0, blinkL, FALLING);
      attachInterrupt(1, blinkR, FALLING);
    
      for(int i=4;i<=7;i++)
        pinMode(i, OUTPUT);
        
      analogWrite (E1,128);
      digitalWrite(M1,HIGH);    
      analogWrite (E2,128);    
      digitalWrite(M2,HIGH);  
        
      timer.setInterval(100, repeatMe);  
      //TCCR0B = TCCR0B & 0b11111000 | 1;  //
    }
    //======================================[FIN SETUP]======================================
    
    //======================================[DEBUT LOOP]======================================
    void loop() {
      timer.run();
      
      DriveMotorP(255,127);  
    
        Serial.print(codeur[0]);
        Serial.print("\t");
        Serial.print(codeur[1]);
        Serial.print("\t");
        Serial.print(deltaCodeur[0]);
        Serial.print("\t");
        Serial.println(deltaCodeur[1]);
    }
    //======================================[FIN LOOP]======================================
    
    //======================================[DEBUT FCT INT]======================================
    void blinkR() {
      codeur[0]++;
    }
    
    
    void blinkL() {
      codeur[1]++;
    }
    
    void repeatMe() {
      deltaCodeur[0] = codeur[0] - tempCodeur[0];
      deltaCodeur[1] = codeur[1] - tempCodeur[1];
      tempCodeur[0]  = codeur[0];
      tempCodeur[1]  = codeur[1];
    }
    //======================================[FIN FCT INT]======================================
    
    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2012 à 2:23:27

      On peut avoir ton circuit electronique ? t'as mis combien en pull-up ?
      • Partager sur Facebook
      • Partager sur Twitter
      64kB de mémoire, c'est tout ce dont j'ai besoin
      Anonyme
        20 juillet 2012 à 16:08:57

        Image utilisateur

        C'est un module tout fait.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          22 juillet 2012 à 11:43:14

          Comme j'ai récupérer des fils d'un câble USB j'en ai profité pour mettre un blindage sur les fils des codeurs à la masse bien sur:

          ça ne fait rien...
          • Partager sur Facebook
          • Partager sur Twitter
            22 juillet 2012 à 22:58:55

            Essaie de faire une photo ou une reproduction de ta mesure parce que franchement une chute de tension avec ce que tu nous dis elle peut avoir une infinitée de formes et d'amplitudes...

            De même si pour ton circuit tu pouvais mettre à quoi correspondent les fils ca serait un peu mieux... rouge = 5V ? Vert = ? (et il va où ?), noir = masse ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              22 juillet 2012 à 23:13:42

              En électronique:
              Rouge toujours du 5V
              Noir toujours la masse

              le Vert, c'est le dernier bout de fils donc ça ne peux être que la sortie vert l'arduino.
              Mais en effet j'aurai du faire un effort désolé...

              Je vais faire une photo de ce pas.
              On vois rien sur la photo.
              C'est un bruit de 0.2V qui survient bien que lorsque le fils du codeur est branché (celui qui ne devrait pas compter).

              Une interruption sur une si basse baisse de tension o_O
              • Partager sur Facebook
              • Partager sur Twitter
                23 juillet 2012 à 0:05:22

                Citation : thelme

                En électronique:
                Rouge toujours du 5V
                Noir toujours la masse

                le Vert, c'est le dernier bout de fils donc ça ne peux être que la sortie vert l'arduino.
                Mais en effet j'aurai du faire un effort désolé...



                Je travaille sur des schéma en noir et blanc où il y a en général des tensions allant de 28V à 0,9V (28, 12, 5, 3.3, 1.8, 1.1, 0.9), donc de préférence toujours préciser la valeur de la tension. ;)
                Pour la masse en général un signe (le triangle), c'est encore mieux :)

                J'avais bien compris ton schéma, mais d'une part c'est pour éviter un malentendu et d'autre part ca peut te permettre de te rendre d'une erreur toute bête :)

                Pourrais-tu mettre l'ensemble du schéma de ton montage, notamment avec ton moteur ?
                Comment alimentes-tu ton montage ?
                Ton monteur tourne en permanence ? Ou seulement par moment ? Et la chute de tension, tu ne l'observerais pas au moment où le moteur démarre par hasard ? :)
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  23 juillet 2012 à 12:43:55

                  >Pour la masse en général un signe (le triangle), c'est encore mieux :)
                  c'est pas un peigne pour la masse et le triangle pour le la tension positive ? o_O

                  >J'avais bien compris ton schéma, mais d'une part c'est pour éviter un malentendu et d'autre part ca peut te permettre de te rendre d'une erreur toute bête
                  dac ^^

                  j'ai fais ça rapidement, j'aurai pas du :-°

                  >Pourrais-tu mettre l'ensemble du schéma de ton montage, notamment avec ton moteur ?
                  L'arduino que j'utilise est un DFRduino RoMeo V1.0 de DFRobot.
                  C'est avec un hacheur 4 quadrants, L298P de son petit nom.

                  >Comment alimentes-tu ton montage ?
                  5 piles AA de 1.5V

                  >Ton monteur tourne en permanence ? Ou seulement par moment ? Et la chute de tension, tu ne l'observerais pas au moment où le moteur démarre par hasard ?
                  Oui, il n'y a pas de coupure lors de mes tests.
                  Non, c'est pas lié au courant d'appel du moteur au démarrage.
                  ça le fait que en fonction d'ou est la roue (celle qui ne devrait pas compter).

                  J'ai oublier de faire des tests en fonction des alimentations donc les voici:
                  • j'ai séparé l'alimentation de l'Arduino des moteurs (USB -> arduino, alimentation stabiliser -> moteur)
                    pas concluant
                  • j'ai alimenté mon moteur avec l'alimentation stabiliser, (pour supprimer les perturbations qui pourrait être lié au hachage)
                    pas concluant
                  • j'ai tourné la roue à la main, en débranchant du circuit le moteur
                    pas concluant
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juillet 2012 à 14:11:14

                    ok, je propose de continuer les tests en alimentant les moteurs par une alim stabilisé (pour éviter de cumuler plusieurs problèmes, on fera l'intégration plus tard). Donc avec juste les capteurs de souris de branchés, ça ne marche pas bien.

                    Commençons par le hard.
                    Ton module a si j'ai bien compris 3 fils. Tu en relie 1 au 5V, 1 à la masse, et il y en a un que tu prends comme signal. Si oui, comment comptes tu déterminer le sens de rotation ? Es tu sur que ton branchement est correct ?
                    As tu le modèle de tes codeurs ? Si oui, il devrait y avoir un schéma d'application dans la datasheet
                    • Partager sur Facebook
                    • Partager sur Twitter
                    64kB de mémoire, c'est tout ce dont j'ai besoin
                    Anonyme
                      23 juillet 2012 à 20:08:02

                      Datasheet encodeur

                      Les photos dans la doc ne sont pas contractuel, parce que il a pas exactement cette tête là.

                      > comment comptes tu déterminer le sens de rotation ?
                      Pour l'instant je m'en préoccupe pas. cf: mon code
                      mais pour le savoir il suffira que je regarde la valeur de commande de mon moteur:
                      inférieure à 127: dans un sens
                      supérieur à 127: dans l'autre
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        7 août 2012 à 10:10:12

                        Je viens de retrouver un 7414.

                        Et... ça ne marche pas, même en séparant l'alimentation moteur. -_-'

                        C'est peut-être le hachage de ma tension qui fait ces perturbations.

                        Je vais essayer de mettre du filtrage passif un peu partout, j'en ai déjà mit sur les pattes de l'arduino et au borne du moteur.

                        Qu'es que vous en pensez ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 août 2012 à 11:05:31

                          Ah, je l'avais oublié ce codeur.

                          Bon, reprenons. Si tu alimente le codeur (en 5V donc), sans rien connecter sur la sortie signal, quand tu passes le disque devant le codeur, est ce que la LED change bien d'état ? (allumée/éteinte)

                          Si oui, as tu un oscillo pour vérifier le signal de sortie du codeur ? Toujours sans rien connecter dessus. Si tu as bien des créneaux en 0/5V, connecte ton arduino derrière. Ton signal est il toujours correct ?
                          Passe les crénaux à la main, un par un. Sont ils bien comptés par l'arduino ?

                          Débranche tout et refais les tests avec l'autre codeur et l'autre entrée de l'arduino.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          64kB de mémoire, c'est tout ce dont j'ai besoin
                          Anonyme
                            7 août 2012 à 11:47:08

                            Les deux interruptions s’activent alors que je fait passer à la main que sur un capteur et que le seconde est débrancher...

                            -------------------------

                            > quand tu passes le disque devant le codeur, est ce que la LED change bien d'état ?
                            Oui

                            > signal de sortie du codeur, sans rien connecter dessus.
                            bas: 0.8V
                            haut: 4.2V
                            Super... =__="


                            > En connectant l'Arduino.
                            ça ne changer pas, pas de soucis de chute de tension.

                            > avec le 7414.
                            bas: 0V
                            haut: 4.2V
                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 août 2012 à 13:12:20

                              à priori, alimenté en 5V, l'ATmega 128 lit 0 de -0.5V à 1.5V et 1 de 3.5V à 5.5V.
                              Du coup, le hard doit être bon, il reste le soft, et l'intégration à voir. Je te fais confiance pour avoir testé ton code avec un seul codeur. On va donc pencher pour un problème d'intégration. Tu peux avoir une image de ton signal de codeur, avec 1ms avant, 4ms après (tu peux tester d'autres calibres voir si tu trouves quelque chose). Si on ne voit rien à l'oscillo, on fera de la CEM à l'aveugle, sans savoir quel bruit on doit éliminer...
                              • Partager sur Facebook
                              • Partager sur Twitter
                              64kB de mémoire, c'est tout ce dont j'ai besoin
                              Anonyme
                                7 août 2012 à 13:53:39

                                J'ai pas compris les images que tu voulais.

                                J'ai mis un GBF pour simuler mon capteur.

                                Branché sur la Patte2: aucune perturbation
                                Branché sur la Patte3: Beaucoup plus d'interruption intempestive sur l'autre patte puis on retrouve la même interruption sur les deux pattes.
                                Et quand je met une sonde d’oscilloscope, plus aucune interruption intempestive. Dés que je la retire, "une réponse échelon 2eme ordre avec un dépassement très important puis retour au régime établie qui est le nombre d’interruption de son voisin.

                                Alors, Software ? o_O
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 août 2012 à 15:09:56

                                  Ah ben là ça commence à être intéressant. tu aurais le schéma de ta carte arduino ? j'ai la flemme de chercher.

                                  Je suppose que tu branche tes codeurs ou ton GBF directement sur la carte arduino, par un fil. Quelle longueur ? est ce que les fils de masse et de signaux sont ensemble ?

                                  Sur ta dernière expérience, tu dis retirer la sonde d'oscillo, du coup, qui est ce qui enregistre une réponse d'ordre 2 à un échelon ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  64kB de mémoire, c'est tout ce dont j'ai besoin
                                  Anonyme
                                    7 août 2012 à 16:24:38

                                    Ho, un grand flemma... programmeur. ^^
                                    Il était en lien juste au dessus, mais le voilà juste ici. :)

                                    Le branche du GBF ce fait grâce un cordon BNC-crocodile, pendant ~80cm c'est du blindé.

                                    J'ai pas de BNC-BNC chez moi, c'est bête d’ailleurs, j'ai plusieurs de T, donc je reprendre le signal par une sonde d'oscilloscope. (pas le truc différentiel, une sonde qui a une forme de stylo, je sais pas/plus son nom)
                                    Mais toutes les masses sont relier en effet.

                                    C'est la vitesse du nombre d’impulsion qui augment de façon a me faire penser a un second ordre mais je divague surement. vague
                                    Pour m'expliquer voilà un exemple, je met mon GBF pour avoir une vitesse de 100 sur la roue A.
                                    Quand il y a la sonde CH2 de l’oscilloscope sur l'entré pour le capteur B (de la roue B), la vitesse de la roue B est NULL.
                                    Lorsque je retire la sonde CH2, la vitesse B augment jusqu’à (on va dire) 800, puis redescend à 100.


                                    Le code: (qui n'as pas changé)
                                    #include <simpletimer.h>
                                    
                                    SimpleTimer timer;// the timer object
                                    
                                    //Standard PLL DC control
                                    int E1 = 4;     //M1 Speed Control
                                    int E2 = 7;     //M2 Speed Control
                                    int M1 = 5;    //M1 Direction Control
                                    int M2 = 6;    //M1 Direction Control
                                    
                                    #define LED 13
                                    
                                    volatile unsigned long int deltaCodeur[2];
                                    volatile unsigned long int codeur[2];
                                    volatile unsigned long int tempCodeur[2];
                                    
                                    //======================================[DEBUT MOTEUR]====================================== 
                                    void DriveMotorP(byte m1p, byte m2p) {
                                      digitalWrite(E1, HIGH);
                                      analogWrite(M1, (m1p));
                                     
                                      digitalWrite(E2, HIGH);
                                      analogWrite(M2, (m2p));
                                    }
                                    //When m1p/m2p is 127, it stops the motor
                                    //when m1p/m2p is 255, it gives the maximum speed for one direction
                                    //When m1p/m2p is 0, it gives the maximum speed for reverse direction
                                    
                                    //======================================[FIN MOTEUR]======================================
                                    
                                    //======================================[DEBUT SETUP]======================================
                                    void setup() {
                                      pinMode (LED, OUTPUT);
                                     
                                      Serial.begin(9600);
                                      attachInterrupt(0, blinkL, FALLING);
                                      attachInterrupt(1, blinkR, FALLING);
                                    
                                      for(int i=4;i<=7;i++)
                                        pinMode(i, OUTPUT);
                                        
                                      analogWrite (E1,128);
                                      digitalWrite(M1,HIGH);    
                                      analogWrite (E2,128);    
                                      digitalWrite(M2,HIGH);  
                                        
                                      timer.setInterval(100, repeatMe);  
                                      //TCCR0B = TCCR0B & 0b11111000 | 1;  //
                                    }
                                    //======================================[FIN SETUP]======================================
                                    
                                    //======================================[DEBUT LOOP]======================================
                                    void loop() {
                                      timer.run();
                                      
                                      DriveMotorP(255,127);  
                                    
                                        Serial.print(codeur[0]);
                                        Serial.print("\t");
                                        Serial.print(codeur[1]);
                                        Serial.print("\t");
                                        Serial.print(deltaCodeur[0]);
                                        Serial.print("\t");
                                        Serial.println(deltaCodeur[1]);
                                    }
                                    //======================================[FIN LOOP]======================================
                                    
                                    //======================================[DEBUT FCT INT]======================================
                                    void blinkR() {
                                      codeur[0]++;
                                    }
                                    
                                    
                                    void blinkL() {
                                      codeur[1]++;
                                    }
                                    
                                    void repeatMe() {
                                      deltaCodeur[0] = codeur[0] - tempCodeur[0];
                                      deltaCodeur[1] = codeur[1] - tempCodeur[1];
                                      tempCodeur[0]  = codeur[0];
                                      tempCodeur[1]  = codeur[1];
                                    }
                                    //======================================[FIN FCT INT]======================================
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    [Arduino] Roue codeuse et perturbation

                                    × 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