Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

sexta-feira, 18 de abril de 2014

Entendendo o RaspBerry GPIO: Piscando LED

A primeira aplicação que se faz quando se aprende a programar é chamada Hello World. Se estivéssemos aprendendo a programar em Python seria algo assim:

print("Hello World!")

Ao executar o programa, o resultado na tela é (dãããã!):

Hello World!

Nas plaquinhas estilo Arduino etc, como a gente não tem um monitor prá escrever Alô Mundo, temos que arrumar uma outra solução. Normalmente se usa um programa que pisque um LED, então o Hello World do Arduino é o Blink:

int led = 13;

void setup() {                
  pinMode(led, OUTPUT);     
}

void loop() {
  digitalWrite(led, HIGH);   
  delay(1000);               
  digitalWrite(led, LOW);    
  delay(1000);               
}

No Raspberry Pi, como temos uma tela para usar, podemos rodar o Hello World do Python. Acontece que, para aprendermos um pouco sobre automação com o Python, podemos usar a ideia do Blink, e é o que faremos.

Primeiro, vamos entender como o Python conecta-se a dispositivos como LEDs e motores.

Essa conexão se dá através de um modelo chamado GPIO (General Purpose Iput Output,  Entrada e Saída de Uso Geral).

Quando dizemos que algo tem GPIO, queremos dizer que esse "algo" pode se conectar com outros dispositivos através de uma tecnologia que é de uso geral, ou seja: essa conexão pode ser feita de múltiplas formas.

Essa conexão se dá através de portas, que nada mais são do que lugares onde se podem transmitir ou receber sinais elétricos. Nos nossos micros, por exemplo, temos portas USB às quais ligamos impressoras, mouses etc. Aqui o conceito é o mesmo, ou seja, o Raspberry possui um conjunto de pinos de metal onde podemos ligar fios que por sua vez podem ser ligados a dispositivos, sacou?

No Raspberry as portas estão localizadas numa das bordas da placa, como na figura abaixo:

Portas GPIO Raspberry Pi

A conexão às portas GPIO do Raspberry é feita através dos pinos indicados pelo círculo vermelho na imagem acima. Abaixo, em detalhe:


Observe que já temos dois fios conectados ao GPIO. Outro nome para esse troço é "baramento GPIO".
Como o GPIO do Raspberry é constituído de pinos, para conectarmos coisas nele precisamos de fios fêmea, ou seja com um buraquinho para ser encaixado no pino. Tem também um cabo que serve para conectar o barramento a uma protoboard, facilitando o uso do GPIO em circuitos, mas eu me esqueci de comprá-lo... Pode-se improvisar um cabo com um desses cabos (flat cables) de HD de micro desktop, dizem.

O "circuitim" a ser montado é o mais simples possível: um LED em série com um resistor entre 100 e 300 ohms, ligados dessa forma:


O fio verde se conecta a uma das pernas do resistor. A outra, por sua vez, está ligada na perna negativa (mais curta) do LED. A outra perna do LED está ligada ao fio marrom. Para quem não tem a manha ainda com o uso de protoboards (essa placa branquinha onde estão ligados LED etc), sugiro clicar aqui

Os fios marrom e verde estão ligados ao Arduino. Para escolhermos qual porta usar, temos que entender como as portas estão organizadas no barramento GPIO. Eu vi alguns diagramas na net errados, outros muito confusos, foi preciso procurar bem até achar esse cá:


Quem trabalha já com Arduino imediatamente observa que os pinos não estão dispostos numa ordem muito clara, ao contrário do Arduino, onde eles estão agrupados de acordo com a função.

Os pinos "verdes" são os GPIO propriamente ditos. Os outros são terra e alimentação, 5 e 3,3V. 

Observação importantíssima: O GPIO do Raspberry trabalha com 3,3V, o que é diferente da maioria dos Arduinos, que trabalham com 5V. Existe uma tendência do uso cada vez mais da tensão 3,3V em vez de 5V, mas o fato é que a maioria do que existe pronto em automação hoje em dia é 5V. Devemos sempre levar isso em consideração quando formos conectar coisas ao RasPi, porque se vc ligar algo 5V numa de suas portas GPIO o que pode acontecer de melhor é queimar a porta.

Alguns pinos GPIO tem também outros usos, por exemplo os pinos GPIO10, GPIO09 e GPIO011 também servem para comunicação SPI, mas isso foge do nosso escopo de hoje.

Vamos usar para o nosso blink o pino GPIO24 (pino 18), que vc pode localizar na figura acima. Ligue esse pino à perna do resistor que não está ligada ao LED. Conecte o pino GND indicado acima à perna negativa do LED, ou seja, à mais curta. Abaixo, a bagaça montada.

Agora, a programação:

Para fazer o "pograminha" usei a linguagem Python. Ela é a "melhor linguagem de programação da última semana", e ainda por cima já vem instalada no seu RasPi. Para acessarmos as portas GPIO do Arduino precisamos baixar da net e instalar as bibliotecas (programas auxiliares) que proporcionam esse acesso. Siga as instruções para instalação abaixo. Elas servem para quem usa a interface gráfica "padrão" do Pi com Raspbian instalado. Se vc tem um ambiente diferente deste, pode ser necessária alguma adaptação.

1) Baixe o arquivo daqui em um diretório do seu RasPi. 

2) Em seguida, descompacte-o. Para isso, vc pode usar o File Manager do RasPi, clicando com o botão direto em cima do bicho e selecionando a opção Extract To.

3) Por fim, abra uma janela LXTerminal, vá para o diretório onde vc descompactou o arquivo e execute:

sudo python setup.py install

Isso feito, execute o IDLE, interface gráfica do Python. Se vc rodar o IDLE 3 o ambiente será a versão 3.x no Python, se rodar o IDLE será a versão 2.7. O programa que fiz roda nas duas.

Clique em File\New e ponha lá o seguinte código:

import RPi.GPIO
import time

# A instrução abaixo diz que usaremos no programa os números das
# portas GPIO e não os números de ordem dos pinos na placa.
# Para usar os números dos pinos na placa é só trocar o 
# BCM abaixo para BOARD.
# Nesse caso terí­amos que usar 18 no lugar de 24 no programa
# abaixo.
# Essa instrução é obrigatória.
RPi.GPIO.setmode(RPi.GPIO.BCM)
# Ativa a porta GPIO24 (pino 18)
RPi.GPIO.setup(24, RPi.GPIO.OUT)
# pisca GPIO24
while(True):
        # Liga pino
        RPi.GPIO.output(24,RPi.GPIO.HIGH)
        # Espera 1 segundo
        time.sleep(1)
        # Desliga pino
        RPi.GPIO.output(24,RPi.GPIO.LOW)
        # Espera outro segundo
        time.sleep(1)
        
Em seguida pressione F5 e o programa será primeiro salvo, depois rodará. Para interrompê-lo, aperte Ctrl+C.

Se tudo está certo, vc deve obter o seguinte efeito:


É isso! Qualquer dúvida, entre em contato pelos comentários.