PROGETTI ARDUINO

  • HOME
  • 200 Progetti
  • Progetti e Tutorial
  • Reti
    • Impara le reti
    • internet fibra
    • wifi mesh
    • modem router
    • diagnostica reti
    • ethernet lan
    • sicurezza configurazione
  • Elettronica
  • Recensioni
  • Manuale
  • Contatti
  • HOME
  • 200 Progetti
  • Progetti e Tutorial
  • Reti
    • Impara le reti
    • internet fibra
    • wifi mesh
    • modem router
    • diagnostica reti
    • ethernet lan
    • sicurezza configurazione
  • Elettronica
  • Recensioni
  • Manuale
  • Contatti

Progetto 145
​Controllo preciso
della posizione
​di un servomotore

🚀 Introduzione
​

Vuoi posizionare un servomotore con maggiore precisione rispetto al classico controllo diretto con un potenziometro? 🎯⚙️

In questo progetto realizzerai un sistema di controllo preciso della posizione di un servo utilizzando Arduino UNO, un potenziometro, due pulsanti e un display LCD.

Il potenziometro permetterà di effettuare una regolazione rapida, mentre i pulsanti consentiranno di modificare l’angolo di un solo grado alla volta.

Il servo raggiungerà la posizione richiesta in modo graduale, evitando movimenti bruschi.
​
Una pressione contemporanea dei due pulsanti salverà inoltre la posizione nella memoria EEPROM, permettendo ad Arduino di recuperarla dopo lo spegnimento.
​
👉 Il progetto è utile per bracci robotici, supporti orientabili, serrature, sistemi pan-tilt e piccoli meccanismi automatici.

🎯 Cosa realizzerai
​

Con Arduino creerai un sistema che:
  • ⚙️ controlla un servomotore;
  • 🎛️ imposta rapidamente l’angolo con un potenziometro;
  • ➕ aumenta la posizione di un grado;
  • ➖ diminuisce la posizione di un grado;
  • 🎯 limita il movimento entro un intervallo sicuro;
  • 🚀 sposta il servo gradualmente;
  • 📟 mostra posizione richiesta e reale su LCD;
  • 💾 salva la posizione nella EEPROM;
  • 🔄 recupera la posizione dopo lo spegnimento;
  • ✅ utilizza codice compatibile con Arduino UNO.

🧰 Materiale necessario
​
  • 1x Arduino UNO;
  • 1x servomotore SG90, MG90S o compatibile;
  • 1x potenziometro da 10 kΩ;
  • 1x display LCD 16×2 con interfaccia I2C;
  • 2x pulsanti;
  • 1x alimentatore esterno da 5V per il servo, consigliato;
  • cavetti jumper;
  • breadboard;
  • cavo USB.
​
I pulsanti utilizzano le resistenze interne INPUT_PULLUP di Arduino e non richiedono resistenze esterne.

🛒 Non hai ancora i componenti?

Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.

👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW

📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un'occhiata anche ai miei libri dedicati ad Arduino.
All'interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.

👉 Scopri i miei libri su Arduino:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4rfzjXE
​

📚 Librerie necessarie
​

Il progetto utilizza:
  • Servo;
  • LiquidCrystal_I2C;
  • EEPROM.
​
La libreria Servo e la libreria EEPROM sono normalmente già incluse nell’Arduino IDE.
​
Per il display devi installare una libreria compatibile con LiquidCrystal_I2C.
​
Per installarla:
  1. apri Arduino IDE;
  2. seleziona Sketch → Include Library → Manage Libraries;
  3. cerca LiquidCrystal I2C;
  4. installa una versione compatibile con il tuo modulo.

🔌 Schema di collegamento

Servomotore
I colori dei fili possono cambiare in base al modello, ma normalmente sono:
  • rosso → alimentazione 5V;
  • marrone o nero → GND;
  • arancione, giallo o bianco → pin digitale 9.

Potenziometro
  • terminale laterale → 5V;
  • terminale laterale opposto → GND;
  • terminale centrale → A0.
Il potenziometro consente di scegliere rapidamente una posizione.

Pulsante AUMENTA
  • un terminale → pin digitale 2;
  • terminale opposto → GND.
Ogni pressione aumenta la posizione richiesta di un grado.

Pulsante DIMINUISCI
  • un terminale → pin digitale 3;
  • terminale opposto → GND.
Ogni pressione diminuisce la posizione richiesta di un grado.

Display LCD 16×2 I2C
  • VCC → 5V;
  • GND → GND;
  • SDA → A4;
  • SCL → A5.
Nel codice viene utilizzato l’indirizzo I2C 0x27.
Se il display non funziona, il tuo modulo potrebbe utilizzare 0x3F.
⚠️ Alimentazione del servomotore
​

Anche un piccolo servomotore può assorbire una corrente elevata durante il movimento o quando incontra un ostacolo.
Per evitare:
  • riavvii di Arduino;
  • vibrazioni;
  • movimenti irregolari;
  • surriscaldamento;
è consigliabile alimentare il servo tramite una sorgente esterna da 5V.
​
Collega sempre insieme:
  • GND dell’alimentatore;
  • GND del servo;
  • GND di Arduino.
​
👉 Non alimentare servomotori potenti direttamente dal pin 5V della scheda.
Foto

💻 Codice Arduino

Il programma gestisce due tipi di regolazione.

