¿Cómo leo un botón a través de GPIO?

15

Me consideré fuera de este tipo de cosas de nivel principiante hace mucho tiempo, pero supongo que no soy tan inteligente como pensaba que era porque ¡parece que tengo un nivel excepcional de problemas con eso!

Así que finalmente terminé los exámenes y puedo jugar con mi nuevo juguete, así que lo primero que hice fue obtener una pantalla LCD de caracteres montada sobre UART. ¡Eso funcionó sin problemas, por lo que me cuesta mucho entender por qué me cuesta tanto trabajo con este botón!

Así que configuré un botón similar al que se haría con un arduino; con una resistencia de 1k conectada a tierra. Utilicé mi multímetro para asegurarme de que el botón funcionaba y de producir la cantidad correcta de energía, que es. Me conecté a SSH en mi shell, conecté el botón al pin 7 de GPIO y entré a Python. Esto es lo que probé:

GPIO.pinout(GPIO.BOARD)
GPIO.setup(7,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
while 1==1:
    inputval = GPIO.input(7)
    print inputval

Esto me da un bucle interminable, Falseindependientemente de cómo presione el botón. También lo probé GPIO.PUD_UPy obtuve un bucle interminable True. También lo probé GPIO.PUD_OFFy obtuve más False.

¿Me estoy perdiendo de algo?

Miguel
fuente
Entonces, ¿tiene el interruptor en serie con la resistencia de 1k a GND? Eso debería funcionar con GPIO.PUD_UP. ¿Qué voltaje ves con GPIO.PUD_UPencendido y el botón presionado?
John La Rooy
Ligeramente confundido; ¿A qué está conectado el interruptor?
Alex Chamberlain
Hola Michael y bienvenido a Raspberry Pi ! Me he tomado la libertad de fusionar tus dos cuentas. ¡Gracias!

Respuestas:

6

Mi GPIO no tiene pinout, tuve que cambiarlo asetmode

import time
from RPi import GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
    inputval = GPIO.input(7)
    print inputval
    time.sleep(1)

Como estás usando el GPIO.BOARDpin 7, es el que está etiquetado GPIO 4(GPCLK0). Si pretendía usar GPIO 7(CE1), debe usar GPIO.setmode(GPIO.BCM)en su lugar

ingrese la descripción de la imagen aquí

Probé el código tocando una resistencia de 1k de 3V3 PoweraGPIO 4(GPCLK0)

John La Rooy
fuente
Estoy casi seguro de que tienes razón sobre por qué no estaba funcionando. Tenía la impresión de que GPIO.BOARDera por el pinout del tablero como se muestra en las imágenes, no por el esquema de numeración física del pin. Cuando llegue a casa del trabajo lo probaré y estoy seguro de que funcionará.
Michael
1

Nunca uso "pull_up_down = GPIO.PUD_DOWN" en la configuración del pin. Prueba esto:

GPIO.setmode(GPIO.BCM)
GPIO.setup(PinNum,GPIO.IN)
while 1==1:
    if GPIO.input(PinNum)==1:
        print "True"
    else:
        print "False"

Como dijo gnibbler, asegúrese de que PinNum sea para el GPIO BCM.

Mateo
fuente