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

Vous devrez peut-être faire face à rebond de contact pour votre prochain projet Raspberry Pi. La lecture d'un commutateur est assez simple. Il renvoie soit un 0 ou un 1, selon que le commutateur est actionné. Commutateurs doivent toujours être connectés entre le / sortie (GPIO) broche et la masse d'entrée entrée universelle et soit permettre à la résistance de pull-up interne ou fixer une résistance externe pour eux. Lorsqu'un interrupteur est fermé, il fait un trajet à la masse. Vous lisez une logique faible ou nulle lorsque cette voie est faite.

Vous pouvez voir d'autres arrangements où un interrupteur est connectée entre la broche d'entrée GPIO et 3V3, mais cela est déconseillé car les commutateurs sont normalement sur de longs fils. Routage longs fils reliés à la terre est moins risqué que de se connecter à une tension d'alimentation. Voici comment vous câbler un interrupteur.

image0.jpg

Bien que d'un commutateur à la terre avec une résistance de pull-up à une tension élevée peut lire que 1 ou 0, la plupart des commutateurs sont un peu plus complexe. Par exemple, prenez un sac de 1 livre de sucre et déposez-le à partir d'environ 6 pouces sur une surface dure comme une table. Il frappe la surface avec un bruit sourd et étapes. Maintenant, essayez la même chose avec une balle de ping-pong, et vous verrez qu'il rebondit. Le premier rebond de la balle de ping-pong est pas aussi élevé que la hauteur vous l'avez déposé à partir, mais il est assez élevé. Puis le ballon tombe et rebondit à nouveau, seulement 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 switch sont comme ça - ils sont des surfaces rigides se réunir rapidement, et ils rebondissent. Tant et si bien que si vous examinez les niveaux logiques du commutateur donne, vous verrez pas une simple transition d'un sommet à un faible, mais une succession de transitions plus en plus proche ensemble jusqu'à un niveau d'équilibre est atteint. Ceci est connu comme un bord sale ou rebond de contact.

image1.jpg




Ce changement rapide entre 0 et 1 peut être un problème si l'ordinateur est à la recherche au niveau du commutateur très rapidement. En fait, cela arrive beaucoup plus rapidement que l'utilisateur peut appuyer sur un bouton, mais parfois les circonstances ou code laisser cela se produire. Pour illustrer le problème, regardez le code suivant, brancher un interrupteur entre les GPIO 2 (broche 3) et la masse (broche 6). Cette broche a une résistance de rappel monté sur la planche.

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

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

Pour étudier cette profonde, vous devez mesurer l'intervalle entre les presses. Cela se fait avec le code suivant.

# # Mesure Bounce mesures temps de contact intervalle # Auteur: Mike Cookimport timeimport wiringpi2 que ioio.wiringPiSetupGpio () io.pinMode (2,0) # pour inputlastPress = io.digitalRead (2) count = 0startTime = time.time () = intervalle [0.0,0.0,0.0,0.0,0.0] print "tests bouton poussoir" while True: appuyez sur = io.digitalRead (2) si la presse == 0 et lastPress = appuyez sur: intervalle [count] = time.time () - startTimecount + = = 1startTime time.time () si le nombre de> = 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 du système et compte le nombre de secondes depuis le système démarré. En soustrayant l'heure du système à partir du moment de la presse actuelle, vous obtenez le temps écoulé depuis le dernier communiqué. Le résultat de l'exécution de ce programme est montré 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, 0,43523192405700684, ,4095041751861572] cinq presses [14,676625967025757, 0.24735713005065918,0.24397802352905273, 0,33951711654663086, ,34607601165771484]

Notez que le code ne fait aucune tentative pour réduire le nombre de bits significatifs dans les lectures, mais jeter un oeil de près certains d'entre eux, et vous verrez que certains extrémité avec un 05 e-. Telle est la façon de dire 10 à la puissance de -5- ceci est connu comme le format de l'exposant par défaut et est le chemin par défaut des numéros de 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 rien. Ceci est un exemple de rebond de contact. Vous ne voyez pas chaque rebond parce que l'ordinateur que des échantillons du niveau de la ligne à intervalles discrets logique.

La façon d'éviter cela est d'introduire un temps mort - qui est, d'ignorer le commutateur pour une durée déterminée après un communiqué de presse a eu lieu. À de nombreuses reprises, cela va se faire naturellement car vous pourriez avoir une déclaration d'impression ou un autre code qui prend un certain temps avant que le commutateur est regardé à nouveau. Si non, une solution simple serait d'ajouter un délai juste après le commutateur a été détecté afin que rien ne se fait pendant le temps de rebond potentiel.

Toutefois, pour l'ultime rebondissement, vous avez besoin de faire une note de l'heure d'une transition de l'interrupteur est détecté. Puis, quand une autre transition est détectée, ne traiter comme réel si un temps spécifique est écoulé entre la dernière transition réelle et l'heure actuelle. Un exemple de ceci est représenté dans le code suivant.

# Bounce Solution # Comment faire face à rebond # Auteur: Mike Cookimport timeimport wiringpi2 que ioio.wiringPiSetupGpio () io.pinMode (2,0) # pour inputlastPress = io.digitalRead (2) count = 0pressTime = time.time () print "bouton-poussoir d'essai" while True: appuyez sur = io.digitalRead (2) si la presse == 0 et lastPress = presse et (time.time () - pressTime)> 0,025: count + = = 1pressTime time.time () si compter> = 5: print "cinq presses" count = = 0lastPress presse

Voici le secret est le test supplémentaire dans la si déclaration qui vérifie ce qu 'au moins 25 millisecondes (ms) écoulée avant ont une transition est considérée comme vraie.

Différents types de commutateurs mécaniques rebondir à 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 des transitions "fantômes" à la lecture d'un interrupteur mécanique, il est susceptible d'être rebond de contact. Si oui, vous pouvez utiliser l'une des techniques décrites ici pour éliminer l'effet.


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