Controllare un servo con Arduino sembra semplice, ma nella pratica il risultato dipende da tre cose: cablaggio, alimentazione e codice. In questo articolo trovi una guida concreta per farlo muovere senza tremolii inutili, capire come funziona il segnale di comando e scegliere l’impostazione giusta quando il progetto passa dal banco di prova a qualcosa di più serio.
I punti che fanno funzionare davvero un servo con Arduino
- Un servo non si pilota come un motore DC: riceve impulsi periodici, in genere intorno ai 20 ms.
- Il segnale di controllo conta, ma l’alimentazione esterna e la massa comune sono spesso decisivi.
- write() è la via più semplice, mentre writeMicroseconds() serve quando vuoi più precisione.
- Il valore 0-180 gradi è nominale: molti servo reali non coprono davvero tutta la corsa.
- Se il servo vibra o si ferma, il problema è spesso elettrico o meccanico, non del codice.
Come lavora un servo e perché non basta trattarlo come un motore qualsiasi
Un servo hobby classico integra motore, riduttore, elettronica di controllo e un potenziometro interno che misura la posizione dell’albero. Arduino non gli dice direttamente quanto girare come farebbe con un motore semplice: gli invia invece una sequenza di impulsi che il servo interpreta come posizione target. Per questo la sensazione, all’inizio, è che il comportamento sia “quasi digitale”, ma in realtà dietro c’è un controllo di posizione in retroazione.
La libreria Servo di Arduino semplifica tutto questo. Invece di costruire tu il treno di impulsi, chiami una funzione e la libreria mantiene il segnale con una cadenza tipica di 50 Hz, cioè un aggiornamento ogni circa 20 millisecondi. Io parto sempre da qui, perché è il punto che evita errori di principio: un servo non vuole un PWM come un LED, vuole un segnale di posizione.
In pratica, la posizione viene spesso espressa in gradi, ma il servo ragiona davvero in larghezze d’impulso in microsecondi. Il classico intervallo di lavoro della libreria è centrato intorno a valori come 544 e 2400 microsecondi, con il centro vicino a 1500 microsecondi. Non tutti i servo sono uguali, però: alcuni si fermano prima dei 180 gradi teorici, altri hanno un centro leggermente spostato, altri ancora tollerano range più ampi. Ecco perché il primo progetto riuscito non è quasi mai quello “perfetto”, ma quello che rispetta il comportamento reale del componente.
Chiarito il meccanismo, il passo successivo è evitare gli errori più comuni sul lato hardware, perché lì si nascondono metà dei problemi.

Il cablaggio corretto evita gran parte dei problemi
Il collegamento base ha tre fili: alimentazione, massa e segnale. Di solito il rosso va a 5 V, il marrone o nero a GND e l’arancione, giallo o bianco al pin di controllo. Sembra banale, ma il dettaglio che fa davvero la differenza è questo: la massa del servo e la massa di Arduino devono essere in comune. Se manca questo riferimento condiviso, il segnale non viene interpretato in modo affidabile.
Qui conviene essere pragmatici. Un microservo piccolo può sembrare innocuo sul banco, ma sotto carico assorbe facilmente più corrente di quanta Arduino o la porta USB vogliano fornire con continuità. Per un singolo servo leggero io considero sensato partire con un alimentatore esterno stabile a 5 V da almeno 1 A; se i servo sono più di uno o il carico meccanico cresce, salgo senza esitazioni. La classica pila rettangolare da 9 V è una cattiva idea nella maggior parte dei casi: la tensione è sbagliata e la corrente disponibile è troppo bassa.
Un condensatore vicino al servo aiuta molto a smorzare i picchi di assorbimento. Nella pratica uso spesso un elettrolitico da 220 µF o 470 µF tra 5 V e GND, soprattutto se il servo parte e si ferma di continuo. Non risolve un alimentatore debole, ma attenua i colpi di corrente che fanno tremare tutto il sistema.
Un altro dettaglio utile: sulla maggior parte delle schede Arduino classiche non serve un pin PWM dedicato per il servo, perché la libreria genera il segnale con i timer interni. Questo è comodo, ma ha anche un costo: alcuni timer vengono impegnati, quindi se il progetto cresce bisogna tenere conto delle risorse usate dalla libreria.
Quando il cablaggio è pulito, il codice diventa molto più leggibile e il comportamento del servo diventa finalmente prevedibile.
Il codice minimo che funziona davvero
Il modo più semplice per iniziare è usare la libreria Servo e scrivere un angolo. Per un test rapido, io parto sempre da un movimento lento tra 0 e 180 gradi, così capisco subito se il componente è vivo, se il verso è corretto e se l’alimentazione regge sotto sforzo.
#include
Servo braccio;
void setup() {
braccio.attach(9);
braccio.write(90);
delay(500);
}
void loop() {
for (int angolo = 0; angolo <= 180; angolo += 1) {
braccio.write(angolo);
delay(15);
}
for (int angolo = 180; angolo >= 0; angolo -= 1) {
braccio.write(angolo);
delay(15);
}
} Questo esempio fa una cosa molto utile: sposta il servo con passi piccoli e una pausa breve tra un comando e l’altro. Se il tuo servo vibra o scatta, il movimento graduale rende il difetto più facile da leggere. Se invece vuoi fermarlo in una posizione precisa, puoi usare direttamente write(90) o qualsiasi altro valore intermedio.
Quando voglio più controllo, passo a writeMicroseconds(). In quel caso lavoro sulla larghezza dell’impulso e non più sui gradi dichiarati. È una scelta migliore se il servo non arriva esattamente agli estremi oppure se il centro non corrisponde davvero ai 90 gradi teorici. La differenza è semplice: write() è più comodo, writeMicroseconds() è più preciso.
| Metodo | Quando usarlo | Punto forte | Limite |
|---|---|---|---|
| write() | Prototipi rapidi e movimenti base | Molto semplice da leggere | Dipende dalla mappatura interna dei gradi |
| writeMicroseconds() | Taratura fine e servo non standard | Controllo più accurato del segnale | Richiede un po’ più di prova ed errore |
| attach(pin, min, max) | Quando vuoi adattare l’escursione al tuo servo | Permette di correggere i limiti reali | Va calibrato con attenzione |
Se il progetto è piccolo, questa base basta. Se però vuoi sfruttare davvero il servo, vale la pena capire come si calibra la corsa reale, perché è lì che molti lavori di hobby fanno il salto di qualità.
Tarare angoli reali e corsa utile fa più differenza del codice “bello”
Il limite più comune è fidarsi troppo del range 0-180. In teoria è comodo, in pratica molti servo non lavorano bene fino agli estremi, e forzarli lì significa aumentare rumore, assorbimento e usura. Io preferisco sempre verificare la corsa effettiva: spesso un servo funziona meglio tra 10 e 170 gradi, oppure tra due valori in microsecondi più stretti del default.
Qui entra in gioco il parametro di attach() che permette di definire min e max in microsecondi. È una correzione semplice ma molto utile, perché consente di adattare la libreria al componente reale invece di pretendere che tutti i servo si comportino allo stesso modo. Il risultato è un movimento più coerente e, spesso, meno rumoroso.
Se vuoi una regola pratica: prima trova il centro reale, poi gli estremi utili, e solo dopo costruisci il resto della logica. Non il contrario. Questo approccio evita il classico errore del principiante che programma una posizione estrema e si stupisce quando il servo ronza, si scalda o tocca il fine corsa meccanico.
Per orientarsi, io distinguo così i casi più frequenti:
- Servo standard economico - buono per prove, ma spesso richiede taratura e alimentazione pulita.
- Servo con escursione ridotta - utile quando il movimento deve essere più controllato che ampio.
- Servo con coppia maggiore - necessario se il braccio, la leva o il meccanismo applica più resistenza.
Quando hai tarato bene il comportamento, i problemi rimasti sono di solito facili da diagnosticare. Ed è proprio lì che conviene fermarsi un attimo prima di cambiare componenti a caso.
I guasti tipici quasi sempre hanno una causa semplice
Se il servo vibra senza muoversi, io controllo prima l’alimentazione. Se si muove a scatti, guardo la massa comune e la qualità del cavo. Se arriva a fine corsa e continua a insistere, penso subito a un errore di taratura o a un limite meccanico ignorato. Questo ordine di diagnosi fa risparmiare tempo, perché nella maggior parte dei casi il difetto non è nel codice.
- Tremolio continuo - spesso alimentazione instabile o servo sotto sforzo.
- Movimento assente - pin sbagliato, massa non condivisa o cavo segnale scollegato.
- Scatti improvvisi - assorbimento di corrente insufficiente o rumore elettrico sul cablaggio.
- Ronzio forte ai limiti - il servo sta cercando di andare oltre la corsa utile.
- Movimento lento e incerto - carico meccanico eccessivo o tensione troppo bassa.
Una nota che ripeto spesso anche nei progetti semplici: se il servo deve muovere qualcosa di pesante, non è il caso di “sperare” che regga. Serve coppia adeguata, alimentazione adatta e, se possibile, una cinematica più leggera. In altre parole, il software non compensa una scelta meccanica sbagliata.
Quando il montaggio è affidabile, allora ha senso pensare al passo successivo: un controllo più fluido, più servomotori o un driver dedicato.
Quando conviene passare a una soluzione più robusta
Se devi muovere un solo servo in modo occasionale, la libreria standard di Arduino basta nella maggior parte dei casi. Se però il progetto cresce, io valuto subito tre scenari: molti servo insieme, movimenti molto fluidi oppure necessità di liberare i timer della scheda. In questi casi un driver dedicato come un espansore per servo può semplificare parecchio il cablaggio e distribuire meglio il carico.
Ha senso anche quando vuoi evitare che il microcontrollore si occupi direttamente di ogni impulso. La soluzione esterna non è “più avanzata” per definizione, ma è più ordinata quando il progetto diventa più ricco. Lo stesso vale per librerie che gestiscono movimenti morbidi: sono utili se vuoi un’azione meno brusca, ma non risolvono un problema di alimentazione debole o di meccanica troppo dura.
Se invece resti sul classico Arduino con un servo singolo, la strategia migliore resta quella più semplice possibile: segnale pulito, massa comune, alimentazione separata e taratura realistica. In questo tipo di progetto, la qualità viene quasi sempre da poche scelte fatte bene, non da venti righe di codice in più.
Quando lavori così, il servo smette di essere un componente capriccioso e diventa quello che dovrebbe essere fin dall’inizio: un attuatore affidabile, facile da integrare e abbastanza preciso da rendere credibile il tuo montaggio.