Controllare motori passo a passo con Arduino

Ho deciso di scrivere questo articolo perché, trovandomi nella necessità di sviluppare un progetto che utilizza motori passo a passo, ho riscontrato che le guide disponibili in rete sono spesso lacunose o di difficile comprensione.

Come funziona un motore passo a passo?

Introdurrò in linea generale il principio di funzionamento, per gli aspetti matematico-fisici rimando alla mia tesi di laurea; è importante avere ben chiaro il funzionamento, in modo da capire come è meglio programmare Arduino. Wikipedia scrive: i motori passo-passo sono motori che, a differenza di tutti gli altri, hanno come scopo quello di mantenere fermo l’albero in una posizione di equilibrio: se alimentati si limitano infatti a bloccarsi in una ben precisa posizione angolare. Solo indirettamente è possibile ottenerne la rotazione: occorre inviare al motore una serie di impulsi di corrente, secondo un’opportuna sequenza, in modo tale da far spostare, per scatti successivi, la posizione di equilibrio. È così possibile far ruotare l’albero nella posizione e alla velocità voluta semplicemente contando gli impulsi ed impostando la loro frequenza, visto che le posizioni di equilibrio dell’albero sono determinate meccanicamente con estrema precisione.

L’elettromagnete in alto (1) viene eccitato, attraendo il dente più vicino di un attrezzo a forma di rotore metallico. Con il dente allineato all’elettromagnete 1, inizierà la rotazione verso l’elettromagnete 2.

Fase 1 motore passo

Fase 2 motore

 

 

 

 

 

 

L’elettromagnete in alto (1) viene spento e viene eccitato l’elettromagnete a destra (2), tirando il dente successivo leggermente verso destra. Questo processo produce una rotazione di 3.6° in questo esempio.

Fase 3 motore

fase 4 motore

 

 

 

 

 

 

L’elettromagnete a sinistra (4) viene eccitato, si ha un’altra rotazione di 3.6°. Quando l’elettromagnete in alto (1) sarà di nuovo eccitato, i denti del rocchetto dovranno ruotare nella posizione successiva; poiché vi sono 25 denti, occorrono 100 passi per realizzare una rotazione completa.

Unipolare o Bipolare?

Negli shop online trovate la possibilità di acquistare motori bipolari (generalmente a 4 fili) e motori unipolari (a 8 fili). La differenza consiste che mentre nel bipolare i magneti 1-3 e i magneti 2-4 condividono la stessa linea di alimentazione, negli unipolari le linee di alimentazione sono distinte per ogni magnete. I più diffusi sono i bipolari, perché richiedono dei sistemi di controllo più semplici, ma se avete a disposizione un unipolare, basta accoppiare opportunamente i fili di alimentazione ed otterrete un bipolare. La guida prenderà come esempio i motori bipolari.

Il driver

Per far muovere il motore è necessario dotarsi di un driver, un circuito che fornisce le tensioni e le correnti necessarie; ce ne sono diversi, ma conviene prendere quelli più evoluti, che hanno una logica integrata e sopratutto la possibilità del controllo in micropasso. Per chi volesse approfondire a livello di integrato, rimando al  Blog di Mauro Alfieri.

Il driver che utilizzerò io è PiBot Stepper Motor Driver Rev2.2; i collegamenti e le istruzioni per questo driver sono praticamente identiche per la maggior parte dei dispositivi recuperabili in commercio.

Analizziamo i collegamenti:

Prima di tutto serve individuare le fasi del motore, ed anche qui rimando al Blog di Mauro Alfieri. Una volta individuate le fasi le colleghiamo al driver secondo lo schema elettrico (ATTENZIONE, i colori dei cavi dipendo spesso dalla fantasia del produttore, quindi controllate sempre le fasi come da guida):

