Reconnaître et faire face à rebond de contact sur la pi framboise

Vous devrez peut-être faire face à rebondissement de contact pour votre prochain projet Raspberry Pi. La lecture d`un commutateur est assez simple. Elle retourne un 0 ou un 1, selon que l`interrupteur est enfoncé. Les commutateurs doivent toujours être connectés entre l`entrée à usage général / sortie (GPIO) broches d`entrée et la masse et soit permettre à la résistance de pull-up interne ou de les fixer une résistance externe. Lorsqu`un interrupteur est fermé, il fait un chemin de terre. Vous avez lu une logique faible ou nulle lorsque ce chemin est fait.

Vous pouvez voir d`autres arrangements où un commutateur est connecté entre la broche d`entrée GPIO et 3V3, mais ce n`est pas recommandé car les commutateurs sont normalement longs fils. longs fils de routage connectés à la masse est moins risqué que la connexion à une tension d`alimentation. Voici comment vous câbler un interrupteur.

Video: Part 1 - The Time Machine Audiobook by H. G. Wells (Chs 01-06)

Bien qu`un interrupteur à la terre avec une résistance de traction à une haute tension ne peut lire que 1 ou 0, la plupart des commutateurs sont un peu plus complexes. Par exemple, prendre un sac de 1 livre de sucre et de le déposer à partir d`environ 6 pouces sur une surface dure comme une table. Il frappe la surface avec un bruit sourd et se arrête. Maintenant, essayez la même chose avec une balle de ping-pong, et vous&rsquo-ll voir qu`il rebondisse. Le premier rebond de la balle de ping-pong ISN&rsquo-t aussi haut que vous laissiez tomber la hauteur à partir, mais&rsquo-s assez élevé. Ensuite, la balle tombe et rebondit à nouveau, légèrement inférieure. Cela continue avec plus en plus petites hauteurs de rebond jusqu`à ce que la balle se reposer. Notez que plus le rebond, plus le temps entre bounces- les rebonds accélèrent jusqu`à ce que la balle se reposer.

Contacts de commutation sont comme ça - ils&rsquo-re surfaces rigides se rassembler rapidement, et ils rebondissent. Tant et si bien que si vous examinez les niveaux logiques du commutateur donne, vous&rsquo-Verrez pas d`une simple transition d`un sommet à un bas, mais une succession de transitions se rapprochant et se rapprocher jusqu`à ce qu`un niveau d`équilibre est atteint. Ceci est connu comme un bord sale ou rebond de contact.

Video: Part 2 - Anne of Green Gables Audiobook by Lucy Maud Montgomery (Chs 11-18)

Cette évolution rapide de 0 à 1 peut être un problème si l`ordinateur est à la recherche de l`interrupteur très rapidement. En fait, cela se produit beaucoup plus rapidement qu`un utilisateur peut appuyer sur un bouton, mais parfois des circonstances ou code laisser cela se produire. Pour illustrer le problème, consulter le code suivant, pour brancher un commutateur entre deux GPIO (broche 3) et la masse (broche 6). Cette broche a une résistance pull-up monté sur la carte.

Video: "Gru fait caca !" - MOI MOCHE ET MÉCHANT 2

# Bounce problème montre rebond contact # Auteur: Mike Cookimport timeimport wiringpi2 comme ioio.wiringPiSetupGpio () io.pinMode (2,0) # pour inputlastPress = io.digitalRead (2) count = 0pressTime = time.time () print"test bouton-poussoir"while True: appuyez sur = io.digitalRead (2) si la presse == 0 et lastPress = appuyez sur: count + = 1pressTime = time.time () si le nombre gt; = 5: print"cinq presses"count = 0lastPress = appuyez sur

La technique utilisée ici est de compter cinq presses de commutation et ensuite imprimer lorsque l`ordinateur les a tous inventoriés. Si vous essayez, vous pouvez constater qu`il imprime qu`il a détecté cinq presses après quatre ou même trois presses, ainsi que tous les cinq. En bref, il est peu fiable parce que le rebond de contact est à l`origine compte erronées.

Video: SCP-261 Пан-мерное Торговый и эксперимент Войти 261 объявление Де + полный +