Regolazione rapidaIl potenziometro imposta una posizione compresa tra 10° e 170°.

Questi limiti evitano di portare il servo troppo vicino agli estremi meccanici.

Regolazione fineI due pulsanti modificano la posizione di un solo grado alla volta.
​
Questa funzione permette di raggiungere un angolo preciso dopo la regolazione iniziale con il potenziometro.

    

⚙️ Come funziona

Arduino legge periodicamente il valore del potenziometro.

La lettura analogica compresa tra 0 e 1023 viene convertita in un angolo:
angolo = map(
valorePotenziometro,
0,
1023,
10,
170
);


Il servo non raggiunge immediatamente la nuova posizione.
​
La variabile posizioneAttuale si avvicina gradualmente a posizioneRichiesta, modificandosi di un grado alla volta.

🎛️ Controllo del potenziometro

Le letture analogiche possono oscillare leggermente anche quando la manopola rimane ferma.

Per evitare continui piccoli movimenti, il programma utilizza una tolleranza.

La posizione viene aggiornata soltanto quando il nuovo valore differisce di almeno due gradi rispetto a quello precedente.
​
👉 Questa zona di tolleranza rende il servo più stabile.

➕ Regolazione fine

​Premendo il pulsante AUMENTA:
  • la posizione richiesta aumenta di un grado.

Premendo il pulsante DIMINUISCI:
  • la posizione richiesta diminuisce di un grado.
​
I limiti impediscono al valore di scendere sotto 10° o superare 170°.

​🎯 Posizione richiesta e posizione attuale

Il programma distingue due valori:
  • posizione richiesta;
  • posizione attuale.

La posizione richiesta è quella scelta dall’utente.

La posizione attuale rappresenta invece il comando che Arduino ha già inviato al servo.

Durante il movimento graduale, i due valori possono essere momentaneamente differenti.

Esempio:
SET:120° POS:84°
MOVIMENTO...


Quando il servo raggiunge la posizione:
SET:120° POS:120°
POSIZIONE OK

🚀 Movimento graduale
​

Ogni intervallo stabilito, Arduino modifica la posizione attuale di un solo grado.

Se la posizione richiesta è maggiore:
posizioneAttuale++;

Se è minore:
posizioneAttuale--;
​
Questa tecnica evita scatti improvvisi e rende il movimento più controllato.

💾 Salvataggio nella EEPROM

Premendo contemporaneamente i due pulsanti per circa due secondi, Arduino salva la posizione richiesta nella EEPROM.

La memoria EEPROM conserva il valore anche dopo lo spegnimento.

Al successivo avvio, Arduino recupera la posizione salvata e porta gradualmente il servo verso quell’angolo.

La funzione EEPROM.update() scrive il valore soltanto se è realmente cambiato, riducendo l’usura della memoria.

🔘 Pressione lunga dei pulsanti
​

La cancellazione o il salvataggio tramite una semplice pressione potrebbe avvenire accidentalmente.

Per questo il programma richiede che entrambi i pulsanti siano mantenuti premuti per due secondi.

Quando il salvataggio è completato, il display mostra:
POSIZIONE SALVATA

📟 Informazioni visualizzate
​

Il display LCD mostra:
  • angolo impostato;
  • angolo attualmente applicato;
  • stato del movimento;
  • conferma del salvataggio.
​
Le stringhe fisse vengono conservate nella memoria Flash tramite F(), riducendo l’utilizzo della RAM di Arduino UNO.

 ⚠️ Precisione reale del servo
 
Il comando servo.write() permette di specificare un angolo, ma la precisione reale dipende da:
  • qualità del servomotore;
  • gioco degli ingranaggi;
  • alimentazione;
  • peso applicato;
  • tolleranze interne;
  • montaggio meccanico.

Un servo economico potrebbe non raggiungere esattamente ogni singolo grado.
​
👉 Il progetto controlla con precisione il comando inviato, ma non misura direttamente la posizione meccanica reale dell’albero.

🧠 Perché è un progetto importante
​

Con questo progetto impari a:
  • controllare un servomotore;
  • utilizzare un potenziometro;
  • realizzare una regolazione fine;
  • distinguere posizione richiesta e attuale;
  • creare un movimento graduale;
  • applicare una tolleranza alle letture analogiche;
  • riconoscere una pressione lunga;
  • salvare un valore nella EEPROM;
  • utilizzare un display LCD;
  • sviluppare codice compatibile con Arduino UNO.

🔄 Varianti possibili
​

Vuoi migliorare il progetto?
  • 🎛️ sostituisci il potenziometro con un encoder rotativo;
  • 🔘 aggiungi un pulsante per richiamare una posizione predefinita;
  • 💾 salva più posizioni nella EEPROM;
  • 🤖 utilizza due servomotori;
  • 🦾 controlla un piccolo braccio robotico;
  • 📟 crea un menu LCD;
  • 🔔 aggiungi un buzzer di conferma;
  • ⚡ aggiungi un pulsante di arresto;
  • 🎯 crea tre posizioni preimpostate;
  • 🕹️ utilizza un joystick;
  • 📊 invia la posizione al Serial Plotter;
  • 📱 controlla il servo tramite Bluetooth.

Foto
Foto

© ProgettiArduino.com 2026 - Fancello Salvatore
​ Layout, immagini e testi sono di esclusiva proprietà di www.progettiarduino.com 
Privacy Policy