🎛 Arduino • Servo • Ingresso analogico

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.

Difficoltà Principiante
Ingresso Potenziometro su A0
Uscita Servo su pin 9
In poche parole: il potenziometro genera un valore analogico da 0 a 1023. Arduino lo converte in un angolo da 0° a circa 180° e invia la nuova posizione al servomotore.

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().

Concetto chiave: il progetto crea una relazione diretta tra un ingresso e un’uscita: ruoti la manopola → cambia la lettura analogica → cambia l’angolo del servo.

Materiale necessario

🔌 Arduino Uno o compatibile
🎛 Potenziometro da 10 kΩ
⚙️ Servomotore
🔗 Cavetti jumper

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 consigliato

Link 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
Nota sull’alimentazione: se utilizzi un servo più grande o sotto carico, può essere necessario alimentarlo separatamente. Ricorda di mettere in comune la massa dell’alimentatore esterno e quella di Arduino.
Schema Arduino con servomotore e potenziometro

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():

Conversione della lettura analogica
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
// ==========================================================
// 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

1

Importiamo Servo.h

La libreria Servo.h ci permette di controllare il servomotore senza dover generare manualmente il segnale di comando.

2

Creiamo l’oggetto Servo

Servo myservo; crea l’oggetto che rappresenta il nostro servomotore all’interno del programma.

3

Leggiamo il potenziometro

analogRead(potPin) restituisce un valore tra 0 e 1023 in funzione della posizione della manopola.

4

Convertiamo la scala

map() trasforma il valore analogico nell’angolo utilizzabile dal servomotore.

5

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 Tinkercad

Scarica lo sketch

⬇️ Scarica servo_e_potenziometro.ino

Debug 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

Visualizzare lettura e angolo
#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.