Ardubottino

Da raspibo.
Jump to navigation Jump to search

Ardubottino è stato creato soprattutto per testare tre componenti: l'Arduino, il sensore della distanza a ultrasuoni e il ponte ad H. Lo chassis e i motori sono Tamiya.

Ardubottino.jpg

Componenti

Ardubottino ha questi componenti:

  • Arduino UNO [1]
  • Sensore di distanza a ultrasuoni SRF05 [2]
  • Il board con montato il ponte ad H L298 [3]
  • Kit Tamiya per lo chassis e i motori
  • Batteria da 9v

Il sensore di distanza è sprovvisto di pin, occorre quindi saldarne una strip prima di procedere.

Il sensore di distanza a ultrasuoni SRF05

102 1298.JPG È piuttosto semplice da usare. Seguendo le istruzioni [ http://www.robot-electronics.co.uk/htm/srf05tech.htm trovate qui] si può notare che ha due modalità di comunicazioni, date dal pin Mode. Se questo pin è collegato alla 0v il sensore userà un solo pin per la comunicazione dei dati dell'eco (Echo) e la ricezione dei comandi (Trigger), se, al contrario, non è connesso a niente allora saranno usati due pin diversi. Nel caso dell'Ardubottino ho preferito usare la prima modalità, quella con un pin solo (soprattutto per pigrizia: perché è già così lo sketch di esempio "ping" nella libreria di Arduino!). Oltre al pin Mode e al pin Trigger/Echo occorre collegare il primo e l'ultimo pin rispettivamente a +5v e a terra. Nella foto si può vedere, da sinistra: +5v, non usato, Trigger/Echo (collegato al pin 13 di Arduino), Mode (terra), Terra (terra).

Il board ponte ad H L298

Ardubottino dettagliol298.jpg

Il ponte ad H L298 è utilissimo per manovrare due motori indipendenti. Può essere usato anche per muovere un motore passo-passo. Questo in particolare devo ancora capire bene come funziona. Ha tre ingressi per la corrente per la logica e per i motori, che può essere separata aprendo un ponticello, ma un un'unica uscita per la terra. Ora: se separo le alimentazioni, mettendo, ad esempio, una batteria, dove devo mettere il polo negativo della batteria? Per Ardubottino ho risolto alimentando motori e Arduino con la stessa pila, quindi le terre dovrebbero essere tutte al negativo della batteria. Finora non è esploso quindi presuppongo di non aver sbagliato di molto.

Sui lati ci sono le connessioni per i motori mentre, a fianco dell'alimentazione, ci sono i pin che servono per comandarli. I pin sono sei, due sono gli enable per i motori e quattro servono per dare la direzione, due per motore. I pin dell'enable si possono chiudere con dei ponticelli, comandarli da Arduino/Raspberry Pi oppure gli si può mandare un impulso PWM per regolare la velocità.

Lo sketch

Lo sketch deriva per una parte dall'esempio Ping già presente nella libreria di Arduino. In pratica fa avanzare Ardubottino fino a che non incontra un ostacolo. Se lo incontra sterza in un senso e poi nell'altro e alla fine prosegue per la direzione dove ha trovato più campo libero. 4 7 6 5 sono i pin a cui ho collegato il ponte ad H. Sterzo è il tempo che deve impiegare per sterzare. pinping è il pin a cui è attaccato il trigger/echo del sensore a ultrasuoni.

long duration;
long dursx;
long durdx;
const int sterzo =400;
const int m1fd = 4;
const int m1bk = 7;
const int m2fd = 6;
const int m2bk = 5;
const int pinping = 13;

void setup() {                
 pinMode(m1fd, OUTPUT);     
 pinMode(m1bk, OUTPUT);
 pinMode(m2fd, OUTPUT);     
 pinMode(m2bk, OUTPUT);
 digitalWrite(m1fd,HIGH);
 digitalWrite(m2fd,HIGH);
}

void loop() {
 if (echo() < 500){
   sinistra();
   delay(sterzo);
   ferma();
   dursx = echo();
   delay(100);
   destra();
   delay(sterzo*2);
   ferma();
   durdx = echo();
   if (dursx > durdx) {
     sinistra();
     delay(sterzo*2);
   }
 } else {
   dritto();
 }
}

void dritto() {
 digitalWrite(m1fd,HIGH);
 digitalWrite(m2fd,HIGH);
 digitalWrite(m1bk,LOW);
 digitalWrite(m2bk,LOW);
}

void destra() {
 digitalWrite(m1fd,LOW);
 digitalWrite(m2fd,HIGH);
 digitalWrite(m1bk,HIGH);
 digitalWrite(m2bk,LOW);
}

void sinistra() {
 digitalWrite(m1fd,HIGH);
 digitalWrite(m2fd,LOW);
 digitalWrite(m1bk,LOW);
 digitalWrite(m2bk,HIGH);
}

void ferma() {
 digitalWrite(m1fd,LOW);
 digitalWrite(m2fd,LOW);
 digitalWrite(m1bk,LOW);
 digitalWrite(m2bk,LOW);
}
 
long echo() {
 pinMode(pinping, OUTPUT);
 digitalWrite(pinping, LOW);
 delayMicroseconds(2);
 digitalWrite(pinping, HIGH);
 delayMicroseconds(5);
 digitalWrite(pinping, LOW);
 pinMode(pinping, INPUT);
 duration = pulseIn(pinping,HIGH);
 return duration;
}