Como acender LEDs e criar um game de Roleta no Raspberry Pi

O que é a Computação Física?

A computação física é esta conexão entre aplicações construídas no mundo virtual (softwares) e sua respectiva interação com o mundo real/físico (hardware). Normalmente se dá através de sensores e atuadores que captam e respondem com o contexto ao seu redor.

img_1940

Apesar de ser um termo atual, a interação entre hardware e software é algo natural e nos rodeia a todo instante, porém com o boom de aplicativos de celular, esta conexão com o mundo real, em nível de experimentação, hobby e aprendizagem, acabou ficando deixada de lado.

O movimento IoT (Internet das Coisas), os computadore de baixo custo e alta performance como o Raspberry Pi, Arduínos e outros, vem povoando a mídia e trazendo novas idéias e utilizações para este velhos conceitos.

Vamos experimentar então um pouco deste potencial com nosso Raspberry Pi 3.

Interface de Entradas e Saídas do Raspberry Pi 3: GPIO

Se você ainda não configurou seu RPi 3 para o trabalho sugiro ler/assistir o nosso primeiro capítulo do canal: 01 # Iniciando com o Raspberry Pi 3

O Raspberry Pi 3 possui 40 pinos denominados de GPIO (General Purpose Input e Output) para fazer as conexões com o mundo exterior… veja abaixo onde estão localizadas.

rpi3-detalhe
GPIO e outros componentes do Raspberry Pi 3