input-and-outputAll’ingresso di input 1A (o 1B) colleghiamo l’alimentazione per il motore; ricordatevi che più è alta la tensione di alimentazione (ovviamente entro i limiti segnati dal produttore) e più performante sarà il vostro motore. Ora passiamo ai collegamenti lato Arduino (in basso a destra):

  1. en: significa enable. Quando a questo ingresso c’è una tensione alta (3,3 – 5 V) il motore è alimentato. Questo non significa che si muove, ma che sta tenendo la posizione; viene generata una “coppia di tenuta” e se noi proviamo a muovere con le mani l’asse del motore, noteremo che opporrà resistenza. Se togliamo l’alimentazione il motore gira a vuoto; ovviamente nelle fasi di rotazione, su enable ci deve essere la tensione di attivazione.
  2. dir: significa direzione. Quando c’è una tensione il motore gira in un senso, quando non c’è gira nel senso opposto.
  3. clk: significa clock. Qui c’è il cuore per mettere in rotazione il motore. Infatti ogni qualvolta arriva uno stato logico alto, il motore avanzerà di un passo; a seguire ci deve essere uno stato logico basso. Quindi con la sequenza alto-basso facciamo avanzare il motore; è facile dedurre che maggiore è la frequenza con cui avviene questa sequenza e maggiore sarà la velocità di rotazione.
  4. gnd: massa

Colleghiamo ad Arduino

Il terminale di Enable se vogliamo possiamo collegarlo direttamente ai 5V di Arduino; ovviamente così facendo il motore sarà sempre in tensione. Nel caso invece vogliamo spegnere ed accendere il motore, lo colleghiamo ad un uscita digitale; dir e clk li colleghiamo ad un uscita digitale a nostro piacimento.

Programmiamo Arduino (il brutto codice):

ho scritto brutto codice, perché è quello che più frequentemente di trova nel web. Non è per nulla ottimizzato per controllare un motore passo-passo, ma funziona ed è didatticamente valido:

int DIR = 2;
int CLK = 3;
int EN = 4;
 
void setup() {
	pinMode(DIR, OUTPUT);
	pinMode(CLK, OUTPUT);
	pinMode(EN, OUTPUT);
}
 
void loop()
{
	digitalWrite(EN,HIGH);
	digitalWrite(DIR,HIGH);
        delay(50);
	for ( int i=0; i<200; i++) 
	{ 
	  stepGo(); delay(10); 
	}
	digitalWrite(DIR,LOW);
	for ( int i=0; i<200; i++) 
	{ 
	  stepGo(); delay(10); 
	}
	digitalWrite(EN,LOW);	
}
 
void stepGo() {
        digitalWrite(CLK, HIGH);
        delayMicroseconds(100);
        digitalWrite(CLK, LOW);
        delayMicroseconds(100);
}

Come sempre abbiamo dichiarato i pin di uscita ed indicizzati, analizziamo il voip loop()

digitalWrite(EN,HIGH);
digitalWrite(DIR,HIGH);

con la prima linea alimentiamo il motore, mentre con la seconda definiamo il senso di rotazione.

for ( int i=0; i<200; i++) 
 { 
  stepGo(); delay(10); 
 }

qui inizia un semplice ciclo che richiama la funzione stelGo() che ora vediamo:

void stepGo() {
 digitalWrite(CLK, HIGH);
 delayMicroseconds(100);
 digitalWrite(CLK, LOW);
 delayMicroseconds(100);
}

qui viene generata la sequenza alto-basso che fa avanzare di un passo alla volta il motore. Il delayMicroseconds() tra uno stato logico alto e basso è necessario per dare fisicamente al motore il tempo di avanzare, se non ci fosse, il motore inizierebbe a fischiare con aggiunta di rumori inquietanti. Ovviamente variando l’intervallo variamo la velocità di rotazione; più il delay è basso e più veloci si va.

Perché brutto codice? Per la presenza del delay(); tenete presente che in modalità full-step (passo intero, in fondo all’articolo spiego il micropasso), nella maggior parte degli attuatori in commercio ci vogliono 200 passi per fare un giro completo. Il delay() ha l’effetto di bloccare qualsiasi altra funzione della scheda arduino, in pratica rimane in “sospeso” finché non è trascorsa la pausa. Capite bene che se oltre al motori avete collegati sensori, pannelli LCD o altro, vi ritrovate con la scheda ferma anche per diversi secondi durante l’avanzamento del motore il che è una cosa da evitare.

Un codice buono:

int DIR = 2;
int CLK = 3;
int EN = 4;

