Guia 4 - Controlando um LED por PWM

De Caninos Loucos
Ir para navegação Ir para pesquisar

Guia 4 - Controlando um LED por PWM

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.

Neste quarto guia, você aprenderá a controlar um LED com um sinal PWM, para isso, utilize o Guia 4 disponibilizado abaixo:

Guia 4

Observações gerais

  • Pré-Requisito: "Guia 2 - Programando um LED com a Labrador"

Introdução

Neste documento você encontra o passo a passo para explorar uma variação para implementação que você fez 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 a solução anterior para que seja possível controlar um LED por meio de um sinal PWM. Este processo permitirá, por exemplo, que alteremos o intervalo de tempo no qual um sinal digital é enviado para nossa GPIO, para que seja possivel reproduzir um comportamento de variação de intensidade do sinal luminoso em nosso LED.

Ao final deste experimento você será capaz de:

1. Ligar e Desligar um LED utilizando Linguagem de Programação Python 2. Programar uma GPIO, escrevendo um sinal PWM na porta de sua escolha

Observação 1

Para programar as GPIOs, enquanto a Caninos SDK estiver em modo de desenvolvimento, será necessário executar o Código 1 toda vez que você reiniciar a sua placa.

   sudo chown caninos /dev/gpiochip*
   sudo chmod g+rw /dev/gpiochip*

Código 1. Definição de permissões para o uso das GPIOs

Observação 2

Sempre mantenha a biblioteca atualizada, para isso, execute o Código 2 no terminal antes de começar a desenvolver novas soluções com sua labrador.

   pip3 install -U caninos-sdk

Código 2. Definição de permissões para o uso das GPIOs

Componentes necessários

  • 1 Placa Labrador de 32 bits
  • 1 LED
  • 1 Resistor de 330 Ω
  • 2 Cabos MxF

Descrição do experimento

Quando programamos nosso LED, utilizamos o pin15 para controlar os estados de "ligado" ou "desligado" de acordo com uma rotina lógica que pré-estabelecemos. Neste experimento vamos realizar uma alteração no código de programação do nosso LED para que seja possível controlar a intensidade de sinal que será enviada para nossa GPIO.

O PWM, do inglês ​​Pulse Width Modulation, significa modulação por largura de pulso e consiste em uma técnica utilizada na elaboração de projetos que envolvem sistemas digitais para variar o valor de uma onda, em função de um intervalo de tempo.

Para isso, mantemos a frequência de uma onda quadrada fixa (quão rápido um ciclo completo será percorrido), e alteramos a quantidade de tempo em que um sinal digital ALTO será enviado para nossa GPIO. Veja a Figura 1, ela ilustra dois cenários em que variamos o duty cycle de um sinal digital enviado para uma porta digital.

Figura 1. Exemplo de PWM com 25% e 50% de duty cycle

No exemplo 1, consideramos um duty cycle de 25%, ou seja, em 25% do tempo de um ciclo, o sinal enviado para a GPIO será um ALTO (HIGH - 5V), enquanto nos outros 75% o sinal será BAIXO (LOW - OV). No segundo exemplo, também na Figura 1, alteramos o duty cycle para 50% e isso faz com que para uma onda de mesma frequência tenhamos um comportamento diferente, pois neste caso, o sinal de ALTO permanecerá ativo durante 50% do ciclo.

Na páticra, o que isso significa? Se tivermos um duty cycle pequeno, o LED ficará "menos acesa"” ou seja, passará a sensação de que a intensidade luminosa será mais fraca. Já para o caso em que o duty cycle for maior, a nossa sensação será de um LED mais brilhoso, pois ele permanecerá mais tempo com sinal de ALTO, e por consequência, nos permitirá enxergar a iluminação por mais tempo.

Desta forma, você deverá:

Montar o circuito necessário para conectar um LED junto a labrador, garantindo (i) o uso adequado de um resistor na montagem do circuito com o LED e (ii) que o pin15 seja a gpio utilizada para a programação deste LED. Em seguida, você deve escrever um código em Python, utilizando a Caninos SDK para que (i) o LED deve acender, inicialmente com 25% de duty_cycle (ii) o LED deve ficar aceso por 2 segundos e então deve apagar (iii) o duty_cycle deve ser incrementado em 25% (iv) o passo ii deve ser repetido até que o duty_cycle atinja 100% e então, o LED deve ficar apagado.

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 pelo menos duas vezes!

Figura 1

Discutindo a montagem do programa

Para programarmos a Labrador em Python precisaremos importar Caninos SDK. Esta biblioteca foi desenvolvida para que possamos programar de forma mais simples nossa labrador, e desenvolver projetos compartilháveis. Além disso, precisaremos importar a biblioteca timer para garantir as pausas de acordo com o enunciado (ver Código 3).

   import caninos_sdk as k9
   import time

Código 3. Importando as bibliotecas necessárias

Após isso, precisamos criar uma variável para acessar os recursos da placa Labrador e em seguida, vamos habilitar o PWM para controlarmos nosso LED (pelo pin15). Veja o Código 4.

   labrador = k9.Labrador()
   labrador.pin15.enable_pwm(alias="led1", freq=50, duty_cycle=0.1)

Código 4. Criando uma variável do tipo Labrador para controlar o pin15

Note que de acordo com o Código 4 realizamos duas operações distintas. A primeira, conforme explicado no guia 2, permite acessar as operações básicas da labrador. Já na segunda, definimos que o pin15, associado a esta variável labrador, foi ativado como PWM para uso no programa (por meio da função enable_pwm). Além disso, definimos que a frequência da onda quadrada será de 50 Hz e que o duty_cycle será de 0.1 (ou seja 10%). Por fim, definimos que o apelido desta porta será led1. Este apelido permite que você utilize ele como uma constante, deste ponto em diante do código.

Para que o envio de sinal PWM inicie-se é necessário chamarmos a função start(), conforme destacado no Código 5.

   labrador.led1.pwm.start()

Código 5. Iniciando o comportamento PWM para pin15

Caso você deseje interromper o comportamento PWM bastar chamar a função stop() conforme destacado no Código 5.

   labrador.led1.pwm.stop()

Código 5. Iniciando o comportamento PWM para pin15

Sabendo disso, você já consegue montar o código necessário para resolver o desafio proposto neste guia!

Caso tenha alguma dúvida, consulte a seção "Código do Experimento".

Montagem do circuito

Figura 2. Imagem 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 a intensidade deste LED seja alterada de acordo com um sinal PWM enviado para nossa GPIO. A Figura 2 permite identificar a montagem deste circuito e é a mesma representada no Guia 2!

Código do experimento

   #importamos as bibliotecas necessárias para utilizarmos a labrador
   import caninos_sdk as k9
   #esta biblioteca permite gerar uma pausa na labrador (um delay)
   import time


   #criamos nossa variável labrador, para uso dos recursos da placa
   labrador = k9.Labrador()


   #criamos um contador para facilitar percorrer o laço de repetição e variar o duty_cycle
   contador_tempo = 1
   while contador_tempo <= 4:
     #inicializamos o pin15 com o duty_cycle de 25% e a cada iteração variamos ele
     labrador.pin15.enable_pwm(alias="led1", freq=100, duty_cycle=0.25*contador_tempo)
     labrador.led1.pwm.start()
     time.sleep(2)
     labrador.led1.pwm.stop()
     time.sleep(2)
     #incrementamos o contador para variar o duty_cycle e sair do loop ao final do ciclo
     contador_tempo = contador_tempo + 1