Uso de threads em Arduino

187 views
Skip to first unread message

ruianaiv

unread,
Jul 8, 2016, 6:04:47 PM7/8/16
to Forum do Labirito
Oi pessoal, boa tarde.

Em várias oportunidades tenho ajudado, amigos no LdG, que precisam que o a arduino faça mais que uma tarefa
simultaneamente.  Por exemplo; ler um valor em um sensor  e girar um servo motor.

Isto recebe o nome de multi processamento ou  multitarefa (Multitasking).
Como o arduino só tem um núcleo, isto é impossível.

Mas existe um recurso que simula o multitasking no arduino. É a biblioteca  " Threads ". É um multitasking virtual.

Esta biblioteca  trabalha assim:

São definidos tempos para que cada tarefa seja executada:

Ex: define que a tarefa de ler o valor do sensor será de 20ms e a tarefa de girar o servo motor será de 30ms.
Estes valores são definidos no momento de configuração no setup e será mantido durante toda a execução.

Após configurar os parâmetros para serem usados com a biblioteca threads, teremos a seguinte situação:

Durante 20ms o programa executa a  atividade de ler o sensor, aí ele para, e salva todas informações pertinentes ao que estava fazendo,
e começa a a tarefa de girar o servo motor durante 30 ms.

Durante 30ms, o programa executa a  atividade de girar o servo, aí ele para, e salva todas informações pertinentes ao que estava fazendo, 
restaura as informações referentes à leitura do sensor e durante 20ms continua fazendo a tarefa de ler um valor no sensor.

E assim fica fazendo:  20ms lendo sensor,  30ms girando servo.

Como a velocidade de troca de tarefa é muito rápida, as paradas de cada tarefa passam despercebidas, parecendo que o arduino
está fazendo as tarefas ao mesmo tempo.

Por "default" você pode selecionar até 15 tarefas "simultâneas" .

Eu montei dois codes para testar o uso  da biblioteca  " Threads ".
Um usa delay entre acender e pagar LED, 

  2 threads  1o. thread 10ms      Acende LED A a e após 500milis() apaga LED A
                 2o.  thread 10ms     Acende LED B a e após 500milis() acende LED B

e o outro usa millis() para manter o LED aceso ou apagado.

  2 threads  1o. thread 10ms      Acende LED A a e após 500ms de delay apaga LED A
                 2o.  thread 10ms     Acende LED B a e após 500ms de delay acende LED B


O que eu esperava que ocorresse:

Ao iniciar o LED A deveria acender e após 10 ms o LED B acender.

Após 500ms o LED A deveria apagar e  10 ms após o LED B deveria apagar.

No code onde usei millis(), isto ocorreu como esperado.

No code onde usei o delay, isto não aconteceu, o LED B só acendeu depois de algum tempo que deu para perceber 
E o LED A só acendeu depois que o LED B apagou. (500 ms).
Daí imaginei que a função delay afeta o multtasking.

Codes em anexo.
Rui



Threads_C_Delay.ino
Threads_S_Delay.ino

eijuito

unread,
Jul 8, 2016, 6:07:11 PM7/8/16
to Forum do Labirito
Excelente tópico RV!!!

kwiekcinema

unread,
Jul 9, 2016, 11:08:59 AM7/9/16
to Forum do Labirito
Olá Rui e todos,

Com o objeto de colaborar com sua ótima exposição,  seguem videos de simulação no Proteus realizados a tempos atras com a excelente biblioteca do colega Ivan Seidel, e em um deles usando um código seu para leitura de dois sensores. 

Threads Rui Viana exemplo simulado com Proteus:


Usando threads para acender led (Simulado no Proteus) com tempos diferentes usando biblioteca de Ivan Seidel.


Grande abraço e parabens!

eijuito

unread,
Jul 12, 2016, 8:33:38 PM7/12/16
to Forum do Labirito
Olá Rui,
Terminei um tutorial falando sobre Threads.

Por favor, comente, critique e me avise, Ok?
Isso vale pra todos!!!
Grande abraço,

 'Eiju
Reply all
Reply to author
Forward
0 new messages