Interrupções com Raspberry Pi

interrupções
interrupções

Introdução  às Interrupções

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:

Pinagem de todos os modelos
Pinagem de todos os modelos

 

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.

Conexão do botão ao GND e GPIO relacionado
Conexão do botão ao GND e GPIO relacionado

 

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:

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:

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:




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 newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Próximo post a caminho!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Um comentário em “Interrupções com Raspberry Pi

Deixe uma resposta