A identificação de cada um dos pinos está abaixo, sendo que existem normalmente 2 referências a cada GPIO:

  1.  Número do Pino (Pin#): Refere-se ao número físico do pino na placa
  2. Nome GPIO (Name): Refere-se a uma nomenclatura específica do frabicante Broadcom para os pinos do GPIO

raspberry_pi3_gpio

Sobre os Pinos de Energia: 5V e 3.3V

Os pinos de 5V e 3.3V são interconectados com a fonte, portanto, se você tiver alimentando através do micro USB seu RPi, este pinos passam a fornecer estas tensão e corrente que pode ser utilizada em seus projetos, porém limitando a 750mA para a saída de 5V e 60mA para a saída de 3.3Vm por segurança. Também é possível alimentar o Raspberry Pi através do pino de 5V e inversamente a saída MicroUSB passará a ter 5V em seus terminais.

O Raspberry Pi não deve ser alimentado em ambos os modos simultâneamente: através do Micro USB somado aos pinos de 5V.

Você pode alimentá-lo através do 3.3V, porém não conseguirá suprir 5V necessário para as portas USB e interfaces que fazem uso desta tensão, portanto não sugiro fazê-lo a menos que seja um projeto bem específico.

O que eu preciso para começar?

Os itens que precisam estar sobre a mesa antes de você começar são:

  • Raspberry Pi 3 + MicroSD contendo sistema operacional Debian Linux Jessie com Pixel
  • Monitor HDMI + cabo para conexão ao Raspberry Pi
  • Teclado e Mouse (sem ou com fio)
  • Breadboard / Protoboard pequeno
  • Cabos (ou jumpers) para conexão no protoboard (Macho-Fêmea e alguns Macho-Macho)
  • 1 Push-button
  • 3 Leds brancos (podem ser coloridos da sua cor de preferência)
  • 3 Leds RGB endereçaveis
  • 6 Resistores de 1 Kohms (pode comprar já uma porção, pois é barato e vamos precisar)
fullsizerender
Kit Básico: Pushbutton, Leds, Leds RGB e Resistor de 1KOhm
s_766115-mlb25188712314_112016-o
Cabos para Protoboard Macho-Fêmea
0000164_half-size-solderless-breadboard
Protoboard Exemplo

Obs: Não irei abordar os temas sobre o funcionamento de protoboard ou solda de fios, apenas sigam reliogiosamente as instruções de onde ligar o que e tudo dará certo.

O protoboard possui ligações internas nos seguintes formatos:

basic_breadboard_layout
Esquema interno de ligações

Normalmente utilizamos as seguintes conexões de energia:

  • Fio de um furo da linha azul até o GROUND (terra) da GPIO (exemplo pino 6)
  • Fio de um furo da linha vermelha até o 5V da GPIO (exemplo pino 2 ou 4)

As linhas pretas internas é onde estarão montados os circuitos lembrando que todos os furos na vertical estão interconectados.

O primeiro LED a gente nunca esquece!

Vamos então colocar a mão na massa  nos fios e fazer nosso primeiro LED acender… apesar de simples a satisfação é imensa, kkk!!

As ligações no protoboard

Conecte os fios seguindo o esquemático apresentado e confira com a minha montagem.

1led
Esquemático: O primeiro LED a gente nunca esquece!
img_1922
Minha montagem no Raspberry Pi 3

Importante perceber que a “perna” maior do LED deverá estar em contato com o pino GPIO14 do Raspberry Pi 3 enquanto a “perna” menor fica em contato (na mesma trilha) do resistor.

Tudo conectado e Raspberry Pi 3 em funcionamento, iremos abrir uma interface excelente para experimentações diversar no Raspbian.

Menu Incial >> Desenvolvimento >> Python 3 (IDLE)

É um ambiente de compilação ‘real time’ de Python, onde cada linha é executada na medida que teclamos o . Para nossa primeira incursão está excelente.

Python é uma linguagem muito simples de entender e limpa, o que torna minha linguagem oficial para ‘quase’ tudo que faremos aqui no 5 Min Maker.

Ao abrir a janela digite o código abaixo (vamos entender passo a passo):

from gpiozero import LED
meuLed = LED(14)

Linha-a-Linha:

  1. Vamos importar da biblioteca GPIOZERO um tipo de objeto genérico chamado LED que possui diversas funcionalidades
  2. Importarm
  3. Criamos o nosso próprio objeto e chamamos de meuLed e vamos fazer dele uma cópia do objeto genérico LED porém informando durante este cópia que utilizaremos este objeto na porta GPIO14.

Agora com nosso objeto próprio ‘meuLed’ poderemos utilizar as seguintes funcionalidades:

  • Ligar | on
  • Desligar | off
  • Piscar | blink
  • Inverter | Toogle
  • Verificar se está acesso | is_lit
  • Pin | verificar em qual pino está plugado

Então vamos ligá-lo e colocar fim a nossa ansiedade antes de falarmos de todo o resto.

Digite e tecle enter para acender:


meuLed.on()

E para apagar digite e tecle enter em:


meuLed.off()

Ok muito simples, mas veja a alegria da criança! kkk!

A documentação completa de como utilizar cada funcionalidade da biblioteca GPIOZERO está aqui: https://gpiozero.readthedocs.io/en/v1.3.1/api_output.html

img_1923
Objetivo maior na vida: a LUZ!

Meu primeiro GAME com Computação Física em Python!!

Para elevarmos nosso espírito ainda mais, vamos partir para escrever um programa em Python ao invés de apenas utilizarmos o shell (linha de comando) do IDLE.

Para escrever este programa, dentro do Python Shell, vá em FILE >> NEW FILE e abrirá uma janela para nosso código.

Porém antes de iniciarmos nosso código, vamos adicionar mais 4 LEDs em nosso protoboard, ficando desta forma:

Experimentar colocar os LEDs em portas diferentes para testar os conhecimentos sobre as GPIOs e sobre o software:

img_1924
More LEDs, more FUN!

E agora as seguintes linhas de código:

from gpiozero import LED

led_01 = LED(14)
led_02 = LED(15)
led_03 = LED(18)
led_04 = LED(23)
led_05 = LED(24)

t = 0.01

for i in range(100):
   led_01.blink(t,t,1,False)
   led_02.blink(t,t,1,False)
   led_03.blink(t,t,1,False)
   led_04.blink(t,t,1,False)
   led_05.blink(t,t,1,False)

Com este código veremos os leds piscarem em ordem num intervalo de tempo de 0,02 segundos cada um, pois cada led irá demorar 0,01 segundo acesso e 0,01 segundo apagado e isto se repetirá por 100 vezes.

Apenas para deixar claro os parâmetros (na sequência que estão no código) utilizados na função blink():

  • t : o led ficará t segundos ligado
  • t : o led ficará t segundos desligado
  • 1 : o led piscará apenas uma vez
  • False : só irá passar para a próxima instrução após o led completar uma sequência de piscagem

Para nosso game precisaremos de um botão, então…

O primeiro BOTÃO!

Agora iremos incrementar no nosso esquemático protoboard o botão conectado da seguinte forma: um lado no “Ground” e outro na GPIO21.

untitled-sketch_bb
Esquemático completo
img_1925
Como ficou a montagem final

 

Devemos instruir ao RPi (via código) que esta GPIO21 vou interpretar como sendo um botão (elemento de entrada), portanto o código ficará:


from gpiozero import LED
from gpiozero import Button

#vamos identificar o "meu botão" como sendo a GPIO 21
botao = Button(21)

led_01 = LED(14)
led_02 = LED(15)
led_03 = LED(18)
led_04 = LED(23)
led_05 = LED(24)

print("Roda o pião... Roda o pião, apertando o botão!")

botao.wait_for_press()

print("Va....")

botao.wait_for_release()

print("Va...Valeeeenndo!!")

t = 0.5

while (botao.is_pressed is not True):
   led_01.blink(t,t,1,False)
   led_02.blink(t,t,1,False)
   led_03.blink(t,t,1,False)
   led_04.blink(t,t,1,False)
   led_05.blink(t,t,1,False)

print("Agora Parou!")

Passo a passo o que construímos foi:

  • Identificamos o botão com o comando botao = Button(21)
  • Pedimos para que ele esperasse ser pressionado com o comando botao.wait_for_press()
  • Depois requisitamos que ele esperasse ser liberado com o comando botao.wait_for_release(), desta forma garantindo que um ciclo de “aperta e solta” seja completo sem problemas
  • Montamos um laço While  que roda infinitamente até que o botão seja pressionado, isto será identificado pelo campo botao.is_pressed, que receberá o valor True na condição de botão pressionado.

 

Código completo do nosso Roletrando!! Ahhaii..

O jogo exemplo ‘Roletrando’ funciona da seguinte maneira:

  1. Aperte e solte o botão 1 vez para que as luzes pisquem como se fosse o girar de uma roleta
  2. A roleta permanecerá girando infinitamente até que o botão seja novamente pressionado
  3. A velocidade das piscadas diminui, simulando a inércia natural de uma roleta
  4. Em algum momento a roleta para e a luz correspondente a posição sorteada pisca algumas vezes antes de ficar fixa
  5. O jogo pode ser disparado novamente com o pressionar do mesmo botão

Segue o código completo.

<ATENÇÃO AOS RECÉM CHEGADOS EM PYTHON>

Python tem como parte de sua sintaxe as identações e espaçamentos para compreensão de quais grupos de funções estão associadas aos seus laços lógicos e condicionais. Copie o código e assegure que os espaçamentos estejam todos ok!

Vou deixar como comentário no código para que serve cada parte.

**Obs: se por acaso no código abaixo encontrarem os os caracteres ‘&gt;’, por favor substituam pelo sinal de maior ‘>’.

#
# 1. Importar as bibliotecas das funções necessárias
#
from gpiozero import LED    # saídas Digitais
from gpiozero import Button # entradas Digitais
import math                 # Funções de matemática
from random import randint  # funções de geração de números aleatórios

#
# 2. Configuração dos botões e LEDs utilizados neste programa
#
botao = Button(21)                                 # 1 botão na porta GPIO21
led = [LED(14), LED(15),LED(18), LED(23), LED(24)] # 5 leds nas portas indicadas

#
# 3. Ciclo infinito que faz o jogo nunca terminar
#    (CTRL+Z para terminar o processo)
while (1):
   #
   # 3.1 Aguarda o botão ser pressionado E liberado para começar a girar os LEDs
   #
   print("** Rode o pião apertando o BOTÃO! **")
   botao.wait_for_press()     # Aguarda o botão ser pressionado...
   print("Va....")
   botao.wait_for_release()   # ...e depois aguarda ser solto para continuar
   print("Va...Valeeeenndo!!")

   #
   # 3.2 Inicia loop que gira LEDs até que o botão seja novamente pressionado
   #
   print("*** Quando quiser parar aperte novamente o botão ***")
   t = 0.01   # tempo inicial de todas os LEDs para on e off
   i = 0
   while (botao.is_pressed is not True):   # esperao o botão ser pressionado
          led[i].blink(t,t,1,False)
          i = i + 1
          if(i > 4):
               i = 0

   print("Agora vai parar... vai parar... ah agora vai.. vai parar...")
roletrando = True        # quando False indica que a roleta parou
   sorteio = randint(0,5)   # sorteia um numero de 0 a 4 (correspondente ao LED)
#
# 3.3 Reduz as velocidades para cada LED que acende
#
i = 0
   while (roletrando):   # enquanto estiver girando continue a calcular
     t = math.exp(t)-1   # faz com que o aumento do tempo seja exponencial
     if (t > 1.5):
         t = 1.5
     if(t > 0.5 and sorteio == i):
             roletrando = False
     else:
             led[i].blink(t,t,1,False)
             if(i == 4):
                   i =0
             else:
                   i = i + 1
#
# 4. LED sorteado pisca e depois permanece acesso até novo sorteio
#
   led[i].blink(0.1,0.1,5,False)
   led[i].on()
   print("...paaaroooouuuuu!!!")

 

DC


 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s