Como Realizar Tarefas Paralelas (threads) Em Um Programa Arduino

Índice:

Como Realizar Tarefas Paralelas (threads) Em Um Programa Arduino
Como Realizar Tarefas Paralelas (threads) Em Um Programa Arduino

Vídeo: Como Realizar Tarefas Paralelas (threads) Em Um Programa Arduino

Vídeo: Como Realizar Tarefas Paralelas (threads) Em Um Programa Arduino
Vídeo: How to do multiple tasks in Arduino | Beginners | millis() function 2024, Novembro
Anonim

Na tecnologia de microprocessador, as tarefas executadas em paralelo são chamadas de Threads. Isso é muito conveniente, porque muitas vezes é necessário realizar várias operações ao mesmo tempo. É possível fazer com que o microcontrolador Arduino execute várias tarefas ao mesmo tempo, como um processador real? Vamos ver.

Streams paralelos em um programa Arduino
Streams paralelos em um programa Arduino

É necessário

  • - Arduino;
  • - 1 LED;
  • - 1 campainha piezoelétrica.

Instruções

Passo 1

De modo geral, o Arduino não oferece suporte para paralelização verdadeira ou multithreading.

Mas você pode dizer ao microcontrolador para verificar se chegou a hora de executar alguma tarefa adicional em segundo plano a cada repetição do ciclo "loop ()". Neste caso, parecerá ao usuário que várias tarefas estão sendo executadas simultaneamente.

Por exemplo, vamos piscar um LED em uma determinada frequência e, em paralelo, emitir sons que sobem e descem como a sirene de um emissor piezoelétrico.

Conectamos o LED e o emissor piezoelétrico ao Arduino mais de uma vez. Vamos montar o circuito conforme mostrado na figura. Se você estiver conectando um LED a um pino digital diferente de "13", lembre-se de ter um resistor limitador de corrente de cerca de 220 ohms.

Diagrama de fiação para buzzer e LED para Arduino
Diagrama de fiação para buzzer e LED para Arduino

Passo 2

Vamos escrever um esboço como este e fazer o upload para o Arduino.

Depois de carregar a placa, você pode ver que o sketch não é executado exatamente como precisamos: até que a sirene esteja totalmente operacional, o LED não piscará, e gostaríamos que o LED piscasse DURANTE o toque da sirene. Qual é o problema aqui?

O fato é que esse problema não pode ser resolvido da maneira usual. As tarefas são executadas pelo microcontrolador estritamente sequencialmente. O operador "delay ()" atrasa a execução do programa por um período de tempo especificado e, até que esse tempo expire, os seguintes comandos do programa não serão executados. Por causa disso, não podemos definir uma duração de execução diferente para cada tarefa no "loop ()" do programa.

Portanto, você precisa simular a multitarefa de alguma forma.

Beeper e controle de LED em série
Beeper e controle de LED em série

etapa 3

A opção em que o Arduino executará tarefas em pseudo-paralelo é sugerida pelos desenvolvedores do Arduino no artigo

A essência do método é que a cada repetição do loop "loop ()", verificamos se é hora de piscar o LED (para realizar uma tarefa em segundo plano) ou não. E se isso acontecer, invertemos o estado do LED. Isso é uma espécie de contornar o operador "delay ()".

Uma desvantagem significativa deste método é que a seção de código na frente da unidade de controle do LED deve ser executada mais rapidamente do que o intervalo de tempo de intermitência do LED "ledInterval". Caso contrário, o piscar ocorrerá com menos frequência do que o necessário, e não obteremos o efeito da execução paralela de tarefas. Em particular, em nosso esboço, a duração da mudança do som da sirene é 200 + 200 + 200 + 200 = 800 mseg, e configuramos o intervalo de piscar do LED para 200 mseg. Mas o LED piscará com um período de 800 mseg, que é 4 vezes diferente do que configuramos. Em geral, se o operador "delay ()" for usado no código, será difícil simular o pseudo-paralelismo, por isso é aconselhável evitá-lo.

Nesse caso, seria necessário que o controle do som da sirene também verifique se chegou ou não a hora, e não use "delay ()". Mas isso aumentaria a quantidade de código e pioraria a legibilidade do programa.

LED piscando sem demora () operador
LED piscando sem demora () operador

Passo 4

Para resolver este problema, usaremos a maravilhosa biblioteca ArduinoThread, que permite criar facilmente processos pseudo-paralelos. Funciona de forma semelhante, mas permite que você não escreva código para verificar a hora - se você precisa executar a tarefa neste loop ou não. Isso reduz a quantidade de código e melhora a legibilidade do esboço. Vamos verificar a biblioteca em ação.

Em primeiro lugar, baixe o arquivo da biblioteca do site oficial https://github.com/ivanseidel/ArduinoThread/archive/master.zip e descompacte-o no diretório "libraries" do Arduino IDE. Em seguida, renomeie a pasta "ArduinoThread-master" para "ArduinoThread".

Instalando a biblioteca ArduinoThread
Instalando a biblioteca ArduinoThread

Etapa 5

O diagrama de conexão permanecerá o mesmo. Apenas o código do programa será alterado. Agora será o mesmo que na barra lateral.

No programa, criamos dois fluxos, cada um executa sua própria operação: um pisca com um LED, o segundo controla o som da sirene. Em cada iteração do loop, para cada thread, verificamos se é chegada a hora de sua execução ou não. Se chegar, é lançado para execução usando o método "run ()". O principal é não usar o operador "delay ()".

Explicações mais detalhadas são fornecidas no código.

Vamos carregar o código na memória do Arduino e executá-lo. Agora tudo funciona exatamente como deveria!

Recomendado: