Go Down

Topic: Avvio di 3 motori. (Read 1 time) previous topic - next topic

Andrea94

Dovrei creare una sequenza di 3 motori che si accendono quando premo un pulsante e arrestare il ciclo in qualsiasi momento quando premo un'altro pulsante, in pratica devo fare che il 1°motore si accende per un certo tempo poi si spegne, e si accende il 2°motore per un certo tempo poi si spegne, e si accende il 3°motore per un certo tempo poi si spegne e il ciclo non rincomincia finché non premo il pulsante per riavviare il ciclo, come dicevo devo mettere anche un pulsante per arrestare il ciclo in qualsiasi punto e riavviarlo con quello di avvio. come posso fare?

ƎR

i motori sono dei normali motori DC?
se si puoi fare così:
da quel che ho capito i motori girano solo in un verso, quindi ti basta pilotarli con un transistor o con un fet per ogniuno, perchè non puoi collegarli direttamente all'arduino... lo schema pratico dei collegamenti che dovresti fare per ogni motore è questo, anche se poi bisogna dimensionare i componenti: http://www.instructables.com/files/deriv/FN3/AGFE/H1HMDLS9/FN3AGFEH1HMDLS9.LARGE.jpg
per quanto riguarda la parte software è piuttosto semplice e prima di passare a sviluppare il software è meglio sistemare tutto l'hardware
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Andrea94

i motori vengono pilotati da 3 relè ma questa parte la so già come realizzarla il problema e il software

ƎR

se i relè sono con la bobina ti serve comunque un circuito con i transistor
comunque per la parte software mi pare che tu abbia le idee abbastanza chiare sul funzionamento
se mi dici cosa non ti è chiaro provo a spiegartelo e proviamo a trovare una soluzione insieme, perchè se te lo faccio io poi tu impari poco o niente

Quote
in pratica devo fare che il 1°motore si accende per un certo tempo poi si spegne, e si accende il 2°motore per un certo tempo poi si spegne, e si accende il 3°motore per un certo tempo poi si spegne e il ciclo non rincomincia finché non premo il pulsante per riavviare il ciclo, come dicevo devo mettere anche un pulsante per arrestare il ciclo in qualsiasi punto e riavviarlo con quello di avvio


leggendo questo io farei così:
Code: [Select]

#define T 3000 // definisco periodo di durata per
               //ogni motore 3000ms = 3s

byte m=0;
unsigned long time=0;

void setup()
{
pinMode(2,INPUT); //input ON
pinMode(3,INPUT); //input OFF
pinMode(4,OUTPUT); //MOTOR 1
pinMode(5,OUTPUT); //MOTOR 2
pinMode(6,OUTPUT); //MOTOR 3
}

void loop()
{
if(m>0 && digitalRead(3)) m=0;

else if(m==0 && digitalRead(2)) m=1;

else if(m>0 && millis()-time>=T)
{
  m=m==3?1:m+1;
  time=millis();
}

digitalWrite(4,m==1);
digitalWrite(5,m==2);
digitalWrite(6,m==3);
}
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Andrea94

questo era quello che avevo scritto io:

#define SB1 2
#define M1 3
#define M2 4
#define M3 5
int stato=0;
void setup(){
pinMode(M1,OUTPUT);
pinMode(M2,OUTPUT);
pinMode(M3,OUTPUT);
pinMode(SB1,INPUT);
digitalWrite(SB1,LOW);
}
void loop(){
stato=digitalRead(SB1);
if(stato==HIGH){
digitalWrite(M1,HIGH);
delay(6000);
digitalWrite(M1,LOW);
digitalWrite(M2,HIGH);
delay(4500);
digitalWrite(M2,LOW);
digitalWrite(M3,HIGH);
delay(9000);
digitalWrite(M3,LOW);
}
else{
digitalWrite(M1,LOW),
digitalWrite(M2,LOW),
digitalWrite(M3,LOW);
}
}

solo che dovevo creare una uscita dal if prima che termini in modo tale da fermare tutto


ƎR

per quello che vuoi fare tu è fortemente sconsigliato l'utilizzo della funzione delay perchè blocca l'esecuzione del programma e non c'è modo di interromperla prima della sua fine
nel mio codice ho usato la funzione millis (http://arduino.cc/en/Reference/Millis) che ti permette di tenere sotto controllo il tempo
questa funzione ti restituisce il numero di millisecondi trascorsi da quando è iniziata l'esecuzione del programma
quindi per fare un delay di 300 puoi scrivere così:
Code: [Select]

unsigned long time=millis();
while(millis()-time<=4000)
{
}

poi se in quei 4000ms vuoi controllare che il tasto di stop venga premuto fai così:
Code: [Select]

unsigned long time=millis();
while(millis()-time<=4000)
{
if(digitalRead(SB2)==HIGH) return;
}
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Andrea94

quindi come lo dovrei correggere il mio sketch?

ƎR

eheh correggere il tuo codice mi risulta più complicato che ripensarlo perchè il tuo non è stato pensato per fare questa modifica... non ho capito se i pulsanti sono pulsanti oppure restano premuti, se restano premuti è tutto più facile :)

