Al reconocer y hacer frente a rebote de contacto en la frambuesa pi

Es posible que tenga que hacer frente a rebote de contacto para su próximo proyecto Raspberry Pi. La lectura de un interruptor es bastante simple. Se devuelve un 0 o un 1, dependiendo de si se pulsa el interruptor. Interruptores siempre deben estar conectados entre la entrada de propósito general / salida (GPIO) pin de entrada y tierra y, o bien permitir que la resistencia interna de pull-up o fijar una resistencia externa a ellos. Cuando un interruptor está cerrado, tiene una trayectoria a tierra. Lees un lógico bajo o cero cuando se hace este camino.

Usted puede ver otras disposiciones en las que se conecta un interruptor entre el pin de entrada GPIO y 3V3, pero esto no es recomendable porque los interruptores están normalmente en los cables largos. Enrutamiento de cables largos conectados a tierra es menos arriesgado que la conexión a una tensión de alimentación. Así es como se cablea un interruptor.

Aunque el cambio a tierra con una resistencia pull-up a un alto voltaje puede leer sólo el 1 ó 0, la mayoría de los interruptores son un poco más complejo. Por ejemplo, tome una bolsa de 1-libra de azúcar y soltarlo desde aproximadamente 6 pulgadas sobre una superficie dura, como una mesa. Se llega a la superficie con un ruido sordo y se detiene. Ahora intentar hacer lo mismo con una pelota de ping-pong, y usted&rsquo-ll ver que rebote. El primer bote de la ISN pelota de ping pong&rsquo-t tan alto como la altura que ha caído desde, pero&rsquo-s bastante alto. A continuación, la bola cae y rebota de nuevo, sólo ligeramente inferior. Esto continúa con alturas de rebote cada vez más pequeños hasta que la bola se detiene. Tenga en cuenta que cuanto menor es el rebote, menor será el tiempo entre bounces- los rebotes aceleran hasta que la bola se detiene.

Los contactos del interruptor son como eso -&rsquo-re superficies rígidas que se unen rápidamente, y rebotar. Tanto es así que si se examinan los niveles de la lógica del interruptor da hacia fuera, usted&rsquo-ll no ver una transición sencilla desde un máximo a un mínimo, pero una sucesión de transiciones cada vez más cerca juntos hasta un nivel de equilibrio se alcanza. Esto se conoce como un borde sucio o rebote de contacto.

Este rápido cambio de 0 a 1 puede ser un problema si el equipo está mirando el interruptor muy rápidamente. De hecho, esto ocurre mucho más rápidamente que un usuario puede pulsar un botón, pero a veces las circunstancias o código permitir que esto suceda. Para ilustrar el problema, mira el siguiente código, conectar un interruptor entre GPIO 2 (pin 3) y tierra (pin 6). Este pin tiene una resistencia pull-up montado en el tablero.

# Rebote Problema muestra rebote de contacto # Autor: Mike Cookimport timeimport wiringpi2 como ioio.wiringPiSetupGpio () io.pinMode (2,0) # para inputlastPress = io.digitalRead (2) count = = 0pressTime time.time () print"pruebas de botón pulsador"while True: pulse = io.digitalRead (2) si la prensa == 0 y lastPress = prensa: cuenta + = = 1pressTime time.time (si el recuento) gt; = 5: print"cinco prensas"count = = 0lastPress de prensa

La técnica utilizada aquí es para contar cinco prensas de conmutación y luego imprimir cuando el equipo los ha contado. Si intenta esto, es posible que imprime que ha detectado cinco prensas después de cuatro o incluso tres prensas, así como cada cinco. En resumen, es poco fiable ya que el contacto de rebote está causando recuentos erróneos.

Para investigar esto más profundo, es necesario medir el intervalo entre las pulsaciones. Esto se hace con el código siguiente.

