PROGETTI ARDUINO

  • HOME
  • 200 Progetti
  • Progetti e Tutorial
  • Reti
    • Impara le reti
    • internet fibra
    • wifi mesh
    • modem router
    • diagnostica reti
    • ethernet lan
    • sicurezza configurazione
  • Elettronica
  • Recensioni
  • Manuale
  • Contatti
  • HOME
  • 200 Progetti
  • Progetti e Tutorial
  • Reti
    • Impara le reti
    • internet fibra
    • wifi mesh
    • modem router
    • diagnostica reti
    • ethernet lan
    • sicurezza configurazione
  • Elettronica
  • Recensioni
  • Manuale
  • Contatti

Progetto 147
Robot controllato
​da joystick

🚀 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:
  • 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:
  • 🤖 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
​
  • 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
​

📚 Librerie necessarie
​

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:
  • VCC → 5V;
  • GND → GND;
  • VRx → A0;
  • VRy → A1;
  • SW → pin digitale 2.
Il pulsante integrato utilizza INPUT_PULLUP.
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.
Rimuovi il ponticello ENA, perché Arduino deve inviare il segnale PWM.

Driver L298N – Motore destro
  • ENB → pin PWM 6;
  • IN3 → pin digitale 9;
  • IN4 → pin digitale 10;
  • OUT3 e OUT4 → motore destro.
Rimuovi anche il ponticello ENB.

Alimentazione del driver
  • morsetto positivo → batteria o alimentatore motori;
  • GND → negativo della batteria;
  • GND L298N → GND Arduino.
👉 Arduino e driver devono condividere la stessa massa.

⚠️ 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:
  • 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.
Foto

💻 Codice Arduino
​

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:
  • -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:
  • 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:
  • 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.

↪️ Sterzata verso destra
​

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:
  • 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.

🛑 Pulsante di arresto
​

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.

🎚️ 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:
  • 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:
  1. solleva le ruote;
  2. verifica il movimento dei motori;
  3. controlla avanti e indietro;
  4. verifica le sterzate;
  5. 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:
  • 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?
  • 📡 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.

Foto
Foto

© ProgettiArduino.com 2026 - Fancello Salvatore
​ Layout, immagini e testi sono di esclusiva proprietà di www.progettiarduino.com 
Privacy Policy