A volte ritornano disse Stephen King. Ma non voglio scomodare personaggi così in alto, ultimamente mi è capitata tra le mani una Motor Shield R3 Arduino originale:
ed ho pensato: per pilotare motori in CC ci sono migliaia di sketch nel web, del resto nasce per questo scopo, ma se volessi utilizzarla per pilotare un motore passo-passo?
Avevo già usato la motor shield fe in modo improprio per pilotare un motore passo-passo bipolare e l’esperimento aveva riscosso grande successo tra gli appassionati dei motori passo-passo.
Purtroppo la motor shield fe è venduta in kit da montare compreso il L298P in formato SMD che necessita di mano ferma, esperienza e strumentazione adeguata, insomma un vero incubo.
Da questa riflessione nasce l’idea di sostituirla nei miei tutorial con la motor shield r3 arduino e nei prossimi articoli mi procurerò anche altre shield simili che potrai utilizzare.
La motor shield r3 arduino originale
Trovi sul sito ufficiale arduino la descrizione della scheda descritta in modo eccellente, incluso il DataSheet.
Con la motor shield r3 arduino può comandare due motori in cc, come leggi nel paragrafo summary riportato sopra, o un solo motore da 4A impostando l’alimentazione esterna.
Non si cita la possibilità di utilizzarla per i motori passo-passo, infatti questa shield non nasce con questo compito.
I pin della motor shield r3 arduino
i pin della motor shield r3 arduino a cui sono collegati i motori non sono impostabili, sono:
come riportato sul sito ufficiale, nel tuo progetto con i motori passo passo useremo solo i pin di direzione e PWM tralasciando i pin Brake e current sending, valuteremo in un prossimo articolo come utilizzarli.
Lo sketch per usare la motor shield r3 arduino con i passo-passo
Mi sento in dovere di fare una precisazione, il motore passo-passo che puoi usare in questo progetto è di tipo bipolare:
/**********************************************************/ #define TIMEFASE 20 #define DEBUG #define PWMA 3 #define PWMB 11 #define DIRA 12 #define DIRB 13 /**********************************************************/ int nFase = 0; /**********************************************************/ void setup() { #ifdef DEBUG Serial.begin( 9600 ); Serial.println("Avvio"); #endif /**********************************************************/ pinMode(PWMA, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(DIRA, OUTPUT); pinMode(DIRB, OUTPUT); /**********************************************************/ } /**********************************************************/ void loop() { eseguiStep( 50,true ); stop(); delay( 1000 ); eseguiStep( 100,true ); stop(); delay( 1000 ); eseguiStep( 200,true ); stop(); delay( 3000 ); } /**********************************************************/ int fase( int nFase ) { switch( nFase ) { case 1: digitalWrite(DIRA, HIGH); digitalWrite(DIRB, LOW); digitalWrite(PWMA, HIGH); digitalWrite(PWMB, LOW); break; case 2: digitalWrite(DIRA, LOW); digitalWrite(DIRB, HIGH); digitalWrite(PWMA, LOW); digitalWrite(PWMB, HIGH); break; case 3: digitalWrite(DIRA, LOW); digitalWrite(DIRB, LOW); digitalWrite(PWMA, HIGH); digitalWrite(PWMB, LOW); break; case 4: digitalWrite(DIRA, LOW); digitalWrite(DIRB, LOW); digitalWrite(PWMA, LOW); digitalWrite(PWMB, HIGH); break; } delay(TIMEFASE); return nFase; } /**********************************************************/ int stop() { delay( 500 ); digitalWrite(DIRA, LOW); digitalWrite(DIRB, LOW); digitalWrite(PWMA, LOW); digitalWrite(PWMB, LOW); } /**********************************************************/ void eseguiStep( int passi, boolean dir ) { if ( passi <= 0 ) { return; } if ( dir ) { for ( int p=1; p<=passi; p++) { gira(); } } else { for ( int p=passi; p>=1; p--) { gira(); } } } /**********************************************************/ void gira() { nFase = (nFase+1); if ( nFase > 4 ) { nFase=1; } fase( nFase ); } /**********************************************************/
Gran parte dello sketch è descritto in questo mio precedente articolo, le differenze principali riguardano due nuove funzioni che trovi in fondo, ma parti con ordine:
linea 03: definisci una costante contenente il TIMEFASE ossia il tempo che deve trascorrere tra una fase e la successiva, questo valore determina la velocità di rotazione e può influire sul funzionamento o meno del motore;
linea 04: definisci la costate DEBUG che usi per visualizzare eventuali messaggi di debug sul monitor seriale, vedrai nella funzione setup() come viene utilizzata;
linee 06-09: definisci le costanti a cui sono connessi i pin della motor shield r3 arduino come visto nello specchietto riportato sopra;
linea 13: definisci la variabile nFase in cui memorizzi il valore della fase a cui sei arrivato.
linea 19: verifica se è definita la costante DEBUG il comando #ifdef verificca che esista e sia definita una costante, nel tuo progetto DEBUG, in caso affermativo esegue le linee di codice fino al comando #endif ( vedi linea 22 );
linee 20-21: Imposta la comunicazione con il monitor seriale a 9600 baud e scrivi “Avvio”;
linea 22: chiudi il blocco di codice #ifdef-#endif per il DEBUG;
linee 26-29: definisci la modalità di funzionamento dei pin a cui è connessa la motor shield r3 arduino come pin di tipo OUTPUT;
linea 39: richiami la funzione eseguiStep( step,verso ) questa funzione l’ho scritta io e te la descrivo di seguito, per adesso è necessario che tu comprenda i due parametri dda passare alla funzione, il primo è il numero di step da eseguire ed il secondo parametro è il verso di rotazione: true = orario, false = antiorario;
linee 40-41: ferma il motore richiamando la funzione stop() e attendi un secondo prima di procedere oltre;
linee 42-47: esegue le stesse operazioni delle linee 39-41 per un numero di differenti passi da far eseguire al motore passo-paso bipolare.
linea 53-87: è la funzione fase( nFase ) descritta nell’articolo citato, l’attività che compie è quella di spostare il motore al passo inviato tramite il parametro nFase. Ho aggiunto a questa funzione la linea 84 con il delay impostato sul TIMEFASE definito sopra. Ho anche aggiunto un return nFase (linea 86) che ritorna il valore della fase in cui è posizionato il motore alla funzione chiamante;
linee 91-98: definisci la funzione stop che attende 500 millisecondi ( linea 92 ) e poi invia il segnale LOW a tutti i pin della motor shield r3 arduino;
linee 102-106: è definita qui la funzione eseguiStep( step,direzione ) che hai richiamato alle linee 39,42,45 dello sketch. La sua caratteristica è controllare che il numero di passi da eseguire sia superiore a 0, ed in funzione del parametro dir definire un ciclo di n passi da far eseguire al motore richiamando la funzione gira();
linee 110-114: definisci una nuova funzione gira() il cui scopo è impostare la fase corrente, calcolare la fase successiva e inviare queste informazioni alla funzione fase() perchè li esegua. Per farlo alla linea 111 calcola nFase incrementando di uno il suo valore precedente, controlla che nFase non superi il valore 4 ( linea 112 ) ed infine richiama la funzione fase( nFase ) passandole il valore calcolato.
Il video demo della motor shield r3 arduino
Per mostrarti il risultato dello sketch che hai appena visto ho realizzato un video demo:
Buon divertimento !!!
Prima di inserire un commento, per favore, leggi il regolamento
37 pings
Skip to comment form
[…] arduino hai già avuto modo di vederla all’opera con i motori passo-passo in questo articolo: “Motor Shield R3 Arduino – motore passo-passo” ho deciso di utilizzarla anche per il nuovo Dolly […]
[…] qualche tempo a questa parte ho pubblicato degli articoli che usano diverse motor shield oggi ti mostro le foto della Motor Shield Arduino […]