# Rebote métrica # medidas intervalo de tiempo de contacto # Autor: Mike Cookimport timeimport wiringpi2 como ioio.wiringPiSetupGpio () io.pinMode (2,0) # para inputlastPress = io.digitalRead intervalo (2) count = = 0startTime time.time () = [0.0,0.0,0.0,0.0,0.0] de impresión"pruebas de botón pulsador"while True: pulse = io.digitalRead (2) si la prensa == 0 y lastPress = prensa: intervalo [count] = time.time () - startTimecount + = = 1startTime time.time () si el recuento gt; = 5: print"cinco prensas ", IntervalCount = 0startTime = time.time () lastPress = prensa

El intervalo entre cada pulsación del interruptor se registra en una lista. Esto se deriva de la del reloj de tiempo del sistema y cuenta el número de segundos desde que el sistema arranca. Restando la hora del sistema desde el momento de la prensa actual, se obtiene el tiempo transcurrido desde la última pulsación. El resultado de la ejecución de este programa se muestra aquí:

cinco prensas [1.2872810363769531, 0.25738978385925293,6.198883056640625e-05, ,27149009704589844, 6.699562072753906e-05] cinco prensas [2.247836112976074, 0.31453490257263184,0.32202887535095215, 0.2885620594024658, 0.33057308197021484] cinco prensas [1.048125982284546, 3.504753112792969e-05,0.5636959075927734, 0.43523192405700684, ,4095041751861572] cinco prensas [14,676625967025757, 0.24735713005065918,0.24397802352905273, ,33951711654663086, ,34607601165771484]

Observe que el código no hace ningún intento de reducir el número de bits significativos en las lecturas, pero tener un vistazo de cerca a algunos de ellos, y usted&rsquo-ll ver que algunos terminan con una E-05. Esa es la forma por defecto de decir 10 a la potencia de -5- esto se conoce como el formato y el exponente es la forma predeterminada números de punto flotante se muestran en la mayor parte de la computación. Por lo tanto, olvidar el número ridícula de posiciones después del punto decimal, este número, 6.12e-05, se interpreta como 0.0000612 o 61,2 microsegundos (US), lo cual es mucho más rápido que cualquier ser humano puede presionar nada. Este es un ejemplo de rebote de contacto. usted don&rsquo-t ver cada rebote porque el equipo sólo muestras el nivel lógico de la línea a intervalos discretos.

La manera de evitar que esto suceda es la introducción de un tiempo muerto - es decir, ignorar el interruptor por un tiempo específico después de haberse producido una prensa. En muchas ocasiones, esto va a suceder de forma natural, ya que podría tener una sentencia de impresión o algún otro código que toma un poco de tiempo antes de que el interruptor se mira de nuevo. Si no es así, una solución simple sería añadir un retraso justo después el interruptor se ha detectado de manera que no se hace nada durante el tiempo potencial de rebote.

Sin embargo, para la eliminación de rebote último, es necesario hacer una nota de la vez que se detecta una transición de conmutación. Luego, cuando se detecta otra transición, sólo se tratan como real si ha transcurrido un tiempo específico entre la última transición real y el momento actual. Un ejemplo de esto se muestra en el siguiente código.

# Rebote Solución # Cómo hacer frente a rebote # Autor: Mike Cookimport timeimport wiringpi2 como ioio.wiringPiSetupGpio () io.pinMode (2,0) # para inputlastPress = io.digitalRead (2) count = = 0pressTime time.time () print"pruebas de botón pulsador"while True: pulse = io.digitalRead (2) si la prensa == 0 y lastPress = pulse y (time.time () - Presstime) gt; 0,025: cuenta + = = 1pressTime time.time () si el recuento gt; = 5: print"cinco prensas"count = = 0lastPress de prensa

Aquí el secreto es la prueba adicional en el Si declaración que comprueba que han transcurrido al menos 25 milisegundos (ms) antes de una transición se toma como real.

Video: Instalar Webcam no Raspberry Pi - Sensor de movimento #8

Los diferentes tipos de interruptores mecánicos rebotan en un grado diferente. Dependiendo de exactamente lo que su código es y qué tan rápido se ejecuta, esto puede o no ser un problema. Si lo hace la experiencia &ldquo-fantasma&rdquo- transiciones en la lectura de un interruptor mecánico,&rsquo-s probable que sea rebote de contacto. Si es así, puede utilizar una de las técnicas descritas aquí para eliminar el efecto.

Artículos Relacionados