comunque io l'avevo pensato così
Code: [Select]

#define SB1 2
#define SB2 3
#define M1 4
#define M2 5
#define M3 6

const byte T[3]={60,45,90};
byte m=0;
unsigned long time=0;

void setup()
{
pinMode(SB1,INPUT); //input ON
pinMode(SB2,INPUT); //input OFF
pinMode(M1,OUTPUT); //MOTOR 1
pinMode(M2,OUTPUT); //MOTOR 2
pinMode(M3,OUTPUT); //MOTOR 3
}

void loop()
{
if(m>0 && digitalRead(SB1)) m=0;

else if(m==0 && digitalRead(SB2)) m=1;

else if(m>0 && millis()-time>=T[m-1]*100)
{
  m=m==3?1:m+1;
  time=millis();
}

digitalWrite(M1,m==1);
digitalWrite(M2,m==2);
digitalWrite(M3,m==3);
}
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

fuscof

Ciao,
io ho avuto un problema analogo con delle ... tapparelle. Con un comando OPENALL aziono 5 motori, ognuno con i suoi tempi e analogamente con un pulsante CLOSEALL ne aziono la chiusura. Pero' ogni motore ha i suoi tempi e per evitare sequenzializzazioni, ho realizzato un diagramma a stati ciascuno per ogni motore.
Se vuoi qualche idea questo e' il sito trovi anche il codice.
http://www.remoteaccesscontrol.it/index.php/other-projects
Ne ho realizzato una nuova versione: per evitare che i motori partano nello stesso istante (con sbalzi di tensione) ho inserito un tempo di attesa per ogni motore (ma senza usare delay()). In pratica nel ciclo loop{} verifico se e' trascorso il tempo opportuno prima di azionare il motore.

Ciao
Francesco

marconsnc

---------------------------------------------------------------------------------------------------------------
#define T 3000 // definisco periodo di durata per
               //ogni motore 3000ms = 3s

byte m=0;
unsigned long time=0;

void setup()
{
pinMode(2,INPUT); //input ON
pinMode(3,INPUT); //input OFF
pinMode(4,OUTPUT); //MOTOR 1
pinMode(5,OUTPUT); //MOTOR 2
pinMode(6,OUTPUT); //MOTOR 3
}

void loop()
{
if(m>0 && digitalRead(3)) m=0;

else if(m==0 && digitalRead(2)) m=1;

else if(m>0 && millis()-time>=T)
{
  m=m==3?1:m+1;
  time=millis();
}

digitalWrite(4,m==1);
digitalWrite(5,m==2);
digitalWrite(6,m==3);
}
--------------------------------------------------------------------------------------------------------
Scusa  3R... potresti tradurmi i passaggi?

perdonami ma sono un novellino e vorrei capire...... questa funzione mi serve x un progr più complesso...

marconsnc

... mi son reso conto di aver commesso un errore...... ho saltato un passaggio del regolamento... chiedo scusa...

rifaccio:
Code: [Select]
#define T 3000 // definisco periodo di durata per
               //ogni motore 3000ms = 3s

byte m=0;
unsigned long time=0;

void setup()
{
pinMode(2,INPUT); //input ON
pinMode(3,INPUT); //input OFF
pinMode(4,OUTPUT); //MOTOR 1
pinMode(5,OUTPUT); //MOTOR 2
pinMode(6,OUTPUT); //MOTOR 3
}

void loop()
{
if(m>0 && digitalRead(3)) m=0;

else if(m==0 && digitalRead(2)) m=1;

else if(m>0 && millis()-time>=T)
{
  m=m==3?1:m+1;
  time=millis();
}

digitalWrite(4,m==1);
digitalWrite(5,m==2);
digitalWrite(6,m==3);
}


Se l' autore "3r", nonostante il mio approccio sbagliato, potesse aiutarmi sarebbe fantastico..... Grazie mille...

gpb01

@ marconsnc : vedo solo del normale codice C ... in particolare cosa non ti è chiaro ???  :smiley-roll:

Guglielmo
Search is Your friend ... or I am Your enemy !

ƎR


Se l' autore "3r", nonostante il mio approccio sbagliato, potesse aiutarmi sarebbe fantastico..... Grazie mille...

Certo, mi dici quali parti di quel codice non capisci?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy