Go Down

Topic: Arduino fica maluco motores com microswitch (Read 1 time) previous topic - next topic

xxscorpioxx

Boas ppl

estou a construir um projeto, parte mecanica ja feita e pcb tambem, estou a usar o atmega328 numa placa que eu fiz o problema esta no codigo sou muito noob e estou-me a passar  :smiley-eek:

tenho varios motores  que quero que squencialmente  sejam activados e mandados parar por microswitchs quando ponho o codigo para um tudo funciona bem, quando meto o codigo para ligar outro fica tudo maluco.


int motor1 = 3; // motor do alimentador
int switchPin1 = 6;    // switch input para parar motor do alimentador
int switchPin2 = 2;  //switch input para parar motor do tubo
int motortubo = 5;  //motor do tubo


void setup() {
pinMode(motor1, OUTPUT);
pinMode(switchPin1, INPUT);
pinMode(switchPin2, INPUT);
pinMode(motortubo, OUTPUT);
}


void loop(){
digitalWrite(motor1,HIGH);
delay(200);
if (digitalRead(switchPin1) == LOW)
{
digitalWrite(motor1, LOW); // desliga o motor do tubo
delay(6000);
}

//até aqui tudo bem a intençao é por o motor a dar uma volta e parar quando bater no microswitch, funciona direitinho com este codigo

depois de do motor1 parar quero que ligue outro e meto o seguinte codigo


if (digitalRead(switchPin4) == LOW)
{
  digitalWrite(motortubo,HIGH);
  delay(50);
  digitalWrite(motortubo,LOW);
  delay(6000);
  }

mas o que acontece é que o primeiro motor trabalha continuamente e o segundo por vezes liga, a intençao do segundo é dár so um impulso por isso tem um delay de 50

alguma alma caridosa para dar uma ajuda? se for preciso faço um video para demonstrar o que acontece, desde ja obrigado

xxscorpioxx

#1
Dec 01, 2012, 07:46 pm Last Edit: Dec 01, 2012, 08:52 pm by xxscorpioxx Reason: 1
aqui esta o link do video
http://youtu.be/3HsbOb070Bw


32 Views ninguem dá uma dica?

bubulindo

Se o primeiro motor desliga com o microswitch, para que é o delay de 200 milisegundos?

o que é o switchpin4? que estado é que normalmente está?

o facto de usares delays e esperares por eventos torna tudo mais complexo porque qualquer evento que aconteça enquanto um delay estiver a ser processado não é visto pelo arduino.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

fabio_h

#3
Dec 02, 2012, 05:33 pm Last Edit: Dec 02, 2012, 05:58 pm by fabiohbm007 Reason: 1
Code: [Select]
int motor1 = 3; // motor do alimentador
int switchPin1 = 6;    // switch input para parar motor do alimentador
int switchPin2 = 2;  //switch input para parar motor do tubo
int motortubo = 5;  //motor do tubo

void setup() {
pinMode(motor1, OUTPUT);
pinMode(switchPin1, INPUT);
pinMode(switchPin2, INPUT);
pinMode(motortubo, OUTPUT);
}

void loop(){
digitalWrite(motor1,HIGH);
delay(200);
if (digitalRead(switchPin1) == LOW)
{
digitalWrite(motor1, LOW); // desliga o motor do tubo
delay(6000);
}

if (digitalRead(switchPin4) == LOW)
{
  digitalWrite(motortubo,HIGH);
  delay(50);
  digitalWrite(motortubo,LOW);
  delay(6000);
  }

Esse é o codigo utilizado?
Algumas considerações...
-No codigo, vocÊ não liga o pullup dos pinos de input, então você usa resistores por fora certo?
qual o valor do resistor? deve-se usar resistores de 1K ou menores, porque as entradas do arduino são muito sensiveis e motores DC com escovas geram muita interferência causando falsos acionamentos...
-Se o motortubo deve ser acionado somente apos o motor1 ele deve estar dentro  do primeiro IF do switch1 e como disse o bubulino delays deixam o arduino inoperante, retire-os...
-o seu conjunto mecanico pode apresentar um comportamento elastico(na hora que chega no final de curso, bate e volta um pouquinho) desacionando o switch, por isso que as vezes o motortubo liga e outras não...

Veja se esse codigo te ajuda:

Code: [Select]

int motor1 = 3; // motor do alimentador
int switchPin1 = 6;    // switch input para parar motor do alimentador
int switchPin2 = 2;  //switch input para parar motor do tubo
int motortubo = 5;  //motor do tubo

void setup() {
pinMode(motor1, OUTPUT);
digitalWrite(motor1, LOW);//apenas para garantir que o motor inicie desligado...
pinMode(switchPin1, INPUT);
digitalWrite(switchPin1,HIGH);//liga o pullup interno, mesmo assim coloque um resistor externo de 1k para vcc
pinMode(switchPin2, INPUT);
digitalWrite(SwitchPin2,HIGH);//liga o pullup interno, mesmo assim coloque um resistor externo de 1k para vcc
pinMode(motortubo, OUTPUT);
digitalWrite(motortubo, LOW);//apenas para garantir que o motor inicie desligado...
}

void loop(){
digitalWrite(motor1,HIGH);
//delay(200); //delay retirado
while(digitalRead(switchPin1)){} //enquanto estiver em HIGH (desacionado) ele fica verificando
//se descer aqui significa que o switch foi pressionado...
digitalWrite(motor1, LOW); // desliga o motor do tubo
delay(50);//da um tempo para o sistema mecanico estabilizar?ou o objeto/peça acionar o
switchPin2, talvez nem seja necessário...
while(digitalRead(switchPin2)){}//só sai daqui na hora que acionar o switch2
digitalWrite(motortubo,HIGH);
delay(50);
digitalWrite(motortubo,LOW);
//acabou o ciclo
//aqui teria que verificar se os switchs continuam pressionados para poder zerar o sistema mecanico
while(!digitalRead(switchPin2)){digitalWrite(motortubo,HIGH);}//liga o motor apenas para desacionar o switch2, nem entra aqui se o switch tiver desacionado...
digitalWrite(motortubo,LOW);
while(digitalRead(switchPin1)){digitalWrite(motor1, HIGH);}// o mesmo que o while anterior...
digitalWrite(motor1, LOW);
//mecanismo zerado... EDIT: talvez para um funcionamento correto o zeramento tambem deva ser feito no setup() para garantir o inicio correto do sistema
  delay(6000);
  }

Bom, lembrando que esse codigo pode causar danos no seu mecanismo por eu não ver o funcionamento real, use por sua conta e risco...

Dica: tente desenhar com fluxogramas/balõezinhos o funcionamento do sistema, isso ajuda demais na escrita do codigo.

xxscorpioxx

xiiiiiiiiii so agora vi que tinham ajudado, um dia perdido quando podia ter feito algo :0

respostas ao bubulindo
Quote
Se o primeiro motor desliga com o microswitch, para que é o delay de 200 milisegundos?


na realidade após muitas experiencias foi assim que consegui por o motor a funcionar direito

digitalWrite(motor1,HIGH); //o motor liga
delay (200); //este deley é para não verificar o estado do switchPin1 enquanto ele esta HIGH, portanto é um atraso para quando passar para a linha de baixo o motor rodar até activar o switch e o passar a LOW
if (digitalRead(switchPin1) == LOW)
{
digitalWrite(motor1, LOW);
delay(6000);
}

Quote
o que é o switchpin4? que estado é que normalmente está?

está HIGH, o mecanismo do primeiro motor  deixa cair uma peça e passa a LOW, na verdade ai nao está um switch mas um sensor daqueles de impressora, emissor e recetor.

uso delays por ser mais facil nesta fase que pouco percebo de programaçao e porque no total preciso de ativar 3 motores e 1 soneloid, um de cada vez, nada esta ligado direto ao atmega, é tudo alimentado por um trasformador de 7.5v dos quais tiro os 5v para o atmega com um 7805 filtrado por condençadores

Go Up