boolean motorStatus = false;
unsigned long onDuration = 100;
unsigned long offDuration = 100;
unsigned long NextToggle = micros() + offDuration;
 
void setup() {
	pinMode(DIR, OUTPUT);
	pinMode(CLK, OUTPUT);
	pinMode(EN, OUTPUT);
} 
void loop()
{
	digitalWrite(EN,HIGH);
	digitalWrite(DIR,HIGH);
    delay(50);
	for ( int i=0; i<200; i++) 
	{ 
          if (micros() > NextToggle) 
          {
		stepGo(CLK);
          }
	}
	digitalWrite(DIR,LOW);
	
        for ( int i=0; i<200; i++) 
        {
	  if (micros() > NextToggle) 
          {
		stepGo(CLK);
          }
        }
	digitalWrite(EN,LOW);	
}
 
void stepGo(int CLK){
motorStatus = !motorStatus;
digitalWrite(CLK,motorStatus);
if (motorStatus)
{
NextToggle = micros() + onDuration;
}
else
{
NextToggle = micros() + offDuration;
}
}

Rispetto al precedente ho aggiunto qualche variabile:

boolean motorStatus = false;
unsigned long onDuration = 100;
unsigned long offDuration = 100;
unsigned long NextToggle = micros() + offDuration;

micros() restituisce il valore in microsecondi del tempo trascorso dall’accensione della scheda Arduino.

All’interno dei cicli for è comparso:

if (micros() > NextToggle)

mentre la funzione è cambiata in:

void stepGo(int CLK){
motorStatus = !motorStatus;
digitalWrite(CLK,motorStatus);
if (motorStatus)
{
NextToggle = micros() + onDuration;
}
else
{
NextToggle = micros() + offDuration;
}
}

Il principio di funzionamento è abbastanza semplice. Viene salvato nella variabile NextToggle il tempo trascorso dall’accensione della scheda più un valore definito. Ad ogni ciclo di loop il valore restituito da micros() ovviamente aumenta, finché non diventa maggiore di NextToggle, attivando la chiamata alla funzione.

