Pages: [1]   Go Down
Author Topic: Arduino fica maluco motores com microswitch  (Read 1664 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aqui esta o link do video
http://youtu.be/3HsbOb070Bw


32 Views ninguem dá uma dica?
« Last Edit: December 01, 2012, 02:52:33 pm by xxscorpioxx » Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3225
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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).

0
Offline Offline
Full Member
***
Karma: 3
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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:
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.
« Last Edit: December 02, 2012, 11:58:55 am by fabiohbm007 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

xiiiiiiiiii so agora vi que tinham ajudado, um dia perdido quando podia ter feito algo smiley-mad

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1545
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3225
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

xiiiiiiiiii so agora vi que tinham ajudado, um dia perdido quando podia ter feito algo smiley-mad

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. smiley
Logged

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).

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3225
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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).

Pages: [1]   Go Up
Jump to: