Manual

do

Maker

.

com

Interrupções com Raspberry Pi

Interrupções com Raspberry Pi

Já escrevi alguns artigos sobre interrupção em diversos tipos de hardware porque sem dúvida, pode ser fundamental sua utilização em diversos casos. Nesse post de hoje vamos ver como utilizar interrupções no Raspberry e já com exemplo real de uso, pois a estrutura que criei de IoT com MQTT (que pode ser visto no post anterior a esse) tem como uma das funções abrir a porta remotamente, mas e quando se está do lado de dentro da casa? Não é necessário nesse caso abrir o app no smartphone, certo? Basta um botão que destrave a porta. Agora, lembra que a tranca da porta está sendo interrompida por um relé? Pois é, e eu não quero levar mais um fio até a porta nem fazer gambiarras pelo caminho.

Nesse projeto estou utilizando o RPi 2, portanto tenho um vasto barramento de GPIO e não me fará falta criar uma interrupção em um pino para abrir a porta. Ainda mais porque preciso dar 2 pulsos de 12v na fechadura e obviamente eu não tenho a menor vontade de fazer isso em um botão; no máximo, um toque - mas só até eu implementar algo com openCV.

Por isso, vamos ver o que é e como funciona uma interrupção e aplicá-la nesse projeto real que estou implementando e escrevendo a respeito.

Como os pinos de GPIO do Raspberry se comportam

Antes de iniciarmos, é necessário ter um pouco mais de intimidade com os pinos de GPIO porque eles são acima de tudo sensíveis (e não estou falando emocionalmente). Todos os pinos são 3.3v e NÃO são tolerantes a 5v. Esse é o primeiríssimo fator a levar em consideração quando se pretende utilizar com entrada.

INPUT ou OUTPUT

Não é uma boa prática drenar corrente de pinos de GPIO. O ideal é que quando utiliza-se um GPIO, ele faça o aterramento invés de alimentação. A tensão e corrente por sua vez devem vir de fonte externa. Todavia, se pretende utilizar o pino para alimentar algo, tenha em mente que a corrente não deve passar de 16mA. É muito importante que você preste atenção nisso que estou escrevendo agora. Um LED de 5mm usa 3v de tensão e até 25mA de corrente. Se você pegar um tutorial de arduino e for ligar o LED com um resistor de 330omhs, você vai queimar a porta.

O número de pinos de GPIO variam conforme o modelo e a tabela a seguir o ajudará  a identificar cada um deles. Esses pinos podem ser configurados como INPUT ou OUTPUT, nos níveis 0 ou 1.

Resumo: OUTPUT pode ser LOW (0v) ou HIGH (3.3v)

Já INPUT é onde você pode ter flutuação devido à leitura e tensão que pode variar conforme um evento externo. Calma que explico, primeiro pegue abaixo o pinout:

raspinout-1.webp

Os pinos de GPIO são referenciados por vezes como "PADS" no datasheet da BCM2835. Os pads são drivers CMOS de pull-up/pull-down configuráveis como enable/disable, output/input.

Power ON

Todos os pinos de GPIO se configuram como INPUT no reset e a maioria deles sao configurados como pull-up para proteção da MCU. Se você ligar um relé com LED de status por exemplo, poderá ver que ainda que não configurado como OUTPUT, o LED tende a estar aceso de modo bastante fraco.

As interrupções

E enfim, quando os GPIOs são configurados como INPUT, podem ser utilizados com o recurso de interrupção, portanto, se pretende utilizar um pino de GPIO para interrupção, não esqueça de colocá-lo em modo INPUT (veremos como fazê-lo por linha de comando).

Nesse caso, é possível configurar o estado desejado, sendo HIGH ou LOW, borda alta (RISING) ou borda baixa (FALLING) ou estado de borda assíncrona (apenas basta mudar a borda para gerar interrupção).

Para deixar claro, a interrupção por borda quer dizer que se você estiver esperando a queda de tensão em um pino que ainda não recebeu tensão, o que vai acontecer quando entrar tensão no pino é que o sistema esperará a nova mudança de estado, dessa vez esperando que a tensão seja removida do pino. Se estiver esperando borda alta, imediatamente ao sinal de tensão, a interrupção será gerada.

Como em qualquer tratamento de interrupções, a mudança de estado deve ser limpa por software.

Outras funções dos pinos

Repare na tabela que os pinos de GPIO tem outros recursos além de apenas sinalização, dentre as quais, I²C.

Fazendo interrupção com um botão

Agora chega de teoria e vamos brincar com Python. Tudo o que precisamos aqui são 2 jumpers e 1 botão para usarmos a interrupção no Raspberry. O "circuito" ficará como no desenho.

rpi-button.webp

Agora com pouquíssimas linhas de código já podemos ver  a interrupção acontecer. Perceba no post anterior que coloquei o código para atuar com a lâmpada e porta. Utilizei o GPIO21 para a lâmpada, que é basicamente o acionamento do relé. Mas você pode comprovar de outra maneira; coloque um LED de 3mm com um resistor de 330ohms no GPIO21 e GND relacionado e habilite o GPIO:

sudo su
echo 21 /sys/class/gpio/export
echo out >/sys/class/gpio/gpio21/direction
echo 0 >/sys/class/gpio/gpio21/value

Desse modo está garantido que o pino está configurado como saída e seu nível lógico nesse momento é LOW.

Instalar RPIO para manipular interrupções

A mágica se dará  por essa biblioteca do Python que tornará as coisas tão simples quanto possível. Porém, é quase certo que você precisará instalá-la previamente ao código. Se for o caso, não faça pelo pip, não deu nada certo. Faça clonando do git:

sudo su
apt-get install python-dev
apt-get install gcc
apt-get install git
git clone https://github.com/tylerwowen/RPIO.git
cd RPIO
python setup.py install

Agora vamos utilizar o GPIO3 (pino 5, mas você deve indicar o GPIO, não o pino) para receber a interrupção do botão como no desenho acima. O código para isso é o que segue:

#!/usr/bin/env python
import RPIO
#definir a funcao de callback
def gpio_callback(gpio_id, value):
   print("Deu certo")

#adicionar a interrupcao
RPIO.add_interrupt_callback(3, gpio_callback, edge='falling', pull_up_down=RPIO.PUD_UP, threaded_callback=True, debounce_timeout_ms=0)
#colocar a interrupcao em loop
RPIO.wait_for_interrupts()

Pronto, isso é tudo o que você precisa para tratar interrupções no RPi e com esse código de exemplo você já consegue testar sem LED mesmo, basta olhar no console em que chamar o script Python.

Eu me recuso a fazer um video apertando o botão. Sugiro que você faça o teste ai. Eu já estou me divertindo, abrindo e fechando a porta sem nenhuma razão compreensivel para os vizinhos!

Documentação do RPIO

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.