Servomotore e potenziometro con Arduino: controllo della posizione
Impariamo a controllare la posizione di un servomotore ruotando un potenziometro: Arduino legge il valore su A0, lo converte in un angolo e muove il servo in tempo reale.
Cosa imparerai
- come leggere un potenziometro con
analogRead(); - come convertire un intervallo con
map(); - come comandare un servo con la libreria
Servo.h; - come collegare un ingresso analogico a un attuatore;
- come trasformare la posizione di una manopola in un movimento meccanico.
Come funziona il progetto
Il cursore centrale del potenziometro è collegato all’ingresso analogico A0. Ruotando la manopola, la tensione presente sul cursore cambia e Arduino la converte in un valore numerico compreso tra 0 e 1023.
Questo valore non può essere inviato direttamente al servo. Prima lo
convertiamo nell’intervallo degli angoli con la funzione
map(). Il risultato viene quindi passato a
myservo.write().
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.
Collegamenti del circuito
| Componente | Terminale | Arduino |
|---|---|---|
| Potenziometro | Estremo 1 | 5V |
| Potenziometro | Cursore centrale | A0 |
| Potenziometro | Estremo 2 | GND |
| Servomotore | Segnale | Pin 9 |
| Servomotore | VCC | 5V |
| Servomotore | GND | GND |
Collegamento del potenziometro e del servomotore ad Arduino.
Da 0–1023 a 0–179
Nel codice originale il valore letto dal potenziometro viene convertito
da 0–1023 a 0–179. La funzione utilizzata
è map():
val = map(val, 0, 1023, 0, 179);
In questo modo una posizione vicina al minimo del potenziometro porta il servo vicino a 0°, mentre la posizione massima lo porta vicino a 179°.
Codice Arduino commentato
// ==========================================================
// SERVOMOTORE E POTENZIOMETRO CON ARDUINO
// Controllo della posizione del servo con una manopola
// ==========================================================
// Include la libreria per il controllo dei servomotori
#include <Servo.h>
// Crea un oggetto Servo chiamato myservo
Servo myservo;
// Pin analogico collegato al cursore del potenziometro
const int potPin = A0;
// Pin digitale collegato al segnale del servomotore
const int servoPin = 9;
// Variabile che conterrà la lettura del potenziometro
int val = 0;
void setup() {
// Associa il servomotore al pin digitale 9
myservo.attach(servoPin);
}
void loop() {
// Legge il valore analogico del potenziometro
// La lettura varia da 0 a 1023
val = analogRead(potPin);
// Converte la lettura 0-1023
// in un angolo compreso tra 0 e 179 gradi
val = map(val, 0, 1023, 0, 179);
// Sposta il servomotore nella posizione calcolata
myservo.write(val);
// Piccola pausa per rendere il movimento più stabile
delay(15);
}
Il codice spiegato passo passo
Importiamo Servo.h
La libreria Servo.h ci permette di controllare
il servomotore senza dover generare manualmente il segnale di comando.
Creiamo l’oggetto Servo
Servo myservo; crea l’oggetto che rappresenta
il nostro servomotore all’interno del programma.
Leggiamo il potenziometro
analogRead(potPin) restituisce un valore tra 0 e 1023
in funzione della posizione della manopola.
Convertiamo la scala
map() trasforma il valore analogico nell’angolo
utilizzabile dal servomotore.
Muoviamo il servo
myservo.write(val) invia la nuova posizione al servo.
Il ciclo si ripete continuamente, quindi il servo segue la manopola.
Perché c’è delay(15)?
Il piccolo ritardo di 15 millisecondi evita di eseguire il ciclo a una velocità inutilmente elevata e lascia al servomotore il tempo di iniziare a raggiungere la posizione richiesta.
Simulazione online
Puoi provare il progetto anche con la simulazione Tinkercad originale.
▶️ Apri la simulazione TinkercadScarica lo sketch
⬇️ Scarica servo_e_potenziometro.inoDebug rapido
- controlla che il cursore centrale del potenziometro sia collegato ad A0;
- verifica il collegamento del servo al pin 9;
- controlla 5V e GND;
- se il servo vibra, verifica soprattutto l’alimentazione;
- assicurati che le masse siano comuni se usi un alimentatore esterno;
- prova a leggere il valore di A0 sul Monitor Seriale se il movimento non segue la manopola.
Variante con Monitor Seriale
#include <Servo.h>
Servo myservo;
const int potPin = A0;
const int servoPin = 9;
void setup() {
myservo.attach(servoPin);
// Avvia il Monitor Seriale
Serial.begin(9600);
}
void loop() {
// Legge il potenziometro
int potValue = analogRead(potPin);
// Converte il valore in angolo
int angle = map(potValue, 0, 1023, 0, 179);
// Muove il servo
myservo.write(angle);
// Mostra i valori sul Monitor Seriale
Serial.print("Potenziometro: ");
Serial.print(potValue);
Serial.print(" Angolo: ");
Serial.println(angle);
delay(15);
}
Varianti del progetto
- limitare il movimento del servo a un intervallo più piccolo;
- usare due potenziometri per controllare due servo;
- creare un piccolo joystick meccanico;
- controllare un braccio robotico;
- visualizzare l’angolo su un display LCD o OLED;
- aggiungere pulsanti per memorizzare posizioni predefinite.
Cosa devi ricordare
- Il potenziometro viene letto tramite un ingresso analogico.
analogRead()restituisce un valore tra 0 e 1023.map()converte la lettura nell’intervallo degli angoli.Servo.write()imposta la posizione del servomotore.- Il servo segue la manopola perché il ciclo viene eseguito continuamente.
Domande frequenti
Perché il servo non arriva esattamente a 180°?
Il codice originale utilizza un intervallo da 0 a 179. Inoltre il movimento reale dipende anche dal modello di servomotore utilizzato.
Posso usare un valore massimo di 180?
Sì, puoi modificare la funzione map() usando 180 come valore
massimo, se il tuo servo supporta correttamente quella posizione.
Perché il servo vibra vicino a una posizione?
Può dipendere dall’alimentazione, dal rumore sulla lettura del potenziometro oppure dai limiti meccanici del servomotore.
Posso controllare due servo con due potenziometri?
Sì. Puoi creare due oggetti Servo, usare due ingressi analogici distinti e ripetere la stessa logica per ciascun canale.

