🚀 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.
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:
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
I pulsanti utilizzano le resistenze interne INPUT_PULLUP di Arduino e non richiedono resistenze esterne.
- 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
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:
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:
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:
- apri Arduino IDE;
- seleziona Sketch → Include Library → Manage Libraries;
- cerca LiquidCrystal I2C;
- 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:
Potenziometro
Pulsante AUMENTA
Pulsante DIMINUISCI
Display LCD 16×2 I2C
Se il display non funziona, il tuo modulo potrebbe utilizzare 0x3F.
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.
Pulsante AUMENTA
- un terminale → pin digitale 2;
- terminale opposto → GND.
Pulsante DIMINUISCI
- un terminale → pin digitale 3;
- terminale opposto → GND.
Display LCD 16×2 I2C
- VCC → 5V;
- GND → GND;
- SDA → A4;
- SCL → A5.
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:
Collega sempre insieme:
👉 Non alimentare servomotori potenti direttamente dal pin 5V della scheda.
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;
Collega sempre insieme:
- GND dell’alimentatore;
- GND del servo;
- GND di Arduino.
👉 Non alimentare servomotori potenti direttamente dal pin 5V della scheda.
💻 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.
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.
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.
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:
Premendo il pulsante DIMINUISCI:
I limiti impediscono al valore di scendere sotto 10° o superare 170°.
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:
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
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.
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.
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
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:
Le stringhe fisse vengono conservate nella memoria Flash tramite F(), riducendo l’utilizzo della RAM di Arduino UNO.
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:
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.
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:
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?
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.