Componente · Attuatore

Servomotore SG90

SG90 è il servomotore da 9 grammi dietro giunti e sterzi di molti robot per principianti. Scopri come mantiene un angolo, cosa solleva e come pilotarlo.

Che cos’è

SG90 è un microservomotore: un piccolo attuatore autonomo che ruota fino a un angolo comandato e lo mantiene. Mentre un semplice motore DC si limita a girare, un servomotore mira: se gli ordini «90 gradi», si porta autonomamente a 90 gradi e resiste allo spostamento. Questo lo rende la scelta naturale per tutto ciò che deve raggiungere una posizione nota: un giunto di braccio robotico, una pinza che apre e chiude, un supporto telecamera pan-tilt o lo sterzo di un piccolo rover.

Con nove grammi e un paio di dollari è il servomotore con cui quasi tutti iniziano. Non è abbastanza robusto o preciso per lavori impegnativi, ma è il modo più rapido per capire come si sente il controllo di posizione.

Schema del controllo di un servomotore: un segnale PWM a 50 Hz la cui larghezza d'impulso determina l'angolo del servomotore. Un impulso di 1 millisecondo comanda 0 gradi, 1.5 millisecondi comanda 90 gradi e 2 millisecondi comanda 180 gradi, mostrati su quadranti.
Un servomotore legge la larghezza dell'impulso, non la tensione: 1 ms corrisponde a 0°, 1.5 ms al centro e 2 ms all'escursione completa, ripetuti 50 volte al secondo. Scarica SVG

Come funziona

Aprendone uno trovi quattro elementi: un piccolo motore DC, un riduttore che scambia velocità con coppia, un potenziometro accoppiato all’albero di uscita e un circuito di controllo. Il potenziometro è l’elemento chiave: segnala continuamente l’angolo reale dell’albero. Il circuito confronta quest’angolo misurato con quello comandato e aziona il motore nella direzione che riduce la differenza. È un anello di retroazione completo in miniatura, motivo per cui il braccio con cinematica inversa può fidarsi del raggiungimento della posizione di destinazione da parte del servomotore.

L’angolo viene comandato con un segnale PWM a 50 Hz e la larghezza dell’impulso trasporta l’informazione: circa 1 ms per un estremo dell’escursione, 1.5 ms per il centro e 2 ms per l’altro estremo. Questo è PWM usato come codice di posizione anziché come codice di velocità. In pratica la libreria Arduino Servo nasconde la temporizzazione e basta scrivere un angolo.

Quando usarlo

Usa un SG90 ogni volta che una parte del robot deve raggiungere e mantenere un angolo specifico sotto un carico leggero: dita della pinza, piccoli giunti di braccio, supporti di sensori oppure sterzo di un’auto leggera. Il suo intervallo di circa 180° e il controllo immediato «vai a questo angolo» sono ideali per imparare la cinematica e costruire meccanismi espressivi.

Cerca altrove quando il giunto sostiene un peso reale (usa un servomotore con ingranaggi metallici o di dimensione standard), quando serve la rotazione continua per una ruota (usa un motore DC e un L298N, oppure un servomotore a rotazione continua) oppure quando servono molti gradi di movimento preciso ad alta coppia (usa un motore passo-passo).

Cablaggio e aspetti critici

  • Alimentalo separatamente. Un SG90 in stallo può assorbire 500–700 mA, molto più di quanto possa fornire il pin 5 V di un microcontrollore. Usa un alimentatore dedicato da 5 V e collega la sua terra alla terra della scheda, altrimenti la scheda entrerà in calo di tensione e si riavvierà.
  • Non effettua la rotazione continua. Un SG90 standard compie circa 180° e si ferma. Il comando «ruota per sempre» non produce nulla; per una ruota motrice serve un attuatore diverso.
  • Non forzarlo e non metterlo in stallo. Gli ingranaggi in nylon si spaccano in caso di sovraccarico o colpo brusco. Mantieni i carichi leggeri oppure passa agli ingranaggi metallici.
  • Aspettati qualche lieve oscillazione. I servomotori economici oscillano leggermente attorno al bersaglio. Un’alimentazione stabile e pulita e la disconnessione del segnale quando il giunto non deve mantenere la posizione la riducono entrambe.

Cablaggio

Tre cavi e colori quasi universali sui servomotori hobbistici:

Cavo Colore (SG90) Funzione
1 Marrone Terra
2 Rosso Alimentazione, 4.8–6 V
3 Arancione Segnale — il PWM a 50 Hz

Alcuni servomotori usano nero/rosso/bianco oppure nero/rosso/giallo. La regola che vale sempre è: il rosso è al centro e la terra è il colore più scuro dei tre.

SG90 Arduino Uno Nota
Marrone GND Deve essere in comune con la terra dell’alimentatore del servomotore
Rosso Non il 5 V di Arduino Un alimentatore separato da 5 V — vedi sotto
Arancione Qualsiasi pin digitale La libreria Servo funziona su qualsiasi pin

Perché non usare il pin 5 V di Arduino

Un SG90 assorbe circa 10 mA a riposo, 150–250 mA in movimento e 650 mA in stallo. L’alimentazione USB che alimenta Uno è limitata a 500 mA per l’intera scheda e il regolatore integrato, quando alimentato tramite il jack cilindrico, ha un proprio limite termico.

Un solo servomotore che si muove delicatamente spesso funziona, ed è proprio il problema: funziona sul banco e poi entra in calo di tensione non appena incontra resistenza. Il sintomo è una scheda che si riavvia ogni volta che il braccio raggiunge una posizione specifica, apparentemente un errore software.

Fornisci un alimentatore separato da 5 V, collega le terre e metti un condensatore da 470 µF tra i poli dell’alimentazione del servomotore, vicino al connettore.

Rapporto tra larghezza dell’impulso e angolo

Un servomotore non legge la tensione. Legge per quanto tempo dura l’impulso, cinquanta volte al secondo.

Larghezza dell’impulso Angolo nominale Comportamento reale di SG90
1.0 ms 0° Spesso si ferma circa 10–15° prima
1.5 ms 90° Centro, solitamente preciso
2.0 ms 180° Spesso si ferma circa 10–15° prima
< 0.5 ms o > 2.5 ms — Ronzia contro un finecorsa assorbendo corrente di stallo

L’intervallo 1–2 ms è una convenzione, non uno standard. Molti SG90 raggiungono i veri finecorsa più vicino a 0.6 ms e 2.4 ms, motivo per cui la libreria Arduino Servo accetta in attach() larghezze minima e massime facoltative:

servo.attach(9, 600, 2400);   // instead of the 544/2400 defaults

Calibrare questo aspetto per ogni servomotore è la differenza fra un braccio che raggiunge tutto il proprio spazio di lavoro e uno che si ferma misteriosamente 20° prima a entrambi gli estremi.

Codice funzionale minimo

#include <Servo.h>

Servo joint;
const int PIN = 9;

void setup() {
  joint.attach(PIN, 600, 2400);   // calibrate these two numbers per servo
  joint.write(90);                 // centre before doing anything else
  delay(500);
}

// Move gently instead of jumping — a servo commanded to jump goes at full speed.
void sweepTo(int target, int stepDelayMs) {
  int current = joint.read();
  int step = (target > current) ? 1 : -1;
  while (current != target) {
    current += step;
    joint.write(current);
    delay(stepDelayMs);
  }
}

void loop() {
  sweepTo(20, 15);
  delay(400);
  sweepTo(160, 15);
  delay(400);
}

joint.write(160) e la scansione terminano entrambi a 160°, ma sono eventi elettricamente completamente diversi. Il salto comanda la velocità massima e su un giunto carico provoca un picco di 650 mA e uno shock meccanico attraverso gli ingranaggi in nylon. La scansione distribuisce lo stesso movimento in due secondi e assorbe una frazione della corrente. Su un braccio a più giunti è la differenza fra un alimentatore che reggie e uno che non regge.

