Como leio um botão no GPIO?

15

Eu me considerei fora desse tipo de coisa de nível iniciante há muito tempo, mas acho que não sou tão inteligente quanto pensei que era porque parece que estou tendo um nível excepcional de problemas com isso!

Então, finalmente terminei os exames e posso brincar com meu novo brinquedo, então a primeira coisa que fiz foi colocar uma tela de caracteres em LCD montada sobre o UART. Como eu não consegui resolver esse problema, estou tendo muita dificuldade para descobrir por que estou tendo tanta dificuldade com este botão!

Então, eu configurei um botão semelhante ao que se faria com um arduino; com um resistor de 1k conectado ao terra. Usei meu multímetro para garantir que o botão estivesse funcionando e produzindo a quantidade certa de energia. Eu SSH no meu shell, conecte o botão no pino GPIO 7 e entrei em python. Aqui está o que eu tentei:

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

Isso me dá um loop infinito, Falseindependentemente de como eu pressiono o botão. Eu tentei com isso GPIO.PUD_UPtambém e recebi um loop infinito True. Eu também tentei GPIO.PUD_OFFe consegui mais False.

Estou faltando alguma coisa aqui?

Michael
fonte
Então você tem o interruptor em série com o resistor de 1k para GND? Isso deve funcionar GPIO.PUD_UP. Com que voltagem você vê GPIO.PUD_UPo botão pressionado?
John La Rooy
Ligeiramente confuso; a que switch está conectado?
Alex Chamberlain
Olá Michael e bem-vindo ao Raspberry Pi ! Tomei a liberdade de mesclar suas duas contas. Obrigado!

Respostas:

6

Meu GPIO não tem pinout, tive que mudar parasetmode

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)

Desde que você está usando o GPIO.BOARDpino 7 é o rotulado GPIO 4(GPCLK0). Se você quis usar GPIO 7(CE1), você deve usar GPIO.setmode(GPIO.BCM)em vez

insira a descrição da imagem aqui

Testei o código tocando em um resistor de 1k de 3V3 PoweraGPIO 4(GPCLK0)

John La Rooy
fonte
Estou quase certo de que você está certo sobre por que não estava funcionando. Fiquei com a impressão de que GPIO.BOARDera para a pinagem do próprio quadro, como mostrado nas figuras, não para o esquema físico de numeração de pinos. Quando chegar em casa do trabalho, testarei e tenho certeza de que funcionará.
Michael
1

Eu nunca uso "pull_up_down = GPIO.PUD_DOWN" na configuração do pino. Tente o seguinte:

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

Como o gnibbler disse, verifique se o PinNum é para o BCM GPIO.

Mateus
fonte