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.
É 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.
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.
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.
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".
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!