Bruno è un appassionato di robotica ed arduino che ha realizzato un Robot 4WD ed ha inviato foto, schema e sketch perchè io lo potessi condividere con te sul blog.
Il progetto di Bruno è un Robot 4WD realizzato con una struttura simile a quella del Beginner Robot della Dagu a cui sono state aggiunti componenti e shield per permetterti di gestire più programmi e funzioni che il Robot 4WD può fare.
Le immagini del Robot 4WD
Inizia con l’assemblaggio della parte meccanica del Robot 4WD:
i motori sono collegati alla shield motori sul retro del Robot 4WD:
dove trova posto anche il pulsante di selezione programma da eseguire:
sulla parte frontale trovi il sensore SHARP incaricato di rilevare gli ostacoli:
montato su un servo che gli consente di ruotare di 180° per rilevare gli oggetti anche lateralmente:
hai già intravisto la breadboard usata da Bruno per le connessioni tra arduino, il servo, il sensore, i led ed il pulsante:
puoi osservarla meglio nella foto seguente:
nell’insieme, visto dall’alto:
Lo schema dei collegamenti del Robot 4WD
Puoi seguire lo schema realizzato da Bruno per costruire il tuo rover:
Lo sketch
Bruno mi ha inviato lo sketch che puoi utilizzare sul tuo Robot 4WD:
int E_DX=5; // 1 DX int M_DX=4; int E_SX=6; // 2 SX int M_SX=7; #define VELOCITA_DRITTO 130 #define VELOCITA_SVOLTA 255 int esegui=0; int programma=0; int statoLedProgramma=0; #define OUT_LED_PROGRAMMA 12 #define OUT_LED_AVVIO 13 #define IN_IR A5 // ingresso analogico sensore distanza #define SENSIBILITA_EVITA 200 // soglia distanza sotto cui fermarsi unsigned long tempoLampeggio = 0; #define TEMPO_LAMPEGGIO_BREVE 250 // in millisecondi #define TEMPO_LAMPEGGIO_LUNGO 500 // in millisecondi #define OUT_SERVO_IR 9 // PWR servo testa sensore distanza byte angoli[2]={ 10,170}; char direzioni[2]={ 'S','D'}; byte angoloAvanti=85; #include <Servo.h> Servo testaIR; void setup() { pinMode(M_DX,OUTPUT); pinMode(M_SX,OUTPUT); attachInterrupt(0,interruptProgramma,FALLING); attachInterrupt(1,interruptStartStop,FALLING); pinMode(OUT_LED_PROGRAMMA, OUTPUT); pinMode(OUT_LED_AVVIO, OUTPUT); pinMode(OUT_SERVO_IR, OUTPUT); testaIR.attach(OUT_SERVO_IR); testaIR.write(angoloAvanti); aspetta(1000); testaIR.write(angoli[0]); aspetta(1000); testaIR.write(angoli[1]); aspetta(1000); testaIR.write(angoloAvanti); aspetta(1000); Serial.begin(9600); accendiLed(); fermo(); } void loop() { accendiLed(); if(esegui) { switch(programma) { case 0: faiUnGiro(); break; case 1: fermo(); break; case 2: fermo(); break; case 3: fermo(); break; } } else fermo(); } void aspetta(int tempo) { unsigned long tempoVolta=millis(); while(millis()-tempoVolta < tempo) { accendiLed(); } } void faiUnGiro() { if(esegui) { if(analogRead(IN_IR)<=SENSIBILITA_EVITA) avanti(); else { fermo(); aspetta(750); indietro(); aspetta(500); fermo(); aspetta(750); muovi(valutaDirezioneEvita()); } } } void muovi(char direzione) { switch(direzione) { case 'I': sinistra(); aspetta(2000); fermo(); aspetta(500); break; case 'S': sinistra(); aspetta(750); fermo(); aspetta(500); break; case 'D': destra(); aspetta(750); fermo(); aspetta(500); break; } } char valutaDirezioneEvita() { unsigned long adesso=millis(); unsigned long tempoVolta=0; int valori[2]; char direzione = 'A'; for(int i=0;i<=1;i++) { testaIR.write(angoli[i]); tempoVolta=millis(); while(millis()-tempoVolta < 1500) { accendiLed(); } //delay(1000); int distanza=analogRead(IN_IR); valori[i]=distanza; } int distanzaminima=999999; Serial.println("---"); for(int i=0;i<=1;i++) { Serial.println(valori[i]); if(valori[i]<distanzaminima) { distanzaminima=valori[i]; direzione=direzioni[i]; } } if(distanzaminima>SENSIBILITA_EVITA) direzione='I'; Serial.println(direzione); testaIR.write(angoloAvanti); return direzione; } void interruptStartStop() { if(esegui==0) esegui=1; else { esegui=0; fermo(); } } void interruptProgramma() { if(programma<3) programma++; else programma=0; Serial.println(programma); esegui=0; fermo(); } void accendiLed() { unsigned long adesso=millis(); switch(programma) { case 0: statoLedProgramma=0; break; case 1: statoLedProgramma=1; break; case 2: if(adesso-tempoLampeggio > TEMPO_LAMPEGGIO_BREVE) { tempoLampeggio=adesso; if(statoLedProgramma == 0) statoLedProgramma=1; else statoLedProgramma=0; } break; case 3: if(adesso-tempoLampeggio > TEMPO_LAMPEGGIO_LUNGO) { tempoLampeggio=adesso; if(statoLedProgramma == 0) statoLedProgramma=1; else statoLedProgramma=0; } break; } digitalWrite(OUT_LED_PROGRAMMA,statoLedProgramma); if(esegui) digitalWrite(OUT_LED_AVVIO,HIGH); else digitalWrite(OUT_LED_AVVIO,LOW); } void fermo() { analogWrite(E_DX,0); analogWrite(E_SX,0); } void avanti() { digitalWrite(M_DX,HIGH); digitalWrite(M_SX,HIGH); analogWrite(E_DX,VELOCITA_DRITTO); analogWrite(E_SX,VELOCITA_DRITTO); } void indietro() { digitalWrite(M_DX,LOW); digitalWrite(M_SX,LOW); analogWrite(E_DX,VELOCITA_DRITTO); analogWrite(E_SX,VELOCITA_DRITTO); } void destra() { digitalWrite(M_DX,HIGH); digitalWrite(M_SX,LOW); analogWrite(E_DX,VELOCITA_SVOLTA); analogWrite(E_SX,VELOCITA_SVOLTA); } void sinistra() { digitalWrite(M_DX,LOW); digitalWrite(M_SX,HIGH); analogWrite(E_DX,VELOCITA_SVOLTA); analogWrite(E_SX,VELOCITA_SVOLTA); }
Buona sperimentazione robotica !!!
10 commenti
1 ping
Vai al modulo dei commenti
Grazie per la pubblicazione di questo progetto, senza di lui non sarei riuscito a montare il mio robot beginner 4w.
Credo di avere un problema, Guardando le foto ho visto che la scheda motori è configurata per attingere corrente da Arduino, quindi usa 5volt, ma se configuro anche io questa opzione il robot non riesce a camminare, solo se lo alzo vedo le ruote girare!
Sbaglio qualcosa? Ho provato anche a configurare la scheda motori per un alimentazione esterna a 9volt ma sembra non bastare neanche in questo caso, è normale?
Autore
Ciao Andrea,
premetto che io non ho mai usato il 4WD e lascio a Bruno la possibilità di risponderti in merito.
Dalla mia modesta esperienza con i 2WD mi sono accorto che a volte i motori assorbono molta corrente per spostare il peso dei robot su cui li utilizziamo, non è una questione di voltaggio ( V ) ma di maperaggio ( A ).
Mauro
Ciao Andrea, sono contento che il post sia stato d’aiuto.
Non ho ancora provato con l’alimentazione esterna per la scheda motori ma posso dirti che ho dovuto provare vari valori di VELOCITA_DRITTO e VELOCITA_SVOLTA prima di arrivare a quelli pubblicati.
I due valori, così come il tempo di rotazione, sono legati allo stato delle batterie. Appena sostituite ho dovuto ridurre quasi tutti i valori.
Penso che la struttura (peso, dimensioni e potenza) rendano un po’ difficile la rotazione e l’avanzamento del 4WD. Al mio basta un tappeto per farlo rallentare.
Ho fatto anche una prova togliendo le ruote anteriori, quindi con motori collegati ma liberi da resistenza, e sostituendole con una caster ball (una ruota da cassettiera o sedia per intenderci) montata sotto il servo.
Così ruotava fin troppo velocemente e anche la velocità era nettamente superiore però tirava tutto da una parte e quindi è necessario correggere i valori di velocità per i due lati.
La mia versione attuale ha un pacco batterie da 4 AA per alimentare tutto quello che è sulla bread board lasciando così libera tutta l’alimentazione per arduino e motor shield.
Questo sposta ancora un po’ il baricentro…Avendo messo tutto il peso verso l’asse posteriore al momento della rotazione quello anteriore risulta un po’ più scarico e permette di far scivolare le ruote.
PS: Mauro nei prossimi giorni ti mando l’aggiornamento con il programmo e circuito per seguire un oggetto e la luce 🙂
Autore
Ottimo Bruno,
sarà di certo un articolo di grande interesse.
Mauro
Ciao sono Sergio,
Molto interessante il progetto e molto istruttivo per un principiante come me.
Scusate l’ignoranza ma non riesco a capire una cosa, credo fondamentale: come fai a pilotare quattro motori con la shield, c’è scritto che può pilotare due motori dc.
Forse mi sfugge qualcosa! Grazie
Autore
Ciao Sergio,
lascio che sia Bruno, autore del progetto, a darti le risposte che cerchi.
Io per il mio Rover Leo, puoi leggere l’articolo nel blog, ho collegato i motori sia a destra sia a sinistra in parallelo ottenendo due soli canali di controllo.
Grazie Mauro
Ciao e scusami ancora; nello sketch qui rappresentato quale è la parte inerente il sensore sharp perche volevo sostituirlo con un hc-sr04 con il suo sketch. E possibile farlo?? grazie!!!
Autore
Ciao Jacopo,
lascio a Bruno, autore del progetto, la risposta.
Mauro
OK grazie !!
[…] ha già condiviso con noi appassionati il suo progetto Robot 4WD ed oggi ha voluto condividere l’evoluzione chiamandola Rover 4WD […]