Pour étudier cette plus profonde, il faut mesurer l`intervalle entre les presses. Cela se fait avec le code suivant.

# Bounce Mesure # mesures intervalle de temps de contact # Auteur: Mike Cookimport timeimport wiringpi2 comme ioio.wiringPiSetupGpio () io.pinMode (2,0) # pour inputlastPress = io.digitalRead (2) count = 0startTime = intervalle time.time () = [0.0,0.0,0.0,0.0,0.0] print"test bouton-poussoir"while True: appuyez sur = io.digitalRead (2) si la presse == 0 et lastPress = appuyez sur: [count] = intervalle time.time () - startTimecount + = 1startTime = time.time () si le nombre gt; = 5: print"cinq presses ", Intervalcount = 0startTime = time.time () = lastPress presse

L`intervalle entre chaque pression de commutation est enregistré dans une liste. Elle est dérivée de l`horloge temps système et compte le nombre de secondes écoulées depuis le système démarré. En soustrayant le temps du système à partir du moment de la presse actuelle, vous obtenez le temps écoulé depuis la dernière presse. Le résultat de l`exécution de ce programme est présenté ici:

cinq presses [1.2872810363769531, 0.25738978385925293,6.198883056640625e-05, 0,27149009704589844, 6.699562072753906e-05] cinq presses [2.247836112976074, 0.31453490257263184,0.32202887535095215, 0.2885620594024658, ,33057308197021484] cinq presses [1.048125982284546, 3.504753112792969e-05,0.5636959075927734, ,43523192405700684, ,4095041751861572] cinq presses [14,676625967025757, 0.24735713005065918,0.24397802352905273, ,33951711654663086, ,34607601165771484]

Notez que le code ne tente pas de réduire le nombre de bits significatifs dans les lectures, mais un coup d`oeil près certains d`entre eux, et vous&rsquo-ll voir que certains finissent avec un e-05. C`est la méthode par défaut de dire 10 à la puissance de -5- ceci est connu comme le format exposant et est le chemin par défaut des nombres à virgule flottante sont représentés dans la plupart de l`informatique. Alors, oubliant le nombre ridicule de places après la virgule, ce nombre, 6.12e-05, est interprété comme 0.0000612 ou 61,2 microsecondes (US), ce qui est beaucoup plus rapide que tout être humain peut appuyer sur quoi que ce soit. Ceci est un exemple de rebond de contact. vous ne&rsquo-t voir chaque rebond parce que l`ordinateur seulement échantillonne le niveau logique de la ligne à des intervalles discrets.

La façon d`empêcher que cela se produise est d`introduire un temps mort - qui est, d`ignorer l`interrupteur pendant un certain temps après une presse a eu lieu. À de nombreuses reprises, cela se produira naturellement parce que vous pourriez avoir une déclaration d`impression ou d`un autre code qui prend un certain temps avant que l`interrupteur est regardé à nouveau. Dans le cas contraire, une solution simple serait d`ajouter un retard juste après l`interrupteur a été détecté afin que rien ne se fait pendant le temps de rebond potentiel.

Cependant, pour l`ultime anti-rebond, vous devez faire une note du temps est détecté une transition de commutation. Puis, quand une autre transition est détectée, le traitement ne comme réel si un temps spécifique est écoulé entre la dernière transition réelle et l`heure actuelle. Un exemple de cela est indiqué dans le code suivant.

# Bounce Solution # Comment faire face à bounce # Auteur: Mike Cookimport timeimport wiringpi2 comme ioio.wiringPiSetupGpio () io.pinMode (2,0) # pour inputlastPress = io.digitalRead (2) count = 0pressTime = time.time () print"test bouton-poussoir"while True: appuyez sur = io.digitalRead (2) si la presse == 0 et lastPress = et appuyez sur (time.time () - pressTime) gt; 0,025: compter + = 1pressTime = time.time () si le nombre gt; = 5: print"cinq presses"count = 0lastPress = appuyez sur

Ici, le secret est le test supplémentaire dans la si déclaration qui vérifie ce qu `au moins 25 millisecondes (ms) se sont écoulés avant que la transition est considérée comme vraie.

Différents types de commutateurs mécaniques rebondissent à un degré différent. Selon exactement ce que votre code est et à quelle vitesse il fonctionne, cela peut ou peut ne pas être un problème. Si vous faites l`expérience &ldquo-fantôme&rdquo- transitions à la lecture d`un interrupteur mécanique, il&rsquo-s susceptibles d`être rebond de contact. Si oui, vous pouvez utiliser l`une des techniques décrites ici pour éliminer l`effet.

Articles connexes