⚡ Arduino • MOSFET • PWM

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.

ControlloPWM
Uscita ArduinoD9
CaricoMotore DC
In poche parole: il pin di Arduino non alimenta direttamente il motore. Fornisce soltanto il segnale di comando al Gate del MOSFET, mentre la corrente richiesta dal motore passa attraverso lo stadio di potenza.

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.

Attenzione: non progettare il circuito considerando 40 mA come una corrente di lavoro normale del pin. Il modo corretto di usare Arduino in questo progetto è fare in modo che il pin piloti soltanto il Gate del MOSFET.

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.

TerminaleFunzione
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 per Arduino

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.

Scelta consigliata: per realizzare oggi il circuito è preferibile scegliere un MOSFET N-channel logic-level dimensionato per la tensione e soprattutto per la corrente di spunto/stallo del motore. Controlla sempre il datasheet del componente scelto.

Materiale necessario

🔌 Arduino Uno
⚡ MOSFET N-channel
⚙️ Motore DC
🔻 Diodo 1N4001
Ω Resistenza Gate
Ω Resistenza pull-down Gate
🔋 Alimentazione adatta al motore
🔗 Cavetti di collegamento
🧩 Breadboard per prove a bassa potenza

🧰 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 consigliato

Link 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 Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema del circuito

Schema Arduino MOSFET IRF520 motore DC

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.

Orientamento: nel classico pilotaggio low-side il diodo viene montato in parallelo al motore, normalmente polarizzato inversamente: catodo verso il positivo dell’alimentazione e anodo verso il lato del motore collegato al Drain.

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.

Corrente di stallo: quando scegli MOSFET, diodo e alimentatore non considerare soltanto la corrente del motore mentre gira liberamente. La corrente più critica è quella di avviamento/stallo, che può essere molto superiore.

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 indicativoComportamento
00%Motore spento
64≈25%Bassa potenza media
128≈50%Potenza media intermedia
192≈75%Potenza media elevata
255100%Comando completamente attivo
Nota: il PWM non crea una vera tensione analogica continua sul pin. L’uscita commuta rapidamente tra LOW e HIGH variando il rapporto tra tempo acceso e tempo spento.

Codice Arduino commentato

Arduino + MOSFET – rampa PWM del motore
/*
  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.