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.
Tags:
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....
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2023 Criado por Marcelo Rodrigues.
Ativado por