🚀 Introduzione
Vuoi guidare un piccolo robot muovendo semplicemente una levetta? 🎮🤖
In questo progetto realizzerai un robot a due ruote controllato tramite joystick analogico, utilizzando Arduino UNO e un modulo driver L298N.
Muovendo il joystick potrai comandare il robot:
La velocità dei due motori varierà in base alla posizione della levetta.
Premendo il pulsante integrato nel joystick potrai inoltre attivare una modalità di arresto.
👉 Il progetto introduce il controllo differenziale, una tecnica utilizzata in moltissimi robot mobili.
Vuoi guidare un piccolo robot muovendo semplicemente una levetta? 🎮🤖
In questo progetto realizzerai un robot a due ruote controllato tramite joystick analogico, utilizzando Arduino UNO e un modulo driver L298N.
Muovendo il joystick potrai comandare il robot:
- in avanti;
- indietro;
- verso sinistra;
- verso destra;
- con curve graduali;
- con rotazione sul posto.
La velocità dei due motori varierà in base alla posizione della levetta.
Premendo il pulsante integrato nel joystick potrai inoltre attivare una modalità di arresto.
👉 Il progetto introduce il controllo differenziale, una tecnica utilizzata in moltissimi robot mobili.
🎯 Cosa realizzerai
Con Arduino creerai un robot che:
Con Arduino creerai un robot che:
- 🤖 utilizza due motori DC;
- 🎮 viene controllato da un joystick;
- ⬆️ si muove in avanti;
- ⬇️ procede all’indietro;
- ↩️ curva verso sinistra;
- ↪️ curva verso destra;
- 🔄 ruota sul posto;
- 🎚️ regola la velocità in modo proporzionale;
- 🛑 si arresta premendo il joystick;
- ✅ utilizza codice compatibile con Arduino UNO.
🧰 Materiale necessario
Per un piccolo robot sono consigliati motori DC con riduttore, perché sviluppano maggiore coppia a velocità ridotta.
- 1x Arduino UNO;
- 1x telaio robot a due ruote;
- 2x motori DC con riduttore;
- 2x ruote;
- 1x ruota libera;
- 1x modulo driver L298N;
- 1x joystick analogico;
- 1x portabatterie compatibile con i motori;
- cavetti jumper;
- distanziali e viti;
- cavo USB.
Per un piccolo robot sono consigliati motori DC con riduttore, perché sviluppano maggiore coppia a velocità ridotta.
🛒 Non hai ancora i componenti?
Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.
👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un'occhiata anche ai miei libri dedicati ad Arduino.
All'interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 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.
https://amzn.to/4rfzjXE
Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.
👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un'occhiata anche ai miei libri dedicati ad Arduino.
All'interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 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.
https://amzn.to/4rfzjXE
📚 Librerie necessarie
Per questo progetto non sono necessarie librerie esterne.
Arduino utilizza direttamente:
Il codice può quindi essere compilato con una normale installazione dell’Arduino IDE.
Per questo progetto non sono necessarie librerie esterne.
Arduino utilizza direttamente:
- analogRead();
- digitalRead();
- digitalWrite();
- analogWrite();
- map();
- millis().
Il codice può quindi essere compilato con una normale installazione dell’Arduino IDE.
🔌 Schema di collegamento
Joystick analogico
Il joystick possiede normalmente cinque pin:
Quando viene premuto, Arduino legge LOW.
Driver L298N – Motore sinistro
Driver L298N – Motore destro
Alimentazione del driver
Joystick analogico
Il joystick possiede normalmente cinque pin:
- VCC → 5V;
- GND → GND;
- VRx → A0;
- VRy → A1;
- SW → pin digitale 2.
Quando viene premuto, Arduino legge LOW.
Driver L298N – Motore sinistro
- ENA → pin PWM 5;
- IN1 → pin digitale 7;
- IN2 → pin digitale 8;
- OUT1 e OUT2 → motore sinistro.
Driver L298N – Motore destro
- ENB → pin PWM 6;
- IN3 → pin digitale 9;
- IN4 → pin digitale 10;
- OUT3 e OUT4 → motore destro.
Alimentazione del driver
- morsetto positivo → batteria o alimentatore motori;
- GND → negativo della batteria;
- GND L298N → GND Arduino.
⚠️ Alimentazione del robot
Non alimentare i motori direttamente dai pin di Arduino.
I motori possono assorbire una corrente molto superiore a quella disponibile dalla scheda.
Utilizza:
Collega sempre insieme:
👉 Evita di alimentare Arduino dal pin 5V del modulo L298N se non sei sicuro della configurazione del regolatore presente sulla scheda.
Non alimentare i motori direttamente dai pin di Arduino.
I motori possono assorbire una corrente molto superiore a quella disponibile dalla scheda.
Utilizza:
- un pacco batterie adeguato;
- un alimentatore compatibile con i motori;
- collegamenti sufficientemente robusti.
Collega sempre insieme:
- GND della batteria;
- GND del driver;
- GND di Arduino.
👉 Evita di alimentare Arduino dal pin 5V del modulo L298N se non sei sicuro della configurazione del regolatore presente sulla scheda.
💻 Codice Arduino
Il programma legge i due assi del joystick:
I valori vengono convertiti in due comandi separati:
Questa tecnica permette di controllare il robot con movimenti fluidi.
Il programma legge i due assi del joystick:
- asse Y → movimento avanti e indietro;
- asse X → sterzata a destra e sinistra.
I valori vengono convertiti in due comandi separati:
- velocità motore sinistro;
- velocità motore destro.
Questa tecnica permette di controllare il robot con movimenti fluidi.
⚙️ Come funziona
Il joystick restituisce valori analogici compresi tra 0 e 1023.
Al centro, i valori sono vicini a 512.
Il programma trasforma questi valori in un intervallo compreso tra:
Un valore positivo indica movimento in avanti.
Un valore negativo indica movimento indietro.
Il valore assoluto determina invece la potenza PWM.
Il joystick restituisce valori analogici compresi tra 0 e 1023.
Al centro, i valori sono vicini a 512.
Il programma trasforma questi valori in un intervallo compreso tra:
- -255;
- 255.
Un valore positivo indica movimento in avanti.
Un valore negativo indica movimento indietro.
Il valore assoluto determina invece la potenza PWM.
🎮 Movimento in avanti
Quando il joystick viene spinto in avanti:
Più il joystick viene spinto, maggiore sarà il PWM applicato.
Quando il joystick viene spinto in avanti:
- il motore sinistro gira in avanti;
- il motore destro gira in avanti;
- entrambi ricevono una velocità simile.
Più il joystick viene spinto, maggiore sarà il PWM applicato.
⬇️ Movimento indietro
Quando il joystick viene tirato indietro:
Anche in questo caso la velocità dipende dalla posizione della levetta.
Quando il joystick viene tirato indietro:
- entrambi i motori cambiano direzione;
- il robot procede in retromarcia.
Anche in questo caso la velocità dipende dalla posizione della levetta.
↩️ Sterzata verso sinistra
Per curvare a sinistra, il programma riduce la velocità del motore sinistro e aumenta quella del motore destro.
Con uno spostamento più deciso del joystick, il motore sinistro può anche invertire la direzione.
Il robot può quindi ruotare quasi sul posto.
Per curvare a sinistra, il programma riduce la velocità del motore sinistro e aumenta quella del motore destro.
Con uno spostamento più deciso del joystick, il motore sinistro può anche invertire la direzione.
Il robot può quindi ruotare quasi sul posto.
↪️ Sterzata verso destra
La curva a destra funziona in modo opposto:
La combinazione tra movimento avanti-indietro e sterzata permette un controllo molto più naturale rispetto a semplici comandi digitali.
La curva a destra funziona in modo opposto:
- il motore destro rallenta;
- il motore sinistro accelera.
La combinazione tra movimento avanti-indietro e sterzata permette un controllo molto più naturale rispetto a semplici comandi digitali.
🧠 Controllo differenziale
La velocità dei motori viene calcolata con queste formule:
motoreSinistro = movimento + sterzata;
motoreDestro = movimento - sterzata;
Per esempio:
Questa tecnica viene chiamata miscelazione differenziale.
La velocità dei motori viene calcolata con queste formule:
motoreSinistro = movimento + sterzata;
motoreDestro = movimento - sterzata;
Per esempio:
- movimento alto e sterzata zero → avanti;
- movimento zero e sterzata alta → rotazione;
- movimento medio e sterzata moderata → curva.
Questa tecnica viene chiamata miscelazione differenziale.
🧊 Zona morta del joystick
Anche quando il joystick è fermo, i valori analogici possono oscillare leggermente.
Senza correzione, il robot potrebbe muoversi da solo.
Il codice applica quindi una zona morta:
const int ZONA_MORTA = 70;
Quando il valore resta vicino al centro, il comando viene considerato uguale a zero.
Anche quando il joystick è fermo, i valori analogici possono oscillare leggermente.
Senza correzione, il robot potrebbe muoversi da solo.
Il codice applica quindi una zona morta:
const int ZONA_MORTA = 70;
Quando il valore resta vicino al centro, il comando viene considerato uguale a zero.
🛑 Pulsante di arresto
Premendo il joystick viene attivata la modalità STOP.
Durante lo STOP:
Premendo nuovamente il pulsante, il controllo viene riattivato.
👉 Questa funzione è utile durante le prove e le regolazioni.
Premendo il joystick viene attivata la modalità STOP.
Durante lo STOP:
- entrambi i PWM vengono portati a zero;
- il robot rimane fermo;
- la posizione del joystick viene ignorata.
Premendo nuovamente il pulsante, il controllo viene riattivato.
👉 Questa funzione è utile durante le prove e le regolazioni.
🔄 Inversione dei motori
A causa del montaggio speculare delle ruote, un motore potrebbe dover girare elettricamente in senso opposto rispetto all’altro.
Il codice contiene due impostazioni:
const bool INVERTI_MOTORE_SINISTRO = false;
const bool INVERTI_MOTORE_DESTRO = true;
Se il robot gira su se stesso quando dovrebbe andare avanti, modifica uno dei due valori.
In alternativa puoi invertire fisicamente i fili del motore interessato.
A causa del montaggio speculare delle ruote, un motore potrebbe dover girare elettricamente in senso opposto rispetto all’altro.
Il codice contiene due impostazioni:
const bool INVERTI_MOTORE_SINISTRO = false;
const bool INVERTI_MOTORE_DESTRO = true;
Se il robot gira su se stesso quando dovrebbe andare avanti, modifica uno dei due valori.
In alternativa puoi invertire fisicamente i fili del motore interessato.
🎚️ Correzione tra i motori
Due motori apparentemente uguali possono avere velocità leggermente differenti.
Il programma permette di ridurre la potenza di uno dei due motori tramite:
const byte CORREZIONE_SINISTRA = 100;
const byte CORREZIONE_DESTRA = 100;
Il valore rappresenta una percentuale.
Per esempio:
Due motori apparentemente uguali possono avere velocità leggermente differenti.
Il programma permette di ridurre la potenza di uno dei due motori tramite:
const byte CORREZIONE_SINISTRA = 100;
const byte CORREZIONE_DESTRA = 100;
Il valore rappresenta una percentuale.
Per esempio:
- motore sinistro troppo veloce → imposta 95;
- motore destro troppo veloce → riduci CORREZIONE_DESTRA.
⚠️ Ruote sollevate durante le prime prove
Prima di appoggiare il robot a terra:
👉 In questo modo eviti che il robot parta improvvisamente nella direzione sbagliata.
Prima di appoggiare il robot a terra:
- solleva le ruote;
- verifica il movimento dei motori;
- controlla avanti e indietro;
- verifica le sterzate;
- prova il pulsante STOP.
👉 In questo modo eviti che il robot parta improvvisamente nella direzione sbagliata.
🧠 Perché è un progetto importante
Con questo progetto impari a:
Con questo progetto impari a:
- controllare due motori DC;
- utilizzare il driver L298N;
- leggere un joystick analogico;
- creare una zona morta;
- convertire valori positivi e negativi;
- realizzare un controllo differenziale;
- regolare la velocità tramite PWM;
- gestire direzione e potenza;
- creare un avvio graduale;
- sviluppare codice compatibile con Arduino UNO.
🔄 Varianti possibili
Vuoi migliorare il progetto?
Vuoi migliorare il progetto?
- 📡 utilizza un secondo Arduino per il controllo wireless;
- 📱 aggiungi un modulo Bluetooth;
- 🚧 collega un sensore a ultrasuoni;
- 🔔 aggiungi un buzzer per la retromarcia;
- 💡 installa LED anteriori e posteriori;
- ⚡ misura la corrente dei motori;
- 🔋 aggiungi un indicatore della batteria;
- 🎚️ crea modalità lenta e veloce;
- 📟 aggiungi un display LCD;
- 🚨 inserisci un pulsante di emergenza;
- 🛞 aggiungi encoder alle ruote;
- 🤖 trasforma il robot in un modello autonomo.