In void stepGo la prima operazione eseguita è un cambio di livello logico rispetto al precedente (ricordate la sequenza alto-basso necessaria per l’avanzamento?), e si ha la scrittura di questo nel pin di CLK (digitalWrite(CLK,motorStatus;). L’if serve solo a poter definire un tempo differente tra il livello logico alto ed il livello logico basso, andando comunque ad implementare il valore di NextToggle. Quindi la funzione si risolve e si torna in loop dove reinizia il ciclo.

Con questo codice riusciamo a definire un tempo per il livello logico alto e per quello basso, senza dover utilizzare il delay().

Il codice migliore:

il controllo dei motori passo è una delle cose più interessanti da fare con Arduino e quindi non è tardato molto prima che qualcuno scrivesse una libreria dedicata, che si chiama Stepper e la troviamo tra gli esempi.

#include <Stepper.h>

int DIR = 2;
int CLK = 3;
int EN = 4;
int steps = 1;
int velocita = 1500;
 
 Stepper stepGo(steps, DIR, CLK);
 
void setup() {
	pinMode(DIR, OUTPUT);
	pinMode(CLK, OUTPUT);
	pinMode(EN, OUTPUT);
} 
void loop()
{
	digitalWrite(EN,HIGH);
	digitalWrite(DIR,HIGH);
        stepGo.setSpeed(velocita);
        delay(50);
	for ( int i=0; i<200; i++) 
	{ 
        stepGo.step(steps);
	}
	digitalWrite(DIR,LOW);
	
        steps=-1;
        for ( int i=0; i<200; i++) 
        {
       stepGo.step(steps);
        }
	digitalWrite(EN,LOW);	
}

questa libreria ha diverse modalità di funzionamento, io analizzo quello concorde agli esempi precedenti:

Stepper stepGo(steps, DIR, CLK);

abbiamo definito la funzione stepGo, che riceve 3 input:

  1. il numero di passi che deve fare ogni volta che viene chiamata;
  2. il pin su cui è collegato il Dir del nostro driver;
  3. il pin su cui è collegato il CLK del nostro driver.

Si imposta la velocità:

 stepGo.setSpeed(velocita);

Quindi ogni qualvolta viene richiamata la funzione, viene fatto avanzare il motore di un numero definito di passi:

stepGo.step(steps);

Per poter far andare il motore in senso inverso basta definire un numero di passi negativo:

steps=-1;

Rispetto ai codici analizzati prima, questa libreria è decisamente più versatile e sopratutto si possono controllare più motori con la stessa funzione, inserendo semplicemente tre parametri.

Questa è una piccola introduzione al controllo dei motori passo a passo; ci sono ancora parecchie cose da apprendere, come l’accelerazione (non si può pretendere che il motore parta fin da subito alla velocità massima) o il controllo in retroazione per il conteggio dei giri.

Il micropasso:

fino ad ora abbiamo ipotizzato di alimentare le fasi una alla volta in sequenza, però se noi alimentassimo contemporaneamente due fasi, l’asse del motore di metterebbe in una posizione intermedia. In questo modo con la sequenza di alimentazione A, A-B, B, abbiamo raddoppiato il numero di passi necessari al motore per fare un giro completo. Questa configurazione si chiama Half-Step

Se inoltre iniziassimo ad alimentare la fase A con frazioni di corrente della fase B, aumenteremo ancora il numero di fasi, da qui controllo in micropasso. Per questo motivo i motori passo a passo stanno avendo un enorme diffusione, perché con un opportuna elettronica si aumenta la precisione di spostamento, mantenendo (più o meno) la coppia erogata, senza riduttori meccanici.Ovviamente per micropassi elevati, servono notevoli capacità di calcolo e frequenze di lavoro.

 

VN:F [1.9.22_1171]
Rating: 9.9/10 (20 votes cast)
VN:F [1.9.22_1171]
Rating: +11 (from 17 votes)

Adron Technology Gezapp: Drone + Stampa 3D + lotta biologica alla Piralide

Adron Technology è un azienda di Udine che ha sviluppato uno dei primi droni “contadini”: hanno dotato il velivolo di un dispenser che rilascia sul terreno a coordinate ben precise e preimpostate (il tutto controllato da GPS), delle capsule di cellulosa contenenti uova di Trichogramma, insetto che stermina la Piralide secondo il principio della lotta biologica.drone-3

Per sviluppare il progetto, come oramai è consuetudine per chi fa ricerca, si sono dotati di una stampante 3D, con la quale hanno potuto realizzare tutti i prototipi di studio e di test. Oltre ad abbattere i tempi di prototipazione ed i costi, grazie alle geometrie realizzabili con le stampanti 3D, sono riusciti a ridurre di molto i pesi, consentendo una maggior autonomia di volo.

Sono state anche sviluppate delle soluzioni che permettono il monitoraggio delle coltivazioni tramite l’equipaggiamento di specifici sensori. Attualmente stanno partecipando al Premio “UpStart Paolo Traci”, e per chi volesse dare il proprio contributo tramite un voto, basta cliccare il seguente link.

 

VN:F [1.9.22_1171]
Rating: 8.4/10 (8 votes cast)
VN:F [1.9.22_1171]
Rating: +2 (from 2 votes)

Totem 3D DLP Printer.

La tecnica di stampa tridimensionale DLP è una delle sette principali ora disponibili sul mercato (FDM, SLS, MLS, SLA, Polijet, 3D Printing, DLP).Il principio di funzionamento è abbastanza semplice e si basa sull’utilizzo di una resina thermo-foto sensibile e di un videoproiettore DLP (Digital Light Processing, è una tipologia di videoproiettori, da cui la tecnica di stampa prende il nome): si proietta lo slicing sulla resina per un determinato tempo in modo che uno strato di solidifichi, poi di alza il piano di stampa e si ripete fino alla conclusione del lavoro (video: https://www.youtube.com/watch?v=snOErpOP5Xk).

Ho scoperto che un’azienda pordenonese, la “Officina del Bianco” ha recentemente messo in commercio la seconda versione di una stampante 3D a tecnologia DLP battezzata “Totem3D” (pagina Facebook), con cui ho avuto modo di fare alcuni test.

Imballo: la stampante arriva in una scatola di cartone protetta da dei fogli di polistirolo; in linea generale è buono, ma sapendo che molti spedizionieri sono peggiori dei vandali, sarebbe meglio qualcosa di più solido. La prima nota positiva è che appena aperta la scatola troviamo un foglio d’istruzioni su come estrarre la macchina senza arrecare danni (la Totem pesa 23 Kg) e comunque si consiglia di essere almeno in due persone.

Nella confezione troviamo alcuni pezzi con relativa chiave a brugola per il montaggio (piedini e maniglie, cosa da 5 minuti), tutti i cavi necessari, una chiavetta USB con il software necessario, una griglia di calibratura ed alcuni “fogli di stampa” (fanno da intercapedine tra il piano in vetro e la resina).

La Totem ad un primo sguardo, anche se semplice nel design, è molto curata; le componenti in plexiglass sono termoformate e di un bel colore nero e rosso acceso. Le viti di apertura sono in bella vista e con relativo tappino, mentre sul retro troviamo il pannello con le spine per i collegamenti al computer. Si vede che chi l’ha progettata ha investito molte ore di tempo nel posizionare la varia componentistica.totem

20141008_095924

La stampante è divisa in due parti principali: quella di base in cui c’è l’alloggiamento del videoproiettore, dell’elettronica e del motore di sollevamento del piano; quella superiore, a cui si accede alzando il Plexiglass rosso, in cui troviamo la vaschetta per la resina ed il piano di stampa.

Sia la vaschetta che il piano di stampa sono facilmente estraibili tramite delle viti e questo permette una facile rimozione del prototipo oltre che un agevole recupero della resina avanzata. Tutte le componenti meccaniche sono di alto livello e sono realizzate partendo dal “pieno” tramite centro di lavoro. L’area di stampa utile è di 140x80x150mm.

Questa stampante lavora “estraendo” l’oggetto dalla vaschetta (come nel video linkato); questa soluzione tecnica comporta dei vantaggi e degli svantaggi. I vantaggi sono gli ingombri ridotti, dato che non serve una vasca alta quanto l’oggetto (da riempire ogni volta), ma basta un dito di resina. Inoltre se vi vuole scalarla in Z, basta allungare quell’asse e sopratutto non serve una spazzola che uniformi la resina (Z si alza ed abbassa ad ogni layer in modo da avere uno strato sempre uniforme).

Collegamento al PC e software: ad ora la Totem non è stand-alone e quindi necessita di un computer sempre collegato per tutta la durata della lavorazione; vengono richieste due uscite USB ed una HDMI. Il PC non serve particolarmente prestante e con 500 euro dovreste comprarlo senza problemi in una qualsiasi catena di elettronica. Colleghiamo la chiavetta USB e troviamo il setup del software (ad ora solo per windows) ed un manuale utente; quest’ultimo è ben fatto ed accompagna passo a passo l’utente nelle (poche) configurazioni. La procedura d’installazione non è particolarmente complessa; forse la configurazione del doppio monitor (il videoproittore viene visto così) e un po’ più ostica per chi non c’ha mai avuto a che fare.

È ora di stampare!

Avvio il programma e carico il modello; qui si vede che il software è relativamente giovane ed ad esempio manca la possibilità di trascinare l’oggetto nell’area di stampa con il mouse, ma bisogna utilizzare i relativi pulsanti. Non è nulla d’impossibile, ma qualcuno abituato con software per la FDM potrebbe trovarsi un po’ spiazzato (comunque tutto spiegato nella guida). Purtroppo ad ora non è implementata la generazione automatica dei supporti e bisogna crearli con software terzi come MeshMixer o simili. Posizionato l’oggetto avviamo la procedura di stampa: un piccolo wizard ci accompagna nelle operazioni da eseguire prima dell’avvio (carico della resina, fine corsa dell’asse Z). C’è anche la procedura di configurazione della messa a fuoco del videoproiettore, grazie ad una intuitiva e semplice griglia di controllo (operazione che si fa una tantum). Viene chiesta che tipologia di resina vogliamo utilizzare scegliendo tra quelle già testate dal produttore, con relativi parametri; nel caso volessimo sperimentare qualche nuovo materiale non c’è alcun problema, perché è possibile modificare manualmente le impostazioni. Impostato tutto diamo il via. E qui si capisce subito che l’implementazione di un elettronica per la stampa autonoma è necessaria; infatti il computer (dovendo mantenere le impostazioni del doppio monitor) viene congelato per tutta la fase di stampa e non può essere utilizzato per altri scopi. Per fortuna il progettista mi ha rassicurato comunicandomi che sta già lavorando in questo senso e che a breve sarà disponibile un upgrade, implementabile senza particolari problemi anche a questo primo lotto di stampanti che ne è sprovvisto.

Un problema che ho riscontrato nella fase di stampa l’ho avuto con oggetti con base stretta e sommità larga (tipo un cono rovesciato) ; la solidificazione della resina inizia a ridosso del “foglio di stampa” che ricopre il vetro della vaschetta e difatto si ha una adesione con l’oggetto. Quindi se non si ha una base particolarmente solida, si rischia che il modello si stacchi facendo fallire la stampa; una semplice soluzione comunque è quella di aggiungere dei supporti che si contrappongano alla forza di adesione.

Una cosa estremamente positiva di questa tecnologia è che il tempo di stampa dipende esclusivamente dall’altezza in Z dell’oggetto; infatti essendo perimetri, riempimenti, etc., proiettati contemporaneamante, non c’è differenza se un oggetto ha la base più larga o più stretta, ma solo se è più alto o più basso. Infatti la soluzione migliore per ottimizzare i tempi è di riempire totalmente l’area di stampa: relizzare un anello o dieci sue copie comporta l’impiego dello stesso identico tempo.

Ultimata la stampa si rimuove la vaschetta e si recupera la resina non utilizzata, mentre con una spatola e molta cautela si procede a rimuovere l’oggetto dalla base; una volto rimosso lo si deterge con dell’alcol isopropilico e lo si asciuga con un po’ di aria compressa anche per rimuovere eventuali residui. Ed ecco il risultato:

Volto colorato
Volto colorato
« 1 di 20 »

Una cosa estremamente interessante è che sono a disposizione già otto tipologie di resina testate, utili nei campi che vanno dall’odontotecnica all’oreficeria (resina per le lavorazioni a cera persa) e che il produttore ha una serie di upgrade davvero interessanti, quali la ricarica automatica della vasca, il controllo remoto e nuove tipologie di resine.

La macchina viene distribuita da SoNi.srl di Udine.

Di sicuro è una delle macchine a tecnologi DLP che più mi hanno entusiasmato, oltre ad essere progettato e costruito totalmente in Italia.

VN:F [1.9.22_1171]
Rating: 6.4/10 (8 votes cast)
VN:F [1.9.22_1171]
Rating: -2 (from 4 votes)

Elettronica nel mondo delle corse.

Venerdì 23 novembre 2012 l’associazione Alie (Laureati Ingegneria Elettronica) organizza un incontro con gli esperti elettronici del settore automobilistico; la locandina scrive:

“Esperti del settore corse provenienti dalle prestigiose scuderie Ferrari e Ducati descriveranno i tratti salienti di questo mondo affascinante e risponderanno alle domande del pubblico.”

Ritengo l’incontro estremamente interessante dato che l’auto è uno dei settori in cui l’elettronica ha avuto grande sviluppo e diffusione.

Per maggiori informazioni: alie@uniud.it

Nei link sottostanti ci sono le locandine con il programma dell’iniziativa.

Link 1

Link 2

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Stampa PCB economica

In questo videotutorial vediamo come realizzare i PCB in modo semplice ed economico. Il processo non richiede ne l’utilizzo del bromografo ne quello di basette presensibilizzate. Quello che ci serve sono:

  • semplici basette ramate
  • stampa del circuito con una stampante laser
  • ferro da stiro
  • percloruro ferrico
  • una bacinella d’acqua ed una spugnetta

Purtroppo rispetto allo sviluppo tramite il processo visto in questo tutorial si ha una qualità non ottima ma accettabile e più che sufficiente per la maggior parte dei circuiti amatoriali. Però si può migliorare passando con lo stagno le piste, in modo da avere dei contatti ottimali. Di seguito le foto delle basette messe a confronto ed il videotutorial.

Basette a confronto

Particolare della basetta

 

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)