LusoRobótica - Robótica em Português
Robótica => Iniciantes => Tópico iniciado por: xxscorpioxx em 10 de Agosto de 2012, 10:35
-
Boas sou iniciante no arduino e na programaçao, estou a desenvolver um mecanismo e tenho um microswitch ligado.
o código está assim:
if (digitalRead(switchPin2) == LOW)
{
digitalWrite(motortubo, HIGH); // liga o motor
delay(6000); // fica ligado 6segundos
digitalWrite(motortubo, LOW); // desliga o motor do tubo
}
else
{
digitalWrite(motortubo, LOW); // Aqui é que a porca torce o rabo
}
preciso que se o switchPin2 estiver HIGH ele fique á espera sem avançar mais o programa até que fique LOW
desde ja agradeço alguma ajuda
-
Se esse bocado de código estiver no loop, o motor vai estar sempre desligado ^^
Antes de mais vê o exemplo do arduino "Blinky without delay" vai-te permitir criar um timer sem teres de parar o micro.
Depois crias uma função fora do loop para fazer a verificação do estado.
se o estado for HIGH não fazer nada se for LOW fazer qualquer coisa.
ou então troca o else por outro if.
-
vou dar uma vista no "Blinky without delay" mas o meu problema é mesmo esse "se o estado for HIGH não fazer nada se for LOW fazer qualquer coisa."
nao sei que codigo escrever para se o estado for HIGH parar e esperar por tempo indeterminado que fique LOW para continuar a ler o resto do codigo e executar as funçoes seguintes.
-
Sim esta parte esta no LOOP e o motor nao liga, mas passa á frente e continua a executar o codigo
O que posso por em ELSE para quando o microswitch estiver a dar ordem de HIGH para parar de ler o codigo e esperar que passe a LOW para continuar a a ler o void loop()
esta parte é que está mal
else
{
digitalWrite(motortubo, LOW);
}
-
apaga o else que fica a funcionar.
-
Como já disseram acima podes tirar o else.
Se queres mesmo que fique parado, caso tenhas mais código abaixo, podes usar isto, embora não seja a melhor solução, é fácil:
while(digitalRead(switchPin2) == HIGH) { } //Podes fazer alguma coisa ou deixar em branco. Enquanto for HIGH repete sempre, não saindo do loop até que fique LOW.
-
Resolvido, funciona na perfeição ;D
Ficou assim
while(digitalRead(switchPin2) == HIGH) { }
if (digitalRead(switchPin2) == LOW)
{
digitalWrite(motortubo, HIGH); // liga o motor do tubo
delay(6000); // fica ligado 6segundos
digitalWrite(motortubo, LOW); // desliga o motor do tubo
}
resumindo adicionei a linha que o Pedrock postou, e apaguei o ELSE como o rsoares disse.
obrigado a todos
-
while(digitalRead(switchPin2) == HIGH) { }
if (digitalRead(switchPin2) == LOW)
{
digitalWrite(motortubo, HIGH); // liga o motor do tubo
delay(6000); // fica ligado 6segundos
digitalWrite(motortubo, LOW); // desliga o motor do tubo
}
Tira o while que funciona na mesma, se só tens esse código.
-
podes apagar o while tambem.
o if so é activo quando o pino esta em LOW, sempre que estiver HIGH não faz nada.
-
Tenho mais codigo, é esse while, que faz parar e ficar á espera que o pin mude de estado para continuar a ler o resto do programa.
Aproveitando o topico, tenho outra situaçao que ainda nao sei bem como resolver, passo a explicar:
tenho outro motor que vai trabalhar e empurrar uma coisa ate bater num micro switch, quando bater no micro o motor vai parar e passar para a instruçao seguinte, mas o que preciso é que se o motor demorar mais de 10 segundos a activar o microswitch inverta a posiçao e trabalhe dois segundos invertido e depois desses 2 segundos volte a trabalhar normalmente ate bater no micro, na parte eletronica está tudo a funcionar, usei um L293D.
o codigo que tenho escrito é este:
digitalWrite(enablePin, HIGH); // Vai ligar o motor
if (digitalRead(switchPin) == HIGH) {
digitalWrite(motor1Pin1, LOW); // set pin 2 on L293D low
digitalWrite(motor1Pin2, HIGH); // set pin 7 on L293D high
}
// if the switch is low, motor will turn in the opposite direction:
else //caso contrário:
{
digitalWrite(motor1Pin1, HIGH); // set pin 2 on L293D high
digitalWrite(motor1Pin2, LOW); // set pin 7 on L293D low
delay(10000); // espera 10 segundos antes de desligar o motor
digitalWrite(enablePin, LOW); // Vai desligar o motor
esta parte "if (digitalRead(switchPin) == HIGH)" é para testes, para poder inverter a rotaçao do motor manualmente, mas é para substituir por codigo que o faça automaticamente caso um microswitch nao seja activado no espaço de 10 seguntos, se nao activar o micro inverte o motor 2 sec, inverte novamente e tenta mais 10 segundos ou até activar o micro para continuar com o codigo.
obrigado
-
usa outro while ^^
int timer1 = 0;
int timer2 = 0;
while(micro == off)
{
timer++;
if(timer1 >= 10000)
{
andar para tras;
timer2++;
if(timer2 >= 2000)
{
andar para frente
}
}
}
pseudo codigo.
atenção que o timer1 e timer2 não vai reflectir em segundos, ou seja 10000 não são 10segundos, para fazer isso tinhas de usar a função milis() para cria timers
-
usa outro while ^^
int timer1 = 0;
int timer2 = 0;
while(micro == off)
{
timer++;
if(timer1 >= 10000)
{
andar para tras;
timer2++;
if(timer2 >= 2000)
{
andar para frente
}
}
}
pseudo codigo.
atenção que o timer1 e timer2 não vai reflectir em segundos, ou seja 10000 não são 10segundos, para fazer isso tinhas de usar a função milis() para cria timers
Se adicionares "delay(1);" no fim os timers já contam milisegundos.
-
ou isso, como evito sempre usar os delay´s nem pensei nisso ^^
-
ou isso, como evito sempre usar os delay´s nem pensei nisso ^^
É verdade, os delays não são a melhor solução. Mas numa coisa simples, em que não tenhas que fazer várias coisas ao mesmo tempo, é mais fácil.
-
Tenho estado ocupado e so agora pude olhar com olhos de ver para isto, mas nao vejo muito hehehe, sou cego na materia, estive a fazer umas esperiencias e ainda nao consegui que o arduino fizesse a verificaçao sem dar erro, tambem deve ser do sono, ja lá vao 26h sem dormir e a vista começa a pesar e os neuronios tambem ja nao funcionam direito :P
o microswitch que vai parar o processo de andar para traz e para a frente é ( int switchPin)
ok ok, agora a ler o codigo para escrever aqui acho que percebi melhor a situação, nao vou alongar a conversa, amanha tento que é a tentar que se aprende, depois deixo o feedback.
Mais uma vez obrigado pela vossa ajuda