Guia 3 - Controlando um LED com um botão
Guia 3 - Controlando um LED com um botão
Para que você possa contribuir com a Labrador, ou conduzir projetos em sala de aula, preparamos uma série de materiais que facilitarão o desenvolvimento
de soluções que envolvem a programação de sistemas embarcados.
Introdução
Neste documento você encontra o passo a passo para aprimorarmos o projeto que iniciamos no Guia 2 - Programando um LED com a Labrador. Para isso,
utilizaremos a Linguagem de Programação Python, com os recursos disponibilizados na Caninos SDK. No Guia 2, verificamos como podemos
controlar as GPIOs para garantir que seja possível enviar sinais digitais para o mundo real, por meio do uso de um LED.
Neste Guia adaptaremos nossa solução anterior para que seja possível incluir um botão no processo de controle de um LED, fazendo com que ao invés
de controlarmos diretamente o LED, sejamos capazes de garantir que o LED acenda sempre que um botão for pressionado, ou apague sempre que este
botão não esteja pressionado.
Ao final deste experimento você será capaz de:
1. Ligar e Desligar um LED utilizando um botão
2. Realizar a leitura de um botão utilizando a Linguagem de Programação Python
3. Programar uma GPIO, lendo um sinal digital em uma porta de sua escolha
Descrição do Experimento
Quando programamos nosso LED, utilizamos o pin18 para controlar os estados de "ligado" ou "desligado" de acordo com uma rotina lógica que
pré-estabelecemos. Neste experimento vamos adaptar a solução anterior, para que seja possível ligar um LED sempre que um Botão for pressionado,
ou apagar o mesmo LED sempre que o Botão não estiver pressionado.
Observação I:
Para programar as GPIOs, será necessário executar o Código 1 toda vez que você reiniciar a sua placa.
Código 1. Definição de permissões para o uso das GPIOs:
sudo chown caninos /dev/gpiochip*
sudo chmod g+rw /dev/gpiochip*
Observação II:
Execute o Código 2 no terminal antes de começar a desenvolver novas soluções com sua labrador.
Código 2. Instalação da biblioteca gpiod:
pip install "gpiod==1.5.4"
Desta forma, você deverá:
1. Incluir no circuito do Guia 2 um botão, garantindo que:
- O circuito necessário para conectá-lo junto a labrador seja adequadamente montado e;
- pin18 seja a gpio utilizada para a leitura deste botão.
2. Em seguida, você deve escrever um código em Python, utilizando a gpiod, para que o LED acenda sempre que o botão seja
pressionado, ou para que o LED apague enquanto o botão não estiver pressionado.
Discutindo a montagem do circuito

Para lhe auxiliar no processo de montagem, utilize as portas destacadas na Figura 1. Esta figura consiste em um mapeamento de cada uma das GPIOs
disponíveis na sua placa Labrador. Na hora de montar o seu circuito revise pelo menos duas vezes!
Discutindo a montagem do programa
Para programarmos a Labrador em Python precisaremos importar a Caninos SDK. Esta biblioteca foi desenvolvida para que possamos programar de forma mais
simples nossa labrador, e desenvolver projetos compartilháveis.
Após isso, precisamos criar uma variável para acessar os recursos da placa Labrador e em seguida, habilitar a GPIO (pin15) que deverá ser
definido como uma porta de entrada. Veja o Código 3.
Código 3. Criando uma variável chip para controlar o pin15:
chip = gpiod.chip('/dev/gpiochip2')
led = chip.get_line(4)
Note que de acordo com o Código 3 realizamos duas operações distintas. A primeira, conforme explicado no Guia 2, permite definir o chip que estamos usando.
Já a segunda, nos permite definir que a variável led, está associado à linha 4.
Código 4. Configurando as requisições para o led:
config_led = gpiod.line_request()
config_led.consumer = "led"
config_led.request_type = gpiod.line_request.DIRECTION_OUTPUT
led.request(config_led)
Agora fazemos o mesmo para o botão, o pino 18 é o GPIOC6, onde o chip é o mesmo do led e a linha é a 6:
button = chip.get_line(6)
config_button = gpiod.line_request()
config_button.consumer = "button"
config_button.request_type = gpiod.line_request.DIRECTION_INPUT
button.request(config_button)
Montagem do circuito
Quando elaboramos um projeto que envolve o uso de microcontroladores é importante identificarmos que dois projetos distintos devem ser realizados (i) para a montagem dos recursos físicos do projeto (hardware) e (ii) a montagem do código de programação que permitirá o controle e acesso aos recursos disponibilizados pelo projeto físico.
O projeto físico neste experimento consiste em acender um LED utilizando a labrador como controlador, e permitindo que toda vez que um botão for pressionado um LED acenda. Nesta montagem especificamos uma GPIO para sinal de referência GND, uma GPIO (pin18) para conexão com o LED e uma GPIO (pin18) para conexão do botão.
Veja a Figura 2 para observar a montagem do circuito que incluí o botão que será acessado durante nosso experimento.

Na Figura 2 adicionamos ao nosso circuito um botão. Em um dos terminais de entrada do botão conectamos o sinal de 5V da Labrador, e no outro, adicionamos um resistor, que estará em série com o sinal GND (para garantir estabilidade do botão). Na extremidade de saída, conectamos o terminal com a GPIO da labrador (pin18). Para que este circuito seja otimizado, também alteramos a montagem do LED, garantindo que o sinal de 5V seja transmitido a uma trilha de acesso comum da protoboard, para que assim, possa ser distribuído por todos os componentes tanto quanto necessário. Fazemos o mesmo com o GND.
import gpiod
chip = gpiod.chip('/dev/gpiochip2') # define o grupo da GPIO que está sendo usada
led = chip.get_line(4) # define o número da GPIO que está sendo usada para o led
button = chip.get_line(6) # define o número da GPIO que está sendo usada para o botão
# configuração da requisição
config_led = gpiod.line_request()
config_led.consumer = "led"
config_led.request_type = gpiod.line_request.DIRECTION_OUTPUT # configura o pino como saída
led.request(config_led) # aplica as configurações para a requisição do LED
config_button = gpiod.line_request()
config_button.consumer = "button"
config_button.request_type = gpiod.line_request.DIRECTION_INPUT # configura o pino como entrada
button.request(config_button) #aplica as configurações para a requisição do botão
while(1): # loop infinito
button_state = button.get_value() # a cada iteração do loop, pega o valor do botão
if button_state==1: # verifica o valor do botão
led.set_value(1) # se o valor do botão for 1, liga o led
else:
led.set_value(0) # se não, desliga