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 !!!
Prima di inserire un commento, per favore, leggi il regolamento
11 pings
Skip to comment form
[…] ha già condiviso con noi appassionati il suo progetto Robot 4WD ed oggi ha voluto condividere l’evoluzione chiamandola Rover 4WD […]