Go Down

Topic: Arduino fica maluco motores com microswitch (Read 2412 times) 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.
This... is a hobby.

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

xxscorpioxx

resposta ao fabiohbm007
sim é esse o codigo para esses dois motores, vai ter de ter mais codigo.

para ativar os motores e o soneloid estou a utilizar TIP120 com uma resistencia de 1K ligado ao pino correspondente do arduino
este esquema mas com resistencia de 1K
amanha experimento o teu codigo, principalmente a troca dos "if" por "while"

tiras-te o delay (200) mas esse acho que vai fazer falta
vê a explicaçao que dei ao bubulindo para ele estar lá,  no fundo se nao tivesse aquele atraso o motor ligava e parava logo nem saia do microswitch porque quando ele liga o micro está LOW e logo de seguida tenho a informar que se tiver LOW para parar o motor, é o ma contradiçao se eu nao puser uma pausa entre o arranque do motor , se vires o video antes de eu dizer que carreguei o novo codigo percebes o funcionamento.

Obrigado aos dois

HugoPT

Olhando a esse esquema ?o tenho uma coisa a dizer.Funciona? sim deve funcionar! É seguro ? Bom transístor eles quando queimam entram em curto, se tiveres a infelicidade do teu algum dia entrar nesse estado diz adeus ao teu micro controlador :smiley-sad-blue:
Esse motor traz algumas variáveis a isto poder acontecer! Ele gera correntes inversas, pode ter um consumo de corrente no momento do arranque alto que pode logo queimar o transístor e depois a desgraça segue.Olhando para o datasheet ele aguenta até 5 Amperes mas cuidado!!!
Uma "rule of the thumb" é nunca misturar potencia com comando!
Claro que é apenas um motor de brincadeira mas eu não faria isso. É sempre mais fácil evitar um problema que resolve-lo.
Como alternativas tens foto-acopladores, reles
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo


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


Portanto, o switch está activado e tu queres rodar o motor mais uma volta, é isso? Então tens de dar algum tempo para garantir que ele deixa de activar o switch... Ok, não é ideal, mas já percebi.

Para que são os delays de 6 segundos?

Já garantiste que o sensor de posicão que tiraste lá da impressora funciona correctamente e não dá picos que podem ser mal interpretados pelo arduino?

Como o Hugo disse, faz uma montagem melhor para os motores e não correres risco de queimar o Arduino.

Quando terminares isso, procura na net por máquina de estados, ou state machine ou finite state machine. Isso é uma maneira de programar sequências que torna tudo muito mais fácil, experimenta comecar com estados ou seja, a máquina está parada, primeira fase, segunda fase, etc...

Assim torna-se muito mais simples de fazer o programa e entender a sequência do que da forma como estás a fazer agora. Daí a tua dificuldade em "sequenciar" tudo. :)
This... is a hobby.

xxscorpioxx

Hugo, numa proxima experiencia ou caso tenha que fazer outra placa usarei foto-acopladores é uma boa ideia, com este sistema que tenho montado os tip120 estao a funcionar bem, testei indivualmente aplicando 5v na Base activa os motores e solenoid, tenho que testar os micros e sensor individualmente para ver se activam o atmega e fazem chegar o sinal á saida dos TIP.

Quote
Para que são os delays de 6 segundos?

Para entrar em pausa e nao continuar com o codigo entre o ligar de cada motor porque a peça demora talvez um ou dois segundos a cair, preciso sempre de fazer essas pausas, quando tudo funcionar podem ser ajustadas.
Esquematicamente é simples

amanha faço um video com o projeto todo para que possam perceber

bubulindo

Outro sensor para detectar quando a peca saiu do sistema permitiria que o sistema funcionasse duma forma melhor.

Melhor porque se a peca demorar mais a sair, o sistema fica parado à espera que isso aconteca (podes criar um time out no caso de ficar uma peca entalada). E no caso da peca sair mais cedo, o sistema continua a processar, ou seja, não tens tempos mortos.

Claro que, isto é apenas uma opinião... tu é que sabes se vale esse investimento ou não.
This... is a hobby.

Go Up