Coppia: che cosa significa realmente 1.8 kg·cm

La specifica è 1.8 kg·cm a 4.8 V: significa che il servomotore può sostenere 1.8 kg a 1 cm dall’albero, oppure 1.8/L kg a L centimetri. È quest’ultima parte a trarre in inganno.

Lunghezza del braccio dall’albero Carico massimo (stallo) Carico di lavoro sicuro (~30%)
1 cm 1800 g 540 g
5 cm 360 g 108 g
10 cm 180 g 54 g
15 cm 120 g 36 g

Ci sono due aspetti da trarne. Primo, la coppia diminuisce linearmente con la distanza, quindi un tratto di braccio di 15 cm può sollevare soltanto 120 g al massimo assoluto in stallo. Secondo, non progettare mai in base al valore di stallo. Un servomotore in stallo assorbe corrente massima, non produce movimento e si scalda; un terzo della coppia di stallo è un limite sensato per un giunto che deve mantenere una posizione per un tempo qualsiasi.

Il valore è inoltre indicato a 4.8 V. A 6 V lo stesso servomotore produce circa 2.2 kg·cm, uno dei pochi miglioramenti gratuiti nella robotica hobbistica, purché l’alimentatore possa fornire la corrente corrispondentemente maggiore.

Ridurre le oscillazioni

I servomotori economici oscillano leggermente attorno al bersaglio e vi sono quattro cause distinte che vale la pena distinguere:

  • Rumore dell’alimentazione. Il caso più comune. Un servomotore condivide una linea di alimentazione con i motori e interpreta ogni picco di corrente come una perturbazione di controllo. Usa un alimentatore separato e aggiungi un condensatore sul servomotore.
  • Oscillazioni nella temporizzazione del segnale. La libreria Servo genera gli impulsi via software e un loop occupato o un altro interrupt ne spostano i fronti. Passare a un PCA9685 risolve completamente il problema, perché genera gli impulsi in hardware.
  • Zona morta. Il controllore interno del servomotore ignora errori inferiori a circa 5 µs di larghezza d’impulso, equivalenti a circa 1°. Sotto questa risoluzione semplicemente non risponde e richiedere passi più fini non produce nulla.
  • Mantenimento contro un carico. Un servomotore che combatte la gravità al limite della propria coppia ronzia continuamente. Usa detach() quando il giunto non deve mantenere la posizione oppure bilancia meccanicamente il giunto.

Risoluzione dei problemi

Sintomo Causa probabile Soluzione
La scheda si riavvia quando il servomotore si muove Corrente del servomotore attraverso Arduino Alimentatore separato da 5 V, terra comune, condensatore da 470 µF
Ronzia continuamente e si scalda Comando oltre il finecorsa Riduci l’intervallo delle larghezze d’impulso in attach()
Compie soltanto circa 150° I valori predefiniti della libreria non raggiungono i veri finecorsa Usa attach(pin, 600, 2400) e regolalo
Si porta a un angolo completamente sbagliato Leva montata con una rotazione arbitraria Ogni giunto richiede uno scostamento di calibrazione e forse un’inversione del segno
Oscilla a riposo Rumore dell’alimentazione o impulsi temporizzati via software Prova prima con il condensatore; usa PCA9685 se il problema persiste
Gli ingranaggi si spaccano e slittano Gli ingranaggi in nylon hanno ceduto per un urto o un sovraccarico MG90S con ingranaggi metallici; riduci il carico o la velocità
Diventa più lento e debole nel tempo L’alimentazione cala mentre la batteria si scarica La coppia è proporzionale alla tensione: misura la linea sotto carico
Non ruota in modo continuo È un servomotore posizionale Usa un servomotore a rotazione continua o un motore DC con riduttore

SG90 o qualcos’altro?

Componente Coppia a 4.8 V Ingranaggi Quando sceglierlo
SG90 1.8 kg·cm Nylon Apprendimento, pinze leggere, supporti di sensori
MG90S 2.2 kg·cm Metallici Stessa dimensione, sopravvive agli urti: il miglioramento intercambiabile
MG996R 9.4 kg·cm Metallici Giunti di dimensione standard che sostengono un peso reale
SG90 a rotazione continua — Nylon Una ruota motrice, dove serve la velocità e non l’angolo
Motore passo-passo NEMA 17 ~40 N·cm — Posizionamento preciso e ripetibile senza zona morta

Un avVERTimento sulle «pinze leggere» nella prima riga. Una pinza è l’unica applicazione in cui SG90 passa la vita in stallo: trattenere un oggetto non è movimento, quindi l’avvolgimento assorbe circa 0.5 A senza nulla che lo raffreddi ed è il modo abituale in cui questi servomotori muoiono. È anche il motivo per cui la forza delle dita dipende dal braccio di leva anziché dalla coppia indicata sulla scatola: 0.176 N·m su una dita di 30 mm danno 5.87 N in stallo e circa 4.11 N effettivamente sostenibili. Dimensionare una pinza con servomotore copre entrambi gli aspetti e il simulatore di pinze eseguirà il calcolo per la tua dita.

Il riassunto onesto è che SG90 è un attuatore didattico. È il modo più rapido per capire come si sente il controllo di posizione e non è abbastanza robusto o ripetibile per un giunto importante. Quando un progetto smette di funzionare perché il servomotore non è abbastanza preciso, MG90S è di solito la risposta: stesse dimensioni, stesso cablaggio, ingranaggi metallici.

Esplora il grafo

Usato in queste costruzioni

Progetti, percorsi di apprendimento e simulatori che includono Servomotore SG90.

Confronto

Alternative

Domande

FAQ su Servomotore SG90

Che cos'è il servomotore SG90?

SG90 è un servomotore hobbistico da 9 grammi; un piccolo motore con ingranaggi che ruota fino a un angolo comandato e lo mantiene, invece di ruotare liberamente. È il servomotore più economico e diffuso nella robotica per principianti, usato per giunti di braccio, pinze, supporti per telecamera pan-tilt e sterzo.

Come funziona un servomotore?

All'interno si trovano un motore DC, un riduttore, un potenziometro e un circuito di controllo. Il potenziometro comunica al circuito l'angolo corrente; il circuito lo confronta con l'angolo comandato e aziona il motore finché non coincidono. Questo anello di retroazione integrato è ciò che permette a un servomotore di mantenere una posizione precisa.

Come si controlla un SG90 con Arduino?

Si invia un segnale PWM a 50 Hz in cui la larghezza dell'impulso determina l'angolo: circa 1 ms significa 0°, 1.5 ms significa 90° e 2 ms significa 180°. In pratica si usa la libreria Servo di Arduino e basta chiamare servo.write(angle): la libreria genera la temporizzazione.

Quanto peso può sollevare un SG90?

La coppia di stallo di SG90 è di circa 1.8 kg·cm, il che significa che può appena sostenere 1.8 kg con un braccio di 1 cm oppure circa 180 g con un braccio di 10 cm. Il carico continuo utilizzabile è molto inferiore. Per qualsiasi cosa più pesante o un braccio più lungo, passa a un servomotore con ingranaggi metallici come MG90S o a un servomotore di dimensione standard.

SG90 o MG90S — quale è migliore?

Sono della stessa dimensione e si controllano allo stesso modo, ma MG90S ha ingranaggi metallici e una coppia leggermente superiore, quindi sopravvive a stalli e carichi che porterebbero a spaccare gli ingranaggi in nylon di SG90. Usa SG90 per imparare e per carichi leggeri; scegli MG90S quando il giunto sostiene un peso reale o subisce urti.

Quanta corrente assorbe un SG90?

Un SG90 assorbe soltanto pochi milliampere a riposo, ma può salire a 500–700 mA quando va in stallo o si muove sotto carico. È troppo per il pin 5 V di Arduino, quindi alimenta i servomotori con un alimentatore separato da 5 V con terra comune, altrimenti Arduino entrerà in calo di tensione e si riavvierà.

Per approfondire

Fonti