Autor Tópico: Arduino 2 laços loops juntos - scheduler.h  (Lida 3541 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline Thiago.Henrique

  • Fuso
  • **
  • Posts: 140
  • Sexo: Masculino
Arduino 2 laços loops juntos - scheduler.h
« Online: 21 de Outubro de 2016, 20:46 »
Boa noite a todos. Estou aqui programando meu Arduino e surgiu uma dificuldade, funcionar mais de 2 loops ao mesmo tempo, exemplo display, motor de passo e controles analógicos.
Procurando na internet encontrei algumas coisas mas não consegui executar... por favor pessoal do forum poderia me ajudar?

Offline Thiago.Henrique

  • Fuso
  • **
  • Posts: 140
  • Sexo: Masculino
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #1 Online: 21 de Outubro de 2016, 20:48 »
Um exemplo que encontrei está nesse link onde demonstra ser bem simples, se fosse assim estaria top. kkk

https://www.arduino.cc/en/Tutorial/MultipleBlinks

Offline Cássio Alvarenga

  • Moderador
  • CNCMASTER
  • ******
  • Posts: 3429
  • Sexo: Masculino
    • www.vatech.ind.br
  • Cidade - UF: Belo Horizonte - MG
  • Profissão: Empresario / Engenheiro Mecânico
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #2 Online: 21 de Outubro de 2016, 21:44 »
MultiTask com o arduino é meio que "gabiarra" pois a arquitetura não executa REALMENTE 2 loops simultaneos. O que ele faz é alternar entre 1 e outro durante algum delay.
Veja o exemplo do link:

Código: [Selecionar]
void loop() {
  digitalWrite(led1, HIGH);

  // IMPORTANT:
  // When multiple tasks are running 'delay' passes control to
  // other tasks while waiting and guarantees they get executed.
  delay(1000);

  digitalWrite(led1, LOW);
  delay(1000);
}

// Task no.2: blink LED with 0.1 second delay.
void loop2() {
  digitalWrite(led2, HIGH);
  delay(100);
  digitalWrite(led2, LOW);
  delay(100);
}


Aconteceria a mesma coisa se escrevesse:

Código: [Selecionar]
void loop() {
  digitalWrite(led1, HIGH);

  for(i=0, i<5, i++)
{
 digitalWrite(led2, HIGH);
  delay(100);
  digitalWrite(led2, LOW);
  delay(100);
   
}

digitalWrite(led1, LOW);

}

O que acontece é que o "delay (1000)" é substituido pela rotina no loop 2, e qualquer delay dentro do loop2 será substituido pelo loop3 e assim sucessivamente.  Ou seja, ele não executa 2 laços simultaneamente, em uma aplicação que exige mais do hardware podera ser notado que o tempo de execução será de cada tarefa individualmente. Dando na mesma se escrever o codigo em sequencia ou não.

Falo sobre os AVR... Não cheguei a ver a fundo, mas talvez esses novos arduinos com esses ARM parrudos suporte mult-threading "real"...
« Última modificação: 21 de Outubro de 2016, 21:47 por Cássio Alvarenga »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #3 Online: 21 de Outubro de 2016, 22:36 »
Qualquer multitask se baseia na subdivisão do tempo em slots e isso pode ser feito em qualquer processador, PIC, ATMega, ....

Evidentemente que alguns processadores mais capazes, com mais registradores, memória, velocidade, ... conseguem implementar mais eficientemente um ambiente multitask.

Outra coisa, para executar apenas duas tarefas, o uso de interrupções é mais simples e pode resolver.

Finalmente, a pergunta que não quer calar, precisa multitask?


« Última modificação: 21 de Outubro de 2016, 22:38 por minilathe »

Offline Thiago.Henrique

  • Fuso
  • **
  • Posts: 140
  • Sexo: Masculino
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #4 Online: 21 de Outubro de 2016, 23:23 »
Acho que cada programa tem suas dificuldades e necessidades, se existir alguma biblioteca que facilita isso defini um padrão e facilitaria muito.
No meu caso por exemplo tenho essa dificuldade pq preciso rodar um motor de passo com RPM variável, controle de temperatura e tudo isso configurado por potenciometro e display.

Enviado de meu SM-G530BT usando Tapatalk


Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #5 Online: 22 de Outubro de 2016, 10:16 »
Arduino não é meu forte, trabalho mais com PIC, observei que em algumas aplicações o grande vilão é a atualização do display que toma muito tempo no processo pelo motivo dos delay do próprio display. em alguns casos consegui ganhar um pouco mais de velocidade usando a interrupção do timer0, em vez de usar um delay, usava contagens no estou do timer0, assim o programa não ficava perdendo tempo dentro de uma função aguardando o delay e sim contando quantas vezes deu o estouro do timer0.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #6 Online: 23 de Outubro de 2016, 11:11 »
A aplicação deve ser analisada como um todo e separadamente, cada uma de suas partes, definindo claramente as restrições de cada tarefa.

Cabe destacar que o display não precisa atualização tão rápida, tendo em vista que a informação de velocidade servirá  ao usuário tomar uma decisão e ação. Coisas que não são rápidas.

Por outro lado, faz sentido haver um algoritmo de controle de velocidade rápido o suficiente para manter a rotação sob controle.

Estas são apenas alguns insights sobre o assunto, que não é simples, mas não deve ser tornado mais complexo nas partes menos críticas.

Offline Thiago.Henrique

  • Fuso
  • **
  • Posts: 140
  • Sexo: Masculino
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #7 Online: 23 de Outubro de 2016, 12:17 »
Arduino não é meu forte, trabalho mais com PIC, observei que em algumas aplicações o grande vilão é a atualização do display que toma muito tempo no processo pelo motivo dos delay do próprio display. em alguns casos consegui ganhar um pouco mais de velocidade usando a interrupção do timer0, em vez de usar um delay, usava contagens no estou do timer0, assim o programa não ficava perdendo tempo dentro de uma função aguardando o delay e sim contando quantas vezes deu o estouro do timer0.

Bem lembrado Paulo, encontrei o Timer1 e Timer3 para o Arduino, vou tentar usar esses dois timers mais o Loop normal para fazer meu programa.
 
A aplicação deve ser analisada como um todo e separadamente, cada uma de suas partes, definindo claramente as restrições de cada tarefa.

Cabe destacar que o display não precisa atualização tão rápida, tendo em vista que a informação de velocidade servirá  ao usuário tomar uma decisão e ação. Coisas que não são rápidas.

Por outro lado, faz sentido haver um algoritmo de controle de velocidade rápido o suficiente para manter a rotação sob controle.

Estas são apenas alguns insights sobre o assunto, que não é simples, mas não deve ser tornado mais complexo nas partes menos críticas.


Grande Minilathe... Esse é problema que to encontrando nesse programa, o display tem uma frequencia bem menor que o usado para o Motor de Passo. Vou tentar usar o Timer1 e Timer3 e volto a postar aqui.

A plataforma Arduino é muito usada, acredito que alguém já deve ter criado alguma biblioteca que desfragmenta os loops, isso iria facilitar muito na programação.

Offline Thiago.Henrique

  • Fuso
  • **
  • Posts: 140
  • Sexo: Masculino
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #8 Online: 23 de Outubro de 2016, 13:43 »
Exemplo do uso da biblioteca #include <Scheduler.h>

Vídeo:
https://www.youtube.com/watch?v=2gIYKek6xGY

Programa em anexo.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #9 Online: 23 de Outubro de 2016, 16:45 »
Esse é problema que to encontrando nesse programa, o display tem uma frequencia bem menor que o usado para o Motor de Passo. Vou tentar usar o Timer1 e Timer3 e volto a postar aqui.

O display não precisa muita velocidade, pois é para informar algo ao usuário, o qual é relativamente "lento" para analisar, decidir e agir.

Já um programa de controle precisa de velocidade e determinismo temporal.

Assim, o display pode ser atualizado sem muito compromisso temporal e sem determinismo. Com o controle em malha fechada, a coisa fica mais crítica.

Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #10 Online: 24 de Outubro de 2016, 13:39 »
Se poder usar malha fechada, melhor, mas quais são as prioridades no seu sistema quem vem em primeiro?
Creio que interrupções internas e externas possam determinas as prioridades e o display ficar por ultimo.
Desta forma se o programa estiver no display e ocorrer uma interrupção ele "para e vai tratar a interrupção" e volta no display seguindo até o final do programa ou enquanto não ocorrer outra interrupção.

Offline Thiago.Henrique

  • Fuso
  • **
  • Posts: 140
  • Sexo: Masculino
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #11 Online: 31 de Outubro de 2016, 09:19 »
Depois de pesquisar muito, a conclusão:
A forma que encontrei para MultiTask foi usar os Timers, Consegui minha programação usando o Arduino Mega com o Timer 1 para o Display e o Timer3 para o Motor e o Loop para o restante do sistema.
Existem tutorias pela internet que falam de biblioteca Scheduler MultiTasks mas não consegui utilizar porque só funcionam no Arduino Due.
Para Arduino Uno só existe o Timer1, para o Arduino Mega podem usar o Timer1 e Timer3, já para o Arduino Due, existe a biblioteca Duetimer onde pode usar até 9 Timers ao mesmo tempo, e também a biblioteca Scheduler,  onde permite dividir o programa em loops separado, permite trabalhar mais organizado e sem ter que ficar improvisando na programação.


Offline ivan braga

  • Se os fatos não se encaixam na teoria, modifique os fatos. Albert Einstein
  • Novato
  • *
  • Posts: 36
  • Sexo: Masculino
Re:Arduino 2 laços loops juntos - scheduler.h
« Resposta #12 Online: 31 de Outubro de 2016, 22:16 »
Boa noite a todos.

Thiago.Henrique, não sei qual seu conhecimento e interação com RTOS, caso você esteja interessado em um que tenha um HAL para os periféricos e alguns exemplos para arduino de uma olhada em http://www.chibios.org/dokuwiki/doku.php.

No fórum deste RTOS tem uma tradução do ChibiOS/RT 3.0 - The Ultimate Guide http://www.chibios.org/dokuwiki/doku.php?id=chibios:book:start para o português que eu contribui  com o projeto.

Espero que te ajude, caso fosse com os mcus strm32 poderia te ajudar mais, porem avr e arduino não tenho a menor intimidade.

Ivan

 

/** * */