Olá pessoal...

Estou construindo um controle de motor dc 12v com arduino e l293d para um slider de câmeras...

Porém estou tendo dificuldade em adicionar um botão fim de curso neste projeto.

O projeto funciona assim:

Botão gira sentido esquerda e outro para direita

Porém foi criada uma função para timelapse em que é possível controlar o valor do DELAY(runtime e delaytime) de 0.0 até 99.9. Logo se configurado runtime=1.0 e delaytime=1.0 o motor anda 1 segundo e para 1 segundo.  Caso os valores sejam ZERO o motor funciona normalmemte apenas quando apertado o botão de sentido de giro.

Agora vem o problema. Com os valores do delay(runtime) maiores que ZERO, ao apertar e soltar um dos botões de giro do motor ele vai girar o tempo de runtime que foi configurado.

Então não consigo fazer uma função que pare instantaneamente o motor.

A ideia óbvia seria colocar a chave fim de curso cortando a corrente do motor, logo ao pressionar o botão para giro contrário não irá funcionar, tendo que manualmente desencostar o botão fim de curso.

Segue abaixo o código:

void loop() {

// Controlando o sentido de rotação para Esquerda com botão pelos INPUTs do L293d.

  if (digitalRead(bMudaSentRotEsq) == HIGH) { 
     if(runTime >= 0) {
     digitalWrite(motorDCEnt1, LOW);
     digitalWrite(motorDCEnt2, HIGH);
     delay(runTime*100);
     }
     if(delayDolly > 0) {
     digitalWrite(motorDCEnt1, LOW);
     digitalWrite(motorDCEnt2, LOW);
     delay(delayDolly*100);
     } 
  }

// Controlando o sentido de rotação para Direita com botão pelos INPUTs do L293d.
  if (digitalRead(bMudaSentRotDir) == HIGH) {
     if(runTime >= 0) {
     digitalWrite(motorDCEnt1, HIGH);
     digitalWrite(motorDCEnt2, LOW);
     delay(runTime*100);
     }
     if(delayDolly > 0) {
     digitalWrite(motorDCEnt1, LOW);
     digitalWrite(motorDCEnt2, LOW);
     delay(delayDolly*100);
     }
  }

  if (digitalRead(bFimdeCursoEsq) == HIGH) {
    digitalWrite(motorDCEnt2, LOW);
  }


  if (digitalRead(bFimdeCursoDir) == HIGH) {
    digitalWrite(motorDCEnt1, LOW);
  }

)

Do jeito que está os botões fim de curso funcionam perfeitamente quando o valor de RUNTIME é igual  a ZERO. Lembrado que o RUNTIME maior que ZERO o motor só para depois que completar o tempo, por isso tem que parar o motor instantaneamente.

Exibições: 1009

Anexos

Responder esta

Respostas a este tópico

com o delay sera impossivel vc fazer o q vc deseja 

mas com a funçao millis vc consegue fazer isso sim 

porem ela eh um pouco dificil de entender 

pesquise sobre ela e assim q tiver um tempo modifico o codigo pra vc ok 

bons projetos!!!!

Muito obrigador pela atenção...

Vou aprender esta função millis e modificar aqui...

Se percebi bem é isto que pretendes...não testei...

unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;

void Setup() {}

