Lezione 86: Controllo della posizione di un servomotore utilizzando il potenziometro
Immagina di girare una semplice manopola e guardare un braccio meccanico seguire con precisione ogni tuo movimento. Questa è la magia di combinare un potenziometro con un servomotore. Questo progetto, parte del Corso Arduino Step by Step di Robojax, dimostra un concetto fondamentale e incredibilmente utile in elettronica: tradurre un ingresso analogico in un movimento fisico preciso. Imparerai come leggere una tensione variabile da un potenziometro, mappare quel valore su un intervallo di angoli e comandare un servomotore per ruotare in quella posizione esatta. Questa è la tua porta d'accesso per costruire progetti intuitivi e interattivi dove il controllo manuale incontra l'automazione.

Le applicazioni per questa abilità sono vaste e pratiche. Ecco solo alcune idee per ispirarti:
- Controllo di un braccio robotico: Usa un potenziometro per posizionare manualmente ogni giunto di un braccio robotico per operazioni precise di prelievo e posizionamento.
- Sistema di panoramica e inclinazione per fotocamera: Costruisci un supporto per fotocamera telecomandato per time-lapse o sorveglianza, con panoramica e inclinazione fluide tramite la rotazione di una manopola.
- Replica di indicatore analogico: Crea un indicatore fisico da cruscotto (come un tachimetro o un quadrante di temperatura) che si muove in base ai dati del sensore, con il potenziometro che funge da override manuale o strumento di calibrazione.
- Installazioni artistiche interattive: Crea sculture cinetiche che rispondono all'input dello spettatore, dove girare una manopola cambia la posizione delle parti in movimento.
- Sterzo per veicoli modello: Controlla l'angolo di sterzo di un'auto o barca modello da remoto, offrendo una sensazione più intuitiva e analogica rispetto ai pulsanti digitali.
Questa guida si basa sul video tutorial Lezione 86: Controllare la posizione di un servomotore usando un potenziometro di Robojax (nel video a 00:00). Ti accompagna attraverso l'intero processo, dalla comprensione del cablaggio alla spiegazione del codice che fa funzionare tutto. Iniziamo.
Hardware e Componenti
Per seguire questo progetto, avrai bisogno dei seguenti componenti:
- Una scheda Arduino (es. Uno, Nano)
- Un servomotore standard (es. SG90 o MG996R)
- Un potenziometro (resistore variabile, tipicamente 10kΩ)
- Cavi jumper
- Una breadboard (opzionale, per connessioni più facili)
Capire il Cablaggio
Il cablaggio per questo progetto è semplice. La chiave è fornire le corrette connessioni di alimentazione e segnale sia per il servo che per il potenziometro. Il servo è un dispositivo che richiede molta energia, quindi riceve la sua alimentazione direttamente dal pin 5V di Arduino. Il potenziometro agisce come un partitore di tensione, e leggiamo la tensione al suo cursore (il pin centrale) per determinare la sua posizione. (nel video a 01:05)
Un trucco intelligente che questo progetto usa è creare una sorgente 5V aggiuntiva su un pin digitale per alimentare il potenziometro, poiché alcune schede Arduino hanno solo un pin 5V dedicato. Questo viene fatto nel codice impostando un pin digitale (pin 8) a HIGH, che emette 5V. (nel video a 00:39)
Ecco lo schema di cablaggio menzionato nel video:
Analizziamo le connessioni:
- Servomotore:
- Alimentazione (filo rosso) → pin 5V di Arduino
- Terra (filo marrone/nero) → pin GND di Arduino
- Segnale (filo arancione/giallo) → pin 3 di Arduino (un pin con capacità PWM)
- Potenziometro:
- Pin sinistro → pin GND di Arduino li>Pin centrale (cursore) → pin analogico A0 di Arduino
- Pin destro → pin 8 di Arduino (definito come VCC2 nel codice)
Spiegazione del Codice
Il codice per questo progetto è elegantemente semplice. Sfrutta alcune funzioni chiave di Arduino per leggere il potenziometro e controllare il servo. Concentriamoci sulle parti configurabili dall'utente che puoi adattare per i tuoi progetti. (nel video a 03:00)
All'inizio dello sketch, definirai i pin e creerai l'oggetto servo. Queste sono le variabili principali che cambierai in base al tuo cablaggio:
#include <Servo.h>
Servo myservo; // crea un oggetto servo per controllare un servomotore
int potpin = A0; // pin analogico usato per collegare il potenziometro
int servoPin = 3; // definisci un pin digitale (con PWM) per il servo. Puoi usare solo i pin 3, 5, 6, 9, 10, 11
int VCC2 = 8;// definisci VCC extra per il potenziometro
int val; // variabile per leggere il valore dal pin analogico
Ecco cosa fa ogni parte:
- Servo myservo;: Questa riga crea un oggetto chiamato
myservoche useremo per controllare il nostro specifico servomotore. Puoi rinominarlo, ma devi usare lo stesso nome più avanti nel codice. - int potpin = A0;: Questo definisce quale pin analogico è collegato al cursore del potenziometro. Se sposti il filo su un pin analogico diverso, devi aggiornare questo numero.
- int servoPin = 3;: Questo imposta il pin digitale per il filo del segnale del servo. È fondamentale usare un pin con capacità PWM (di solito quelli contrassegnati con '~' sulla scheda). Il commento elenca i pin validi per la maggior parte degli Arduino.
- int VCC2 = 8;: Questo è il pin che stiamo usando come sorgente 5V secondaria per il potenziometro. Se hai una scheda con più pin 5V, puoi collegarlo direttamente e rimuovere questa parte del codice.
Nella funzione setup(), il codice inizializza il servo e configura il pin di alimentazione aggiuntivo. La funzione myservo.attach(servoPin) è essenziale perché indica ad Arduino quale pin è collegato al filo del segnale del servo.
void setup() {
Serial.begin(9600); // imposta la seriale
myservo.attach(servoPin); // collega il servo sul pin 3 all'oggetto servo
pinMode(VCC2, OUTPUT);// imposta il pin 8 come uscita
digitalWrite(VCC2, HIGH);// imposta il pin 8 su HIGH così funge da pin 5V
}
La logica principale è nella funzione loop(). Legge il valore del potenziometro, lo scala in un angolo e comanda al servo di muoversi. Le due funzioni critiche qui sono analogRead() e map(). (nel video a 04:27)
void loop() {
val = analogRead(potpin); // legge il valore del potenziometro (valore tra 0 e 1023)
val = map(val, 0, 1023, 0, 180); // lo scala per usarlo con il servo (valore tra 0 e 180)
myservo.write(val); // imposta la posizione del servo in base al valore scalato
Serial.print(val);
Serial.println();
delay(50); // attende che il servo raggiunga la posizione
}
Ecco come funziona:
- analogRead(potpin): Questa funzione legge la tensione dal cursore del potenziometro e restituisce un valore tra 0 (0V) e 1023 (5V).
- map(val, 0, 1023, 0, 180): Questa è la chiave dell'intero progetto. Prende il valore grezzo dal potenziometro (da 0 a 1023) e lo converte proporzionalmente in un angolo del servo (da 0 a 180 gradi). Ad esempio, se il potenziometro legge 511 (circa la metà), la funzione
map()restituirà 90, portando il servo alla sua posizione centrale. - myservo.write(val): Questa funzione prende l'angolo calcolato (ora memorizzato in
val) e dice al servo di ruotare in quella posizione. - delay(50): Aggiunge una breve pausa alla fine di ogni ciclo. Controlla la frequenza di aggiornamento. Un ritardo maggiore (come 200ms) fa muovere il servo a scatti, mentre un ritardo minore (come 50ms) rende il movimento molto fluido. Puoi regolarlo per cambiare la reattività. (nel video a 07:26)
Dimostrazione dal Vivo del Progetto
Nel video, puoi vedere il progetto in azione. Mentre la manopola del potenziometro viene girata, il braccio del servomotore segue proporzionalmente la sua posizione. Il monitor seriale stampa l'angolo corrente, confermando che la mappatura funziona correttamente. Quando il potenziometro è nella posizione minima, il servo è a 0 gradi. Mentre giri la manopola al massimo, il servo ruota dolcemente fino a 180 gradi. (nel video a 06:33)
Questo ciclo di feedback in tempo reale dimostra l'integrazione perfetta di un sensore analogico con un attuatore digitale, creando un sistema di controllo reattivo e intuitivo.
Capitoli
- [00:00] Introduzione e Panoramica del Progetto
- [01:05] Schema Elettrico e Diagramma di Cablaggio
- [02:07] Dimostrazione del Cablaggio Fisico
- [03:00] Spiegazione del Codice
- [06:33] Dimostrazione dal Vivo e Test
- [07:26] Regolazione della Velocità di Risposta del Servo
/*
* Lesson 88: Controlling Servo motor a with Potentiometer
* 📚⬇️ Download and resource page https://robojax.com/RJT763
watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
Update by Ahmad Shamshiri on Jan 01, 2019 in Ajax, Ontario, Canada
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = A0; // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val; // variable to read the value from the analog pin
void setup() {
//
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 3 to the servo object
pinMode(VCC2, OUTPUT);// set pin 8 as output
digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
Serial.print(val);
Serial.println();
delay(50); // waits for the servo to get there
}
Cose di cui potresti avere bisogno
-
Amazon
-
Amazon
-
eBay
-
AliExpressAcquista il servomotore SG90 da 180 o 360 da AliExpresss.click.aliexpress.com
Risorse e riferimenti
File📁
Altri file
-
Scheda tecnica del motore SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB