Delay de 12 horas no Arduino


#1

Bom dia
Estou precisando fazer um motor de passos gira 1/4 de volta para direita e após 12 horas ele deverá girar 1/4 de volta para esquerda , e assim ficar em loop. Preciso de ajuda para fazer este delay de 12 horas. Com tempo curto funcionou perfeito.


#2

Faça contadores em cascata, exatamente como contamos o tempo de forma “normal”


#3

Bom dia Ludicon
Obrigado pelo retorno.
Tive que alterar o firmware , pois estava usando o drive L298 N e estava aquecendo muito ,tanto o drive como o motor.
Agora estou usando o drive A4988 que possui ajuste de corrente e não tenho mais sobreaquecimento , porem o firmware não está rodando com deveria.
. O objetivo deste programa é fazer um motor de passos Nema 17( 4 fios - 12volts) girar 90 graus(1/4 de volta) para a direita e após 12 horas, o mesmo deverá girar 90 graus(1/4 de volta) para esqueda, e assim ficar em loop. Estou usando um drive ponte “H”, A4988.
Está acontecendo o seguinte:

  • Quando ligo o motor , ele faz um giro de aproximadadente 100 graus , e após isto, começa fazer o vai e vem de 1/4 de volta ( 90 graus) para cada lado.Não sei onde estou errando para ele não iniciar já fazendo vai e vem.

É possivel você me dar uma luz , afim de que eu possa ressolver esta situação.

Abaixo está o firmware.

// define números de pinos
const int stepPin = 3 ;
const int dirPin = 4 ;

void setup ( ) {
// Define os dois pinos como Saídas
pinMode ( stepPin, OUTPUT ) ;
pinMode ( dirPin, OUTPUT ) ;
}

void loop() {
// permite que o motor se mova em uma direção particular
digitalWrite(dirPin, HIGH);

// faz 50 pulsos para fazer 1/4 rotação de ciclo completo
for(int x =0; x < 50; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(500); 
}
delay(1000); //1 segundo de delay para inverter a direção
//Muda a direção da rotação
digitalWrite(dirPin,LOW); 

// faz 50 pulsos para fazer 1/4 rotação de ciclo completo 
for(int x =0; x < 50; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
}
delay(1000); //1 segundo de delay para inverter a direção

}


#4

Infelizmente eu não posso ajudar no código, eu ainda não mexo com Arduino… A dica dos contadores em cascata vem da eletrônica da década de 70 mesmo… :rofl::rofl::rofl::rofl::rofl::rofl:


#5

Esse artigo tem um exemplo e uma boa explicação sobre o uso dessa controladora.


Também tem esse com EasyDriver, que é o mesmo conceito, e mais informações:


#6

Salve! Tenta utilizar um RTC. Por exemplo o DS1307 ou algum outro. Aí você pode definir o tempo no seu código em que deseja para a ação do motor. O arduíno tem exemplos com esse dispositivo. Boa sorte!


#7

Realmente seu codigo está sendo executado desta maneira vc precisa compreender um pouco mais sobre temporizadores os principais são Ondelay e Offdelay imaginando que vc compreenda a linguagem C
Bem vc precisa mudar seu código após a primeira função onde o motor gira 120 graus o motor pelo código escrito na segunda função ele tem um delay de 1 segundo começa a inverter a direção bem vamos pensar juntos se 1000 equivale a um segundo quanto será 12 horas? regrinha de 3
é só alterar e testar não esqueça de alterar a 3 função também.
Outra maneira vc pode criar uma função q receba numeros inteiros após a entrada vc pode decrementar até chegar a zero e executar uma condicional.
Abç


#8

Amigo Electronic
Obrigado pela dica .


#9

Amigo skullcrusher777
Realmente você tem razão , eu preciso estudar mais sobre temporizadores, eu comecei a mexer no Arduino fazem um pouco mais que uma semana .
Você me aconselha que eu deva mudar o código após a primeira função onde o motor gira 120 graus, o que preciso evitar é que ele faça este giro de 120 graus , e sim, que ao ser ligado, já comece com a inversão. Você pode me ajudar neste código?
abs


#10

Boa Tarde Amigo! tudo bem? Existem várias alternativas para resolver esse desafio!

A mais simples seria usar o delay() e incrementar um contador até atingir o número de milessegundos para as 12 horas.

Mas faria diferente, existe a função millis() que retorna a quantidade de milessegundos que se passou desde que o microcontrolador foi ligado.

Existem vários exemplos de como usar a função millis(), procure por BlinkWithoutDelay no site do arduino que você terá uma ótima noção de como funciona.

Outro possível desafio que poderá surgir é que após alguns dias o número retornado pela função millis() ficará tão grande que irá estourar a variável.

Isso pode ser resolvido com um timer watchdog reiniciando o microcontrolador de tempos em tempos.

Espero ter te ajudado!


#11

Boa tarde Amigo fnfontana
Já resolvi esta questão do tempo , mas agradeço por sua informação.O que ainda não consegui resolver, é a questão de inicialmente ele fazer um giro de aproximadadente 120 graus e só depois iniciar o vai vem.


#12

Bacana! Isso é algum exercío para aula ou é um projeto seu mesmo? Existem bibliotecas que facilitam muito nossa vida para controlar motores de passo.
Mas se você precisa mesmo fazer na raça você pode fazer um código que vc consiga inserir o numero de passos no monitor serial até achar o numero correspondente ao angulo que vice precisa!


#13

fnfontana
Isto é um projeto mesmo , preciso abriu uma vigia de uma estufa , por 10 segundos a cada 12 horas.
Este problema do motor de passos girar aproximadamente 120 graus, antes de iniciar o vai e vem , acontece somente uma vez , quando ligo , depois funciona perfeito .


#14

Bom dia!
Achei estranho o motor girar 120 graus assim que liga o arduino. No seu código não tem isso

Testa com essa biblioteca: https://github.com/laurb9/StepperDriver.

Se essa biblioteca não funcionar, talvez pode ser uma ligação invertida ou mal contato - mas acredito que se fosse isso você já teria descoberto.

Você relatou que ele gira 120 graus ao ligar e então funciona normalmente. Para ser problema do código teria que estar no void setup(), ou preso a uma condicional ou repetição no void loop().

Você pode testar com outro driver de motor de passo.
Também pode testar com outro arduino.


#15

Bom dia fnfontana
Testei com esta biblioteca e aconteceu a mesma coisa. Parece que o motor procura um ponto de referencia , para depois iniciar a fazer o vai e vem.