/* * Prova per la verifica del funzionamento di un motore passo-passo con modulo L298N * Motorino in prova di tipo unipolare oppure bipolare passo-passo. * L'elemento comune (in genere il file rosso) dei motore unipolari viene tralasciato * ed il motorino viene inteso come motorino bipolare * Ottobre 2016 * Autore Prof. A. Celentano */ const int Unipolare = 1 ; const int Bipolare = 2 ; byte Fase1 = 5; byte Fase2 = 6; byte Fase3 = 7; byte Fase4 = 8; int Ritardo = 15 ; char Comando[] = "Buffer per ricevere comando puntatore! *(Comando+i) ed Comando[i] char OldComando[] = "Buffer per ricevere old comando" ; int LenComando = 0 ; int TipoMoto = 0 ; int TipoMotore = Unipolare ; bool A,B,C,D ; int i; " ; // definisce un'area di memoria ed un // sono equivalenti le sintassi: void setup() Serial.begin(9600); while(!serial) Serial.println("---COMANDI---") ; Serial.println("unipolare : imposta il tipo di motore Unipolare") ; Serial.println("bipolare : imposta il tipo di motore Bipolare") ; Serial.println("avanti : attiva moto in senso orario") ; Serial.println("indietro : attiva moto in senso anti-orario") ; Serial.println("stop : arresta il moto") ; Serial.println("p+ : esegue un passo in senso orario") ; Serial.println("p- : esegue un passo in senso anti-orario") ; Serial.println("* : Azzera il buffer dei comandi") ; Serial.println("r : Ripete l'ultimo comando eseguito") ; Serial.println("d+ : aumenta di 1 m-sec. il delay tra le fasi") ; Serial.println("d- : diminuisce di 1 m-sec. il delay tra le fasi") ; Serial.println("d=n : imposta il delay tra le fasi ad n-millisec.") ; Serial.println("s= : imposta la sequenza delle fasi, esempio s=+0100 oppure s=-1000") ; Serial.println("1/4+ : esegue un 1/4 di passo in senso orario (solo unipolare)") ; Serial.println("1/4- : esegue un 1/4 di passo in senso anti-orario (solo unipolare)") ; Serial.println("1/2+ : esegue un 1/2 di passo in senso orario (solo bipolare)") ; Serial.println("1/2- : esegue un 1/2 di passo in senso anti-orario (solo bipolare)") ; Serial.print("Tipo di motore impostato: ") ; if( TipoMotore == Unipolare ) Serial.println("Unipolare"); Serial.println("Bipolare"); pinmode( Fase1, OUTPUT ) ; pinmode( Fase2, OUTPUT ) ; pinmode( Fase3, OUTPUT ) ; pinmode( Fase4, OUTPUT ) ; Sequenza( "+", LOW, LOW, LOW, LOW ) ; void loop() LeggiComando() ; DecodificaComando() ; EseguiComando() ;
/* +---------------------------------------------------+ Legge il comando inviato tramite seriale La funzione controlla la presenza di byte nel buffer seriale e, se ci sono, li accoda nel buffer 'Comando'. La funzione intercetta il comando * che permette di azzerare il buffer 'Comando' ed il comando r che permette di ripetere l'invio dell'ultimo comando eseguito. I comandi devono terminare con il terminatore NL (NewLine) che ha codice 10 Dimensionamento esterno char *Comando = "digitare trenta caratteri!" ; int LenComando = 0 ; Autore Prof. Aniello Celentano Data Ottobre 2016 +---------------------------------------------------+ */ void LeggiComando() byte k=0 ; if( Serial.available() > 0 ) while( true ) if( Serial.available() > 0 ) LenComando++ ; Comando[LenComando-1] = Serial.read() ; if( Comando[LenComando-1] == 10 ) break ; Comando[LenComando-1]='\0' ; if( Comando[0] == '*' ) Serial.println("***Buffer azzerato***"); if( Comando[0] == 'r' ) strcpy( Comando, OldComando ); LenComando=1; Serial.println("***Ripetizione comando***"); Serial.print("Comando ricevuto: ["); Serial.print( Comando ); Serial.print("] lung. = "); Serial.println( strlen(comando) ); void DecodificaComando() if(lencomando>0) for(i=0;i<9;i++) if( Comando[i]!= *( ("unipolare")+i ) ) break; if(i==9) TipoMotore=Unipolare; LenComando=0; SalvaComando() ; Serial.print("Tipo di motore impostato: Unipolare") ; return; for(i=0;i<8;i++) if( Comando[i]!= *( ("bipolare")+i ) ) break; if(i==8) TipoMotore=Bipolare; LenComando=0; SalvaComando() ; Serial.print("Tipo di motore impostato: Bipolare") ; return; for(i=0;i<6;i++) if( Comando[i]!= *( ("avanti")+i ) ) break; if(i==6) TipoMoto=1; LenComando=0; SalvaComando() ; return; for(i=0;i<8;i++) if( Comando[i]!= *( ("indietro")+i ) ) break; if(i==8) TipoMoto=2; LenComando=0; SalvaComando() ; return;
if( Comando[i]!= *( ("stop")+i ) ) break; if(i==4) TipoMoto=3; LenComando=0; SalvaComando() ; return; if( Comando[i]!= *( ("p+")+i ) ) break; TipoMoto=4; LenComando=0; SalvaComando() ; return; if( Comando[i]!= *( ("p-")+i ) ) break; TipoMoto=5; LenComando=0; SalvaComando() ; return; if( Comando[i]!= *( ("1/4+")+i ) ) break; if(i==4) TipoMoto=6; LenComando=0; SalvaComando() ; return; if( Comando[i]!= *( ("1/4-")+i ) ) break; if(i==4) TipoMoto=7; LenComando=0; SalvaComando() ; return; if( Comando[i]!= *( ("1/2+")+i ) ) break; if(i==4) TipoMoto=8; LenComando=0; SalvaComando() ; return; if( Comando[i]!= *( ("1/2-")+i ) ) break; if(i==4) TipoMoto=9; LenComando=0; SalvaComando() ; return; if( Comando[i]!= *( ("d+")+i ) ) break; SalvaComando() ; Ritardo++ ; return; if( Comando[i]!= *( ("d-")+i ) ) break; SalvaComando() ; Ritardo-- ; if(ritardo<1) Ritardo=1; return; if( Comando[i]!= *( ("d=")+i ) ) break; SalvaComando() ; sscanf( Comando+2, "%i", &i ); if(i<1) i=1; Serial.print("delay tra le fasi "); Serial.print(i); Serial.println(" m-sec." ); Ritardo = i; return; if( Comando[i]!= *( ("s=")+i ) ) break; SalvaComando() ; if( Comando[2]=='0' ) A=LOW; A=HIGH; if( Comando[3]=='0' ) B=LOW; B=HIGH; if( Comando[4]=='0' ) C=LOW; C=HIGH; if( Comando[5]=='0' ) D=LOW; D=HIGH; Sequenza("+",A,B,C,D) ; return; /* Segmento software di prova i=trovacarattere('='); if(i>0) Serial.print("uguale in "); Serial.println( i );
Comando[i]=0; // spezza la stringa Comando in due parti! Serial.print("parte nome var. "); Serial.println( Comando ); Serial.print("parte numerica "); Serial.println( Comando+i+1 ); sscanf( Comando+i+1, "%i", &i ); // sintassi sscanf: <buffer di lettura>, <formato>, <puntatore var.> Serial.print("i = (ricavato) "); Serial.println( i ); */ LenComando=0; return; void EseguiComando() // Avanti if( TipoMoto==1 ) if( TipoMotore == Unipolare ) Sequenza( "+", HIGH, LOW, LOW, LOW ) ; Sequenza( "+", LOW, HIGH, LOW, LOW ) ; Sequenza( "+", LOW, LOW, HIGH, LOW ) ; Sequenza( "+", LOW, LOW, LOW, HIGH ) ; Sequenza( "+", HIGH, LOW, HIGH, LOW ) ; Sequenza( "+", LOW, HIGH, LOW, HIGH ) ; return ; // Indietro if( TipoMoto==2 ) if( TipoMotore == Unipolare ) Sequenza( "-", HIGH, LOW, LOW, LOW ) ; Sequenza( "-", LOW, HIGH, LOW, LOW ) ; Sequenza( "-", LOW, LOW, HIGH, LOW ) ; Sequenza( "-", LOW, LOW, LOW, HIGH ) ; Sequenza( "-", HIGH, LOW, HIGH, LOW ) ; Sequenza( "-", LOW, HIGH, LOW, HIGH ) ; return ; // Stop if( TipoMoto==3 ) Sequenza( "+", LOW, LOW, LOW, LOW ) ; return ; // Un passo completo in avanti if( TipoMoto==4 ) if( TipoMotore == Unipolare ) Sequenza( "+", HIGH, LOW, LOW, LOW ) ; Sequenza( "+", LOW, HIGH, LOW, LOW ) ; Sequenza( "+", LOW, LOW, HIGH, LOW ) ; Sequenza( "+", LOW, LOW, LOW, HIGH ) ; Sequenza( "+", HIGH, LOW, HIGH, LOW ) ; Sequenza( "+", LOW, HIGH, LOW, HIGH ) ; return ; // Un passo completo indietro if( TipoMoto==5 ) if( TipoMotore == Unipolare ) Sequenza( "-", HIGH, LOW, LOW, LOW ) ; Sequenza( "-", LOW, HIGH, LOW, LOW ) ; Sequenza( "-", LOW, LOW, HIGH, LOW ) ; Sequenza( "-", LOW, LOW, LOW, HIGH ) ; Sequenza( "-", HIGH, LOW, HIGH, LOW ) ; Sequenza( "-", LOW, HIGH, LOW, HIGH ) ; return ;
// Esegue 1/4 di passo in avanti if( TipoMoto==6 && TipoMotore == Unipolare) A=digitalRead(Fase1); B=digitalRead(Fase2); C=digitalRead(Fase3); D=digitalRead(Fase4); if( (A B C D) == false ) Sequenza( "+", HIGH, LOW, LOW, LOW ) ; Sequenza( "+", D, A, B, C ) ; return ; // Esegue 1/4 di passo indietro if( TipoMoto==7 && TipoMotore == Unipolare) A=digitalRead(Fase4); B=digitalRead(Fase3); C=digitalRead(Fase2); D=digitalRead(Fase1); if( (A B C D) == false ) Sequenza( "-", LOW, LOW, LOW, HIGH ) ; Sequenza( "-", D, A, B, C ) ; return ; // Esegue 1/2 di passo avanti if( TipoMoto==8 && TipoMotore == Bipolare) A=digitalRead(Fase1); if( A == LOW ) Sequenza( "+", HIGH, LOW, HIGH, LOW ) ; Sequenza( "+", LOW, HIGH, LOW, HIGH ) ; return ; // Esegue 1/2 di passo indietro if( TipoMoto==9 && TipoMotore == Bipolare) D=digitalRead(Fase4); if( D == LOW ) Sequenza( "-", HIGH, LOW, HIGH, LOW ) ; Sequenza( "-", LOW, HIGH, LOW, HIGH ) ; return ; void Sequenza( char *Rotazione, bool X1, bool X2, bool X3, bool X4 ) if( *Rotazione == '+' ) digitalwrite( Fase1, X1 ) ; delay( Ritardo ) ; digitalwrite( Fase2, X2 ) ; delay( Ritardo ) ; digitalwrite( Fase3, X3 ) ; delay( Ritardo ) ; digitalwrite( Fase4, X4 ) ; delay( Ritardo ) ; return ; if( *Rotazione == '-' ) digitalwrite( Fase4, X1 ) ; delay( Ritardo ) ; digitalwrite( Fase3, X2 ) ; delay( Ritardo ) ; digitalwrite( Fase2, X3 ) ; delay( Ritardo ) ; digitalwrite( Fase1, X4 ) ; delay( Ritardo ) ; return ; void SalvaComando() strcpy( OldComando, Comando ); int TrovaCarattere( byte CodiceAscii )
for( int j=0 ; j<strlen( Comando ) ; j++) if( Comando[j] == CodiceAscii ) return j; return -1;