Pages: [1]   Go Down
Author Topic: Avvio di 3 motori.  (Read 708 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

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

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
}
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

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

Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
unsigned long time=millis();
while(millis()-time<=4000)
{
 if(digitalRead(SB2)==HIGH) return;
}
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

quindi come lo dovrei correggere il mio sketch?
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

comunque io l'avevo pensato così
Code:
#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);
}
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

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
Logged

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

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

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

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

rifaccio:
Code:
#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...
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 113
Posts: 5952
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guglielmo
Logged

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

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Pages: [1]   Go Up
Jump to: