Componente · Driver

Driver per motori TB6612FNG

TB6612FNG è un doppio ponte H a MOSFET che pilota due motori DC perdendo quasi nessuna tensione; è l'aggiornamento efficiente rispetto all'L298N.

Che cos’è

TB6612FNG è un driver per motori a doppio ponte H che svolge lo stesso compito di L298N — sta tra i pin logici di un microcontrollore e motori che richiedono molta più corrente — ma realizza lo stadio di uscita con MOSFET anziché con transistor bipolari. Questa singola modifica è tutta la storia: un interruttore MOSFET perde qualche decimo di volt, mentre lo stadio dell’L298N ne perde circa due.

Con una batteria da 6 V che pilota motori da 6 V, la differenza rappresenta gran parte della velocità. Rappresenta anche gran parte del calore: l’L298N richiede un dissipatore alle correnti prolungate, mentre una scheda portante TB6612FNG grande come un francobollo diventa soltanto tiepida.

Schema a blocchi: una schiera di riflettanza QTR-MD-08A alimenta un Arduino Nano tramite i pin da A0 ad A7; il Nano pilota un TB6612FNG usando STBY, PWMA, PWMB e i quattro pin di direzione; le uscite del driver alimentano i motori sinistro e destro e una batteria separata per i motori alimenta il pin VM del driver.
L'intera catena di azionamento di un robot per labirinto di linee. Nota che la batteria dei motori raggiunge soltanto VM: i 5 V di Arduino alimentano la logica, mai la corrente dei motori. Scarica SVG

Come controllarlo

Ogni motore richiede tre segnali, più un pin condiviso per il chip:

  • Due pin di direzione (AIN1/AIN2 per il motore A, BIN1/BIN2 per il motore B) selezionano marcia avanti, marcia indietro, freno o moto libero.
  • Un pin PWM (PWMA o PWMB) imposta la velocità. A differenza di L298N, in cui il PWM è applicato a un pin di abilitazione, TB6612FNG dispone di un ingresso PWM dedicato per ogni canale, che accetta fino a 100 kHz: abbastanza elevati per commutare sopra la gamma udibile, così il robot smette di ronziare.
  • Un pin STBY condiviso. Tienilo a livello LOW ed entrambi i ponti sono inattivi, indipendentemente da tutto il resto.

Vale la pena ripetere il discorso sul pin STBY, perché costa una serata ai principianti: un TB6612FNG cablato correttamente con STBY lasciato libero o a livello LOW non fa assolutamente nulla, in silenzio e senza alcun errore da consultare.

Quando usarlo

Scegli TB6612FNG quando i motori sono piccoli e la batteria è preziosa: è una descrizione che vale per quasi ogni inseguitore di linee e robot per labirinto di linee. I piccoli robot funzionano a 6–7.4 V, esattamente l’intervallo in cui la perdita di 2 V dell’L298N fa più danno, e usano una batteria che si preferisce non sprecare sotto forma di calore.

Resta con L298N quando l’alimentazione dei motori supera 13.5 V, valore che TB6612FNG non accetta, oppure quando servono più di circa 1.2 A in continuo per canale.

Cablaggio e aspetti critici

  • Porta STBY a livello HIGH. La prima cosa che setup() deve fare dopo pinMode.
  • Due alimentazioni, una terra. Batteria dei motori a VM, Arduino 5 V a VCC e tutte le terre collegate insieme — Arduino, driver, schiera di sensori e negativo della batteria. Una terra comune mancante non dà riferimento ai segnali di controllo e il guasto è silenzioso.
  • Rispetta 13.5 V. Non c’è un regolatore a bordo né margine oltre l’alimentazione massima dei motori. Un pacco al litio 3S da 12.6 V nominali la supera appena caricato.
  • Un motore che gira nel verso sbagliato si corregge in due secondi. Scambia i due fili di uscita di quel motore oppure inverti la logica di direzione nel firmware. Fallo prima di regolare qualsiasi altro parametro, altrimenti perderai tempo inseguendo un errore di controllo che in realtà è di cablaggio.

Piedinatura

Due file sulla comune scheda portante in stile SparkFun: logica da un lato, alimentazione e motori dall’altro.

Lato Pin Funzione
Logica VCC Alimentazione logica, 2.7–5.5 V dal microcontrollore
Logica GND Terra. Tutte le terre del robot sono collegate qui
Logica STBY Standby, attivo a livello basso. LOW = entrambi i ponti inattivi, in silenzio
Logica AIN1, AIN2 Direzione del motore A
Logica PWMA Velocità del motore A. Accetta fino a 100 kHz
Logica BIN1, BIN2 Direzione del motore B
Logica PWMB Velocità del motore B
Alimentazione VM Alimentazione dei motori, 2.5–13.5 V. Nessun regolatore, nessun margine
Alimentazione GND Terra dei motori
Motori AO1, AO2 Morsetti del motore A
Motori BO1, BO2 Morsetti del motore B (BO1, BO2)

Tabella di verità

STBY IN1 IN2 PWM Risultato
LOW × × × Nulla. Entrambi i ponti spenti, nessun errore, nessun indizio
HIGH HIGH LOW PWM Marcia avanti al ciclo di lavoro indicato
HIGH LOW HIGH PWM Marcia indietro al ciclo di lavoro indicato
HIGH HIGH HIGH × Freno breve
HIGH LOW LOW HIGH Arresto (moto libero)

La prima riga è quella che costa una serata. Una scheda cablata perfettamente con STBY lasciato libero non fa assolutamente nulla, e un pin non pilotato è per definizione libero. Portalo a livello HIGH in setup(), alla prima riga dopo pinMode.

Cablaggio ad Arduino

TB6612FNG Arduino Uno Nota
VCC 5 V Solo logica, pochi milliampere
GND GND Anche al negativo della batteria e alla terra di ogni sensore
STBY Pin 12 Oppure collegalo a 5 V tramite una resistenza da 10 kΩ se non vuoi mai disabilitare il driver
PWMA Pin 9 Deve supportare PWM
AIN1 Pin 8
AIN2 Pin 7
PWMB Pin 3 Deve supportare PWM
BIN1 Pin 5
BIN2 Pin 4
VM Batteria dei motori + 2.5–13.5 V: controlla la tensione reale di un pacco appena caricato

Codice funzionale minimo

const int STBY = 12;
const int PWMA = 9, AIN1 = 8, AIN2 = 7;
const int PWMB = 3, BIN1 = 5, BIN2 = 4;

void setup() {
  for (int p : {STBY, PWMA, AIN1, AIN2, PWMB, BIN1, BIN2}) pinMode(p, OUTPUT);
  digitalWrite(STBY, HIGH);          // without this, nothing happens at all
}

// speed: -255..255
void driveA(int speed) {
  speed = constrain(speed, -255, 255);
  digitalWrite(AIN1, speed > 0);
  digitalWrite(AIN2, speed < 0);
  analogWrite(PWMA, abs(speed));
}

void brakeA() {                       // short brake: both direction pins high
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, HIGH);
}

void loop() {
  driveA(200); delay(1000);
  brakeA();    delay(300);
  driveA(-200); delay(1000);
  brakeA();    delay(300);
}

Eliminare il ronzio

Questo è il silenzioso superpotere di TB6612FNG, che quasi nessuno sfrutta. Il driver accetta PWM fino a 100 kHz, ma analogWrite di Arduino Uno funziona a 490 Hz sulla maggior parte dei pin e a 980 Hz sui pin 5 e 6, nettamente nella gamma udibile: è per questo che un robot cant mentre si muove.

L’orecchio umano arriva fino a circa 20 kHz. Portando il PWM sopra questa soglia il rumore scompare completamente. Su Uno, i pin 9 e 10 sono controllati dal Timer 1, che è possibile riprogrammare:

void setup() {
  // Timer1 (pins 9, 10): phase-correct PWM, no prescaler -> ~31.4 kHz
  TCCR1B = (TCCR1B & 0b11111000) | 0x01;
}

Questa singola riga porta la frequenza di commutazione a circa 31 kHz: impercettibile e ancora ben all’interno della capacità del driver. Il costo è che anche Timer 1 è usato dalla libreria Servo, quindi non è possibile usarli entrambi sullo stesso timer.

Un L298N non può seguirti fin lassù: il suo stadio bipolare commuta troppo lentamente e le perdite aumentano fortemente con la frequenza. Questo è un vantaggio reale e pratico dello stadio MOSFET, al di là dei soli dati di efficienza.

Che cosa si guadagna davvero con 0.5 V invece di 2 V

Alimentazione Tensione erogata dall’L298N Tensione erogata dal TB6612FNG Ulteriore disponibilità
6 V (4×AA) ~4.0 V ~5.5 V +38%
7.4 V (2S Li-ion) ~5.4 V ~6.9 V +28%
12 V ~10.0 V ~11.5 V +15%

Più bassa è l’alimentazione, più conta la differenza: è esattamente il contrario di dove ci si aspetta che conti ed è proprio il motivo per cui il passaggio trasforma i piccoli robot.

C’è anche una conseguenza termica. A 1 A per canale l’L298N dissipa circa 2 W per canale; il TB6612FNG dissipa circa 0.5 W complessivamente. È la differenza fra un componente che richiede dissipatore e flusso d’aria e uno che puoi nascondere sotto una piastra del telaio.

Risoluzione dei problemi