void loop() {

// Controlando o sentido de rotação para Esquerda com botão pelos INPUTs do L293d.

if (digitalRead(bMudaSentRotEsq) == HIGH) {
previousMillis1 = millis();}


if(previousMillis1+runTime*100 >= millis()) {
if(runTime >= 0) {
digitalWrite(motorDCEnt1, LOW);
digitalWrite(motorDCEnt2, HIGH);}
}
if(previousMillis1+delayDolly*100 >= millis()) {
if(delayDolly > 0) {
digitalWrite(motorDCEnt1, LOW);
digitalWrite(motorDCEnt2, LOW);}
}

// Controlando o sentido de rotação para Direita com botão pelos INPUTs do L293d.
if (digitalRead(bMudaSentRotDir) == HIGH) {
previousMillis2 = millis();}

if(previousMillis2+runTime*100 >= millis()) {
if(runTime >= 0) {
digitalWrite(motorDCEnt1, HIGH);
digitalWrite(motorDCEnt2, LOW);}
}
if(previousMillis2+delayDolly*100 >= millis()) {
if(delayDolly > 0) {
digitalWrite(motorDCEnt1, LOW);
digitalWrite(motorDCEnt2, LOW);}
}


if (digitalRead(bFimdeCursoEsq) == HIGH) {
digitalWrite(motorDCEnt2, LOW);
}

if (digitalRead(bFimdeCursoDir) == HIGH) {
digitalWrite(motorDCEnt1, LOW);
}

Desculpa a demora para agradecer sua ajuda...Obrigado.

Como é um projeto de fim de semana, estive sem tempo, mas andei dando uma lida sobre o millis...e parece ser esse a ídeia que vc me passou(ainda não testada).

Mas para o motor parar imediatamente com os botões fimdecurso teria que o valor de millis zerar nele, correto?

Olá,

Se você ligar o botão de parada em um pino com interrupção externa e habilitar a interrupção você consegue desviar o programa para uma função void imediatamente, mesmo com o mcu executando um delay.

Ai nesta função você escreve o comando de desligar o motor. 

No arduino uno os pinos com interrupção são o 2 e 3.

Abraço.

Interessante isso ai eim, vou fazer esse teste.

Muito obrigado pela ajuda.

Boas, fazendo no codigo onde tens if(delayDolly > 0) {... passar para.... if(delayDolly >= 0) { ... se o valor do delayDolly e runTime for zero podes facilmente parares o que quiseres...

Tá complicado essa função millis...já até quemei o ci l293d hehehe

Comprei mais dois e estou esperando chegar, mas continuo tentando entender usando led no lugar do motor...fica mais fácil.

A função não tem nada de complicado... é do mais simples de entender... a função millis e um contador interno do arduino e começa a contar direto desde o momento que ligas o processador e durante um periodo de 51 dias, se não houver interrupçoes ele reinicia a contagem... então como vez e simples basicamente millis corresponde ao tempo que o arduino esta ligado....

então so temos de aproveitar este facto e tentar usar em nosso proveito, por exemplo no codigo que passei em cima...

if (digitalRead(bMudaSentRotEsq) == HIGH) {
previousMillis1 = millis();} -- DISSEMOS QUE NESTE PRECISO MOMENTO QUEREMOS O MOTOR A RODAR PARA A ESQ


if(previousMillis1+runTime*100 >= millis()) {
if(runTime >= 0) {.

E aqui dissemos que queriamos que ele fizesse determinadas tarefas durante runTime*100 de tempo...

Espero ter ajudado....

Amigo, não está dando certo....HEHEHE

Vamos lá...facilitando o meu entendimento:

Botão Esquerda ligado igual: LIGA LED.

Botão Esquerda desligado igual: DESLIGA LED.

Se runTime > 0 e delayTime > 0 

Botão Esquerda ligado igual: PISCA LED

LED LIGADO no valor de runTime*100.

LED DESLIGADO no valor de delayTime*100.

Botão Esquerda desligado igual: DESLIGA LED.

  if(digitalRead(botaoEsq) == HIGH) {        // Botão Esquerda
    digitalWrite(ledRed, HIGH);                  // Liga Led Vermelho
    if(runTime > 0) {                                  // Se runTime > 0 liga led
    digitalWrite(ledRed, HIGH);
    delay(runTime*100);                            // durante este valor
    }
    if(delayTime > 0) {                               // Se delayTime > 0 desliga led
    digitalWrite(ledRed, LOW);
    delay(delayTime*100);                         // durante este valor
    }
  } else
     digitalWrite(ledRed, LOW);                 // Desliga Led Vermelho

Porem, se runTime > 0 e delayTime > 0, o BOTÃO ESQUERDA DESLIGADO não DESLIGA LED imediatamente.
Então preciso trocar a função delay para millis.

Consegui* da seguinte maneira:

unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;

  if(digitalRead(botaoEsq) == HIGH) {
    digitalWrite(ledRed, HIGH);
    if(runTime > 0) {
      previousMillis1 = millis();    
      if(previousMillis1 + runTime*100 >= millis()){
      digitalWrite(ledRed, HIGH);
      }  
    }
    if(delayTime > 0) {
      previousMillis2 = millis();
      if(previousMillis2 + delayTime*100 >= millis()){
      digitalWrite(ledRed, LOW);
      }
    }
  } else
     digitalWrite(ledRed, LOW);

Mas se adiciono outro botão com outro led...para de funcionar....

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço