Arduino e MOSFET: controllare un motore DC senza sovraccaricare i pin
Impariamo a pilotare un motore in corrente continua con Arduino usando un MOSFET come interruttore elettronico di potenza, un diodo di protezione e il PWM del pin 9.
Perché non collegare un motore direttamente ad Arduino
I pin digitali di Arduino sono progettati per fornire segnali logici e pilotare piccoli carichi, non per alimentare direttamente motori elettrici. Un motore può assorbire una corrente molto più elevata, soprattutto durante l’avviamento o quando l’albero viene bloccato.
Per separare la parte di controllo dalla corrente richiesta dal carico utilizziamo un MOSFET N-channel. Arduino comanda il Gate, mentre il percorso di potenza del motore interessa Drain e Source.
Cos’è un MOSFET
Un MOSFET può essere visto, in questa applicazione, come un interruttore elettronico molto veloce. I suoi tre terminali principali sono Gate, Drain e Source.
| Terminale | Funzione |
|---|---|
| Gate (G) | Riceve il segnale di comando proveniente da Arduino |
| Drain (D) | È collegato al lato del carico controllato dal MOSFET |
| Source (S) | Nel classico circuito low-side viene collegato alla massa |
IRF520: si può usare, ma attenzione
MOSFET IRF520.
L’IRF520 può essere incontrato spesso nei kit didattici, ma non è la scelta ideale quando il Gate viene pilotato direttamente dai 5 V di Arduino. La sua bassa resistenza di conduzione viene specificata con una tensione Gate-Source più elevata; con il segnale logico di Arduino può quindi non accendersi completamente e dissipare più potenza del necessario.
Materiale necessario
🧰 Kit Arduino consigliato
Un kit completo permette di avere a disposizione breadboard, cavetti, resistenze e numerosi componenti per sperimentare con Arduino.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Nei miei libri trovi spiegazioni, schemi e progetti pratici dedicati ad Arduino ed elettronica.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema del circuito
Collegamento del MOSFET per comandare il motore senza far transitare la corrente del carico attraverso il pin di Arduino.
Il diodo di flyback protegge il circuito
Un motore è un carico induttivo. Quando il MOSFET interrompe rapidamente la corrente, l’induttanza del motore può generare un picco di tensione di polarità opposta. Il diodo collegato in antiparallelo al motore offre alla corrente induttiva un percorso sicuro e riduce lo stress sul MOSFET.
Resistenza sul Gate e pull-down
Una piccola resistenza in serie tra il pin Arduino e il Gate limita il picco di corrente necessario a caricare e scaricare la capacità di Gate. Una resistenza pull-down, ad esempio 10 kΩ, mantiene invece il MOSFET spento quando Arduino è in reset o il pin è ancora configurato come ingresso.
Alimentazione del motore
Il motore deve essere alimentato con una sorgente adatta alla sua tensione e alla sua corrente. Se utilizzi un’alimentazione esterna, la massa dell’alimentatore del motore e la GND di Arduino devono essere collegate insieme affinché il MOSFET riceva una tensione Gate-Source correttamente riferita.
Come regolare la velocità con il PWM
Il pin 9 di Arduino supporta il PWM. Con analogWrite() possiamo scegliere un valore compreso tra 0 e 255. Il MOSFET viene acceso e spento rapidamente e la variazione del duty cycle modifica la potenza media fornita al motore.
| analogWrite() | Duty cycle indicativo | Comportamento |
|---|---|---|
| 0 | 0% | Motore spento |
| 64 | ≈25% | Bassa potenza media |
| 128 | ≈50% | Potenza media intermedia |
| 192 | ≈75% | Potenza media elevata |
| 255 | 100% | Comando completamente attivo |
Codice Arduino commentato
/*
Arduino + MOSFET - controllo velocità motore DC
Il pin PWM 9 pilota il Gate del MOSFET.
Il valore PWM aumenta da 0 a 255 e poi diminuisce.
*/
const byte MOSFET_PIN = 9;
int pwmValue = 0;
int stepValue = 1;
unsigned long previousMillis = 0;
const unsigned long interval = 20;
void setup() {
pinMode(MOSFET_PIN, OUTPUT);
// Motore spento all'avvio
analogWrite(MOSFET_PIN, 0);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Applica il PWM al Gate del MOSFET
analogWrite(MOSFET_PIN, pwmValue);
// Aumenta o diminuisce gradualmente la velocità
pwmValue += stepValue;
// Inverte la rampa ai due estremi
if (pwmValue >= 255) {
pwmValue = 255;
stepValue = -1;
}
else if (pwmValue <= 0) {
pwmValue = 0;
stepValue = 1;
// Pausa di 5 secondi a motore fermo
delay(5000);
}
}
}
Come funziona lo sketch
1. Il pin 9 pilota il MOSFET
MOSFET_PIN identifica l’uscita PWM collegata al Gate. All’avvio il programma imposta immediatamente PWM 0 per mantenere fermo il motore.
2. Il PWM aumenta gradualmente
Ogni 20 ms il valore pwmValue viene incrementato. La velocità comandata cresce progressivamente fino al valore massimo 255.
3. La rampa viene invertita
Raggiunto il massimo, stepValue diventa negativo e il PWM inizia a diminuire. Quando torna a zero, il programma mantiene il motore fermo per cinque secondi e ricomincia il ciclo.
Perché il motore potrebbe non partire con PWM molto basso?
Un motore reale deve vincere attrito, inerzia e carico meccanico. Per questo può rimanere fermo con valori PWM molto bassi e iniziare a ruotare soltanto superata una determinata soglia. Questo comportamento è normale e la soglia varia da motore a motore.
Scarica lo sketch
⬇️ Scarica Arduino_e_mosfet.ino
Come scegliere il MOSFET giusto
Non basta controllare la corrente massima stampata nella tabella del datasheet. Per un pilotaggio diretto con Arduino è importante verificare che il MOSFET raggiunga una bassa RDS(on) alla tensione Gate-Source realmente disponibile, tipicamente circa 5 V su Arduino Uno.
- scegli un MOSFET logic-level;
- verifica la tensione massima Drain-Source;
- considera la corrente di stallo del motore;
- controlla la RDS(on) alla tensione di Gate utilizzata;
- valuta la dissipazione termica;
- verifica il pinout: Gate, Drain e Source non hanno necessariamente la stessa disposizione su componenti diversi.
Errori da evitare
- collegare il motore direttamente al pin di Arduino;
- dimenticare il diodo di flyback;
- scegliere il MOSFET guardando soltanto la tensione di soglia VGS(th);
- non collegare insieme le masse quando si usa un’alimentazione esterna;
- sottovalutare la corrente di avviamento del motore;
- pilotare un IRF520 come se fosse un moderno MOSFET logic-level;
- far lavorare il MOSFET molto caldo senza verificare dissipazione e RDS(on).
Debug rapido
- verifica che il pin 9 produca il PWM;
- controlla attentamente il pinout del MOSFET;
- misura la tensione dell’alimentazione del motore;
- verifica che Arduino e alimentatore abbiano GND comune;
- controlla orientamento e collegamento del diodo;
- se il MOSFET scalda molto, interrompi la prova e verifica modello, corrente e pilotaggio del Gate;
- se il motore non parte ai bassi PWM, aumenta temporaneamente il duty cycle di avvio.
Varianti del progetto
- regolare la velocità con un potenziometro;
- comandare il PWM con un sensore;
- aggiungere pulsanti Start e Stop;
- realizzare un soft-start del motore;
- controllare ventole, pompe o solenoidi compatibili;
- misurare la corrente assorbita dal motore;
- utilizzare un driver a ponte H quando serve anche invertire il senso di rotazione.
Cosa devi ricordare
- Il pin Arduino deve comandare il MOSFET, non alimentare il motore.
- Il Gate controlla la conduzione tra Drain e Source.
- Il PWM permette di regolare la potenza media fornita al motore.
- Il diodo di flyback è fondamentale con un carico induttivo.
- Per Arduino è preferibile un MOSFET logic-level.
- Con alimentazione esterna, Arduino e stadio di potenza devono avere una massa comune.
Domande frequenti
Posso usare ancora un IRF520?
Può funzionare in alcune condizioni e con carichi modesti, ma non è un MOSFET logic-level e con circa 5 V sul Gate può non raggiungere la conduzione ottimale. Per un nuovo circuito è preferibile un modello logic-level adatto al carico.
Perché serve il diodo sul motore?
Il motore è un carico induttivo e quando la corrente viene interrotta può generare un picco di tensione. Il diodo fornisce un percorso alla corrente induttiva e protegge lo stadio di commutazione.
Posso alimentare il motore dal pin 5 V di Arduino?
Dipende dal motore, ma per motori che richiedono correnti significative è preferibile utilizzare un’alimentazione separata adeguatamente dimensionata, mantenendo la massa comune con Arduino.
Con un solo MOSFET posso invertire il senso di rotazione?
No, questo circuito controlla accensione e velocità in una sola direzione. Per invertire elettricamente la polarità del motore è normalmente necessario un ponte H o un driver motore equivalente.