Sintomo Causa probabile Soluzione
Non accade assolutamente nulla STBY libero o a livello LOW Portalo a livello HIGH: è la prima cosa da controllare, ogni volta
Non accade nulla, STBY è alto Nessuna terra comune Collega insieme driver, scheda, sensori e negativo della batteria
Un motore gira al contrario Fili o logica invertiti Scambia i due fili di uscita del motore oppure inverti la sua logica
La velocità è soltanto on/off Il pin PWM non supporta PWM Su Uno usa 3, 5, 6, 9, 10 o 11
Ronzio forte durante il movimento PWM nella gamma udibile Porta la frequenza del timer sopra circa 20 kHz
Il driver si è scaldato e ha smesso di funzionare VM superiore a 13.5 V Un pacco 3S appena caricato è a 12.6 V e sale; verificalo durante la carica
I motori vanno a scatti sotto carico L’alimentazione cala oppure la corrente supera 1.2 A in continuo Pacco più grande oppure collega in parallelo i due canali per un solo motore
Funziona sul banco, ma non sul tappeto Corrente continua superiore alla nominale Il tappeto aumenta il carico; misura la corrente nelle condizioni reali

I due canali possono essere collegati in parallelo per un solo motore: collega AIN1 a BIN1, AIN2 a BIN2, PWMA a PWMB e le uscite insieme, ottenendo circa 2.4 A in continuo. Il foglio dati lo supporta ed è la soluzione standard quando un motore supera di poco il limite.

Quando TB6612FNG è la scelta sbagliata

È la scelta predefinita corretta per i piccoli robot e ci sono tre casi chiari in cui non lo è.

Sopra 13.5 V. Non c’è margine né regolatore. Un pacco 4S è fuori discussione e un pacco 3S richiede un controllo quando è appena caricato.

Sopra circa 1.2 A in continuo per canale, quando anche il collegamento in parallelo non basta. Un L298N gestisce 2 A per canale con un dissipatore e un BTS7960 raggiunge 43 A per motori davvero grandi.

Quando servono rilevamento o limitazione della corrente. DRV8833 è simile a TB6612FNG sotto ogni altro aspetto e aggiunge la limitazione di corrente, che permette al driver di proteggersi dallo stallo anziché affidarsi al codice per accorgersene.

Esplora il grafo

Usato in queste costruzioni

Progetti, percorsi di apprendimento e simulatori che includono Driver per motori TB6612FNG.

Confronto

Alternative

Domande

FAQ su Driver per motori TB6612FNG

Che cos'è il driver per motori TB6612FNG?

TB6612FNG è un driver per motori a doppio ponte H realizzato con MOSFET anziché con i più vecchi transistor bipolari. Riceve dal microcontrollore segnali di direzione e PWM a bassa potenza e commuta un'alimentazione separata dei motori per pilotare indipendentemente due motori DC, fornendo 1.2 A in continuo per canale e picchi di 3.2 A.

TB6612FNG è migliore di L298N?

Per i piccoli motori dei robot, sì. Lo stadio di uscita a transistor dell'L298N perde circa 2 V prima che il segnale raggiunga il motore, perciò un motore da 6 V alimentato da un pacco da 6 V funziona in modo debole e il chip richiede un dissipatore. Lo stadio MOSFET del TB6612FNG perde soltanto qualche decimo di volt, resta freddo senza dissipatore ed è molto più piccolo. L298N resta migliore quando servono più di 13.5 V per i motori, valore che TB6612FNG non accetta.

Come si collega TB6612FNG ad Arduino?

Collega il positivo della batteria dei motori a VM, Arduino 5 V a VCC e tutte le terre insieme — Arduino, driver, sensori e negativo della batteria. Poi collega STBY a un pin digitale e, per ogni motore, a due pin di direzione (AIN1/AIN2 oppure BIN1/BIN2) più un pin PWM (PWMA oppure PWMB). I motori si collegano ai morsetti AO1/AO2 e BO1/BO2.

Che cosa fa il pin STBY di TB6612FNG?

STBY è un'abilitazione in standby per l'intero chip. Tenuto a livello LOW, entrambi i ponti sono disabilitati e i motori si muovono per inerzia qualunque cosa dicano gli altri pin. Bisogna portarlo a livello HIGH prima che qualsiasi cosa si muova. Dimenticarlo è il motivo più comune per cui un TB6612FNG appena cablato non fa assolutamente nulla.

Quanta corrente può gestire TB6612FNG?

1.2 A in continuo per canale, con picchi brevi fino a 3.2 A. Copre agevolmente i piccoli motori giallo e i motori N20 usati negli inseguitori di linee e nei robot da labirinto. I motori più grandi che vanno in stallo sopra 1.2 A attivano la protezione termica, quindi è meglio passare a un driver come DRV8871 o a un vero ESC per motori con spazzole.

Per approfondire

Fonti