Servomotore con Arduino: controllo della posizione passo passo
Impariamo a collegare e comandare un servomotore con Arduino usando la libreria Servo.h, facendo ruotare l’albero in diverse posizioni con un semplice sketch completamente commentato.
Servo.h possiamo indicare direttamente
l’angolo da raggiungere con write().
Cosa imparerai
- che cos’è un servomotore e dove viene utilizzato;
- come collegare alimentazione, massa e filo di segnale;
- come includere la libreria
Servo.h; - come creare un oggetto
Servo; - come associare il servo a un pin con
attach(); - come impostare una posizione con
write(); - come creare una sequenza di movimenti temporizzati.
Che cos’è un servomotore
Un servomotore è un attuatore progettato per portare il proprio albero in una posizione precisa. A differenza di un normale motore DC, non viene usato semplicemente per girare continuamente: normalmente gli chiediamo di raggiungere un determinato angolo e di mantenerlo.
Per questo i servo sono molto diffusi nella robotica, nei modellini, nei piccoli bracci meccanici, nei sistemi di orientamento e in moltissimi progetti Arduino.
Materiale necessario
Kit Arduino consigliato
Se stai iniziando, un kit completo può essere comodo perché comprende molti dei componenti utilizzati nei progetti del sito.
🛒 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Come si collega un servomotore ad Arduino
I piccoli servomotori utilizzano normalmente tre collegamenti: alimentazione, massa e segnale di controllo.
| Collegamento servo | Funzione | Arduino |
|---|---|---|
| VCC | Alimentazione | 5V |
| GND | Massa | GND |
| Segnale | Comando posizione | Pin 9 |
Schema di collegamento del servomotore ad Arduino.
La libreria Servo.h
L’IDE Arduino include la libreria Servo.h, che semplifica
molto il controllo dei servomotori. Il primo passaggio consiste quindi
nell’includerla nello sketch:
#include <Servo.h>
Successivamente creiamo un oggetto che rappresenta il nostro servo:
Servo servo1;
Codice Arduino commentato
Servo1.write(-180). Per questo tutorial utilizziamo invece
posizioni comprese tra 0° e 180°, coerenti con l’uso
standard di Servo.write().
// ==========================================================
// SERVOMOTORE CON ARDUINO
// Movimento del servo tra diverse posizioni
// ==========================================================
// Include la libreria ufficiale per il controllo dei servomotori
#include <Servo.h>
// Crea un oggetto Servo chiamato servo1
Servo servo1;
// Pin digitale utilizzato per il segnale del servo
const int servoPin = 9;
// Tempo di pausa tra una posizione e la successiva
// 500 millisecondi = mezzo secondo
const int pausa = 500;
void setup() {
// Associa l'oggetto servo1 al pin digitale 9
servo1.attach(servoPin);
}
void loop() {
// Porta il servo a 0 gradi
servo1.write(0);
delay(pausa);
// Porta il servo a 30 gradi
servo1.write(30);
delay(pausa);
// Porta il servo a 60 gradi
servo1.write(60);
delay(pausa);
// Porta il servo a 90 gradi
servo1.write(90);
delay(pausa);
// Porta il servo a 120 gradi
servo1.write(120);
delay(pausa);
// Porta il servo a 150 gradi
servo1.write(150);
delay(pausa);
// Porta il servo a 180 gradi
servo1.write(180);
delay(pausa);
// Ritorna verso la posizione iniziale
servo1.write(150);
delay(pausa);
servo1.write(120);
delay(pausa);
servo1.write(90);
delay(pausa);
servo1.write(60);
delay(pausa);
servo1.write(30);
delay(pausa);
servo1.write(0);
delay(pausa);
}
Il codice spiegato passo passo
Importiamo Servo.h
La direttiva #include <Servo.h> rende disponibili
le funzioni necessarie per controllare il servo.
Creiamo l’oggetto Servo
Servo servo1; crea l’oggetto che useremo per inviare
i comandi al motore.
Colleghiamo il servo al pin 9 nel programma
Con servo1.attach(servoPin) comunichiamo alla libreria
quale pin deve generare il segnale di controllo.
Impostiamo l’angolo
servo1.write(90), per esempio, chiede al servo di
raggiungere la posizione di 90°.
Introduciamo una pausa
delay(500) mantiene una pausa di mezzo secondo prima
di inviare la posizione successiva.
Cosa succede modificando delay()
La pausa non determina direttamente la velocità interna del servo: stabilisce semplicemente quanto tempo il programma aspetta prima di inviare il comando successivo.
delay(1000)→ pausa di 1 secondo;delay(500)→ pausa di mezzo secondo;delay(100)→ nuovi comandi molto più ravvicinati.
Simulazione online
Puoi provare il progetto anche con la simulazione Tinkercad originale.
▶️ Apri la simulazione TinkercadScarica lo sketch originale
Manteniamo disponibile anche il file storico associato alla pagina.
⬇️ Scarica servo.inoDebug rapido
- controlla che il filo di segnale sia collegato al pin 9;
- verifica 5V e GND;
- assicurati che la massa sia comune se utilizzi un’alimentazione esterna;
- controlla che
#include <Servo.h>sia presente; - se il servo vibra o Arduino si riavvia, verifica soprattutto l’alimentazione;
- non forzare meccanicamente il servo oltre i suoi limiti.
Varianti del progetto
- controllare il servo con un potenziometro;
- comandarlo con due pulsanti;
- muoverlo in base alla distanza rilevata da un sensore;
- realizzare un piccolo braccio robotico;
- creare una barriera automatica;
- controllare la posizione dal Monitor Seriale.
Cosa devi ricordare
Servo.hsemplifica il controllo del servomotore.attach()associa l’oggetto Servo a un pin.write()imposta la posizione desiderata.delay()introduce una pausa tra i comandi.- l’alimentazione è importante soprattutto con servo più grandi o sotto carico.
Domande frequenti
Perché il servo vibra?
Può dipendere dall’alimentazione, dai collegamenti o dal carico meccanico. Controlla prima di tutto 5V, GND e la qualità dell’alimentazione.
Posso usare un pin diverso dal 9?
Sì, modificando il valore di servoPin e collegando il filo
di segnale al pin scelto.
Perché non uso valori negativi?
In questo tutorial utilizziamo il comando Servo.write()
con posizioni da 0° a 180°, evitando i valori negativi presenti nel
vecchio sketch.
Il servo può ruotare continuamente?
Questo progetto è pensato per un servo posizionale. I servo a rotazione continua funzionano in modo diverso: il comando controlla il movimento anziché una posizione angolare assoluta.

