FAVORITAR
FecharPlease login

Franzininho C0: Blink LED com Delay e com Interrupção no Arduino

Introdução

Um dos primeiros códigos utilizados para testar as saídas de uma placa é o Blink LED. Em um código simples, um LED pisca por um intervalo de tempo definido usando o recurso de delay. Mas, quando é necessário piscar dois LEDs simultaneamente, apenas o delay não é suficiente.

Neste artigo vamos aprender o que é e como utilizar a interrupção no Arduino com a Franzininho C0.

Importante
Se ainda não configurou sua Franzininho C0 para usar no Arduino, confira o tutorial: Franzininho C0 – Primeiros passos com Arduino

Material necessário

Para esse exemplo vamos apenas usar a placa Franzininho C0 e os LEDs presentes nela, conforme exibido no pinout abaixo:

Primeiramente, no Arduino os programas são chamados de “sketches”. Cada sketch contém duas funções principais: setup() e loop(). 

No dia 25 de Junho de 2024, ocorrerá o “Seminário de Sistemas Embarcados e IoT 2024“, no Holiday Inn Anhembi — Parque Anhembi, São Paulo–SP.

Garanta seu ingresso

O setup é executado uma vez e é usado para configuração inicial do programa. Nele definimos os GPIOS, taxa de transmissão de bits, entre outras coisas. Já o loop, contém o código principal do programa e é continuamente executado enquanto o Arduino estiver ligado.

Abaixo temos o código do blink LED que conta com as duas funções principais citadas:

O programa começa definindo o pino PB6 como o LED e, em seguida, no setup, configuramos esse pino como saída. Na função loop, o código principal é executado para ligar o LED por 1 segundo e depois desligá-lo por 1 segundo.

Outro ponto importante sobre o Arduino, é que ele funciona lendo uma linha de código por vez. Isso significa que quando o Arduino lê delay(1000) ele para naquela linha por 1 segundo e em seguida vai para a próxima linha. Em algumas situações isso pode ser um desafio, como no caso de querer piscar dois LEDs ao mesmo tempo.

Como podemos ver no código a seguir, somente utilizando delays, o LED1 irá acender e apagar por 250 milissegundos, seguido pelo LED2 que será acendido e apagado por 1 segundo. Esse código é baseado no código desenvolvido pelo Daniel Quadros e disponível no Github da Franzininho

Obs.: Antes de a IDE iniciar o carregamento do programa, a Franzininho C0 deve executar o bootloader, caso contrário ocorrerá um erro.

Funcionamento

Como pode ser visto no vídeo os LEDs piscam sequencialmente e não simultaneamente:

Uma das formas de acender os dois LEDs ao mesmo tempo é utilizando uma interrupção.

Interrupção 

Quando uma interrupção é chamada, o microcontrolador interrompe temporariamente a execução atual para lidar com a ação solicitada pela interrupção e, após executá-la, retorna ao ponto onde o código estava antes da interrupção ocorrer.

Há interrupções externas e internas:

  • As interrupções externas são acionadas ao detectar sinais dos GPIOS da placa que você está utilizando. Nem todo pino pode ser utilizado para interrupções, então as placas possuem pinos designados especificamente para essa função. Esses pinos podem estar conectados a sensores, botões ou outros dispositivos, que ao apresentar uma mudança de estado, servem como gatilho para suspender as tarefas em andamento na placa e executar um código específico em resposta àquele evento externo.
  • As interrupções internas, ou interrupções de software, são interrupções geradas pelo próprio programa em execução. Elas são úteis em múltiplas situações, aqui vamos utilizá-las através da implementação de temporizadores.

Independente do tipo de interrupção há dois elementos que farão parte desse procedimento: a condição de interrupção e a função a ser executada

Neste exemplo, a condição de interrupção será o término da contagem de um temporizador, enquanto a função a ser executada será a função responsável por piscar o LED.

Para utilizar a interrupção no Arduino é necessário o objeto HardwareTimer. Este é um objeto específico do runtime Arduino para STM32. O pacote STM32duino inclui mais exemplos de uso deste objeto.

