Go Down

Topic: Avvio di 3 motori. (Read 869 times) 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