Abaixo temos o código completo utilizado nesse exemplo. Esse código é baseado no código desenvolvido pelo Daniel Quadros e disponível no Github da Franzininho:

Explicação do código

Então, após definir os pinos utilizados nesse exemplo, criamos um ponteiro para um objeto HardwareTimer:

No setup, além de configurar os LEDs, configuramos o timer. Começamos associando o timer à placa. A Franzininho C0 possui 8 timers, e optamos por utilizar o Timer 1. Em seguida, usamos o método setOverflow para definir por quanto tempo o timer irá contar. Neste caso, o tempo é especificado em microssegundos (MICROSEC_FORMAT) e é definido como 250 ms. Quando o tempo definido se esgota, a função attachInterrupt chamará a função blinkLED, que contém as rotinas de serviço de interrupção. Por fim, a função resume inicia a contagem do timer.

Na função blinkLED controlamos o piscar do LED. Dentro dela, uma variável estática chamada ledAceso é inicializada como falsa na primeira chamada e a cada execução da função, o estado do LED é invertido através do operador de negação lógica (!). Para atualizar o estado do LED, usa-se uma instrução condicional que irá definir como alto (HIGH) se ledAceso for verdadeiro e baixo (LOW) caso contrário:

Essa função é chamada quando o temporizador chegar a 250 ms e fará o LED1 mudar de estado independente do que estiver acontecendo dentro do loop.

Por último no loop teremos o LED2 piscando a cada 1 segundo usando a função de delay.

Obs.: Antes de a IDE iniciar o carregamento do programa, a Franzininho C0 deve executar o bootloader, caso contrário ocorrerá um erro.

Funcionamento

No vídeo os dois LEDs piscam simultaneamente conforme previsto:

Conclusão

Neste artigo, exploramos duas formas de implementar o clássico “Blink LED” no Arduino, usando o método convencional com delay e introduzindo o conceito de interrupção. Inicialmente, vimos como o delay pode ser empregado para fazer um LED piscar em intervalos regulares, mas também observamos suas limitações ao tentar controlar múltiplos LEDs de forma simultânea.

Em seguida, mergulhamos no mundo das interrupções, aprendendo como elas podem ser utilizadas para lidar com eventos externos ou temporizados de forma mais eficiente. Com o exemplo prático da Franzininho C0, exploramos como configurar e utilizar interrupções para controlar um LED, permitindo que ele pisque independentemente das outras operações do programa.

Ao final deste artigo, agora você compreende não apenas como implementar o “Blink LED”, mas também como aprofundar seus conhecimentos em programação de microcontroladores, explorando conceitos avançados como interrupções.

Desafio

Agora é a sua vez de aplicar o que aprendeu! Utilize os conhecimentos adquiridos neste artigo para criar um novo programa Arduino. Seu desafio é programar a Franzininho C0 para controlar três LEDs de forma independente: um piscando a cada 500 milissegundos, outro a cada segundo e o terceiro a cada dois segundos. Lembre-se de utilizar interrupções para garantir a precisão no controle dos LEDs. Uma vez completado o desafio, você estará mais preparado para enfrentar projetos mais complexos e desafiadores no mundo da eletrônica e da programação de microcontroladores. Boa sorte!

Saiba mais

Franzininho C0: Nova placa brasileira baseada no STM32C0

Bancada do Embarcados sobre a Franzininho C0

Compre a Franzininho C0 – Robocore

Compre a Franzininho C0 – Casa da Robótica

Outros artigos da série

<< Franzininho C0 – Primeiros passos com ArduinoLeitura de um botão e acionamento de um LED no Arduino com a Franzininho C0 >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
Inline Feedbacks
View all comments
Home » Hardware » Open Hardware » Franzininho C0: Blink LED com Delay e com Interrupção no Arduino

EM DESTAQUE

WEBINARS

LEIA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste:


Seminário de
Sistemas Embarcados e IoT 2024
 
Data: 25/06 | Local: Hotel Holiday Inn Anhembi, São Paulo-SP
 
GARANTA SEU INGRESSO

 
close-link