Differenze tra le versioni di "Ardubottino"

Da raspibo.
Jump to navigation Jump to search
Riga 31: Riga 31:
 
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.
 
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.
 
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 duration;
 
  long dursx;
 
  long dursx;
 
  long durdx;
 
  long durdx;
  const int sterzo =400;
+
  const int sterzo = 400;
 
  const int m1fd = 4;
 
  const int m1fd = 4;
 
  const int m1bk = 7;
 
  const int m1bk = 7;
Riga 41: Riga 40:
 
  const int m2bk = 5;
 
  const int m2bk = 5;
 
  const int pinping = 13;
 
  const int pinping = 13;
 +
const int distanza = 500;
 
   
 
   
  void setup() {              
+
  void setup() {
   pinMode(m1fd, OUTPUT);    
+
   pinMode(m1fd, OUTPUT);
 
   pinMode(m1bk, OUTPUT);
 
   pinMode(m1bk, OUTPUT);
   pinMode(m2fd, OUTPUT);    
+
   pinMode(m2fd, OUTPUT);
 
   pinMode(m2bk, OUTPUT);
 
   pinMode(m2bk, OUTPUT);
   digitalWrite(m1fd,HIGH);
+
   dritto();
  digitalWrite(m2fd,HIGH);
 
 
  }
 
  }
 
   
 
   
 
  void loop() {
 
  void loop() {
   if (echo() < 500){
+
   if (echo() < distanza){
 +
    ferma();
 
     sinistra();
 
     sinistra();
 
     delay(sterzo);
 
     delay(sterzo);
 
     ferma();
 
     ferma();
 
     dursx = echo();
 
     dursx = echo();
    delay(100);
 
 
     destra();
 
     destra();
 
     delay(sterzo*2);
 
     delay(sterzo*2);
Riga 97: Riga 96:
 
   digitalWrite(m1bk,LOW);
 
   digitalWrite(m1bk,LOW);
 
   digitalWrite(m2bk,LOW);
 
   digitalWrite(m2bk,LOW);
 +
  delay(500);
 
  }
 
  }
 
+
 
  long echo() {
 
  long echo() {
 
   pinMode(pinping, OUTPUT);
 
   pinMode(pinping, OUTPUT);
Riga 110: Riga 110:
 
   return duration;
 
   return duration;
 
  }
 
  }
 
 
[[Category:Progetti]]
 
[[Category:Progetti]]

Versione delle 01:20, 26 nov 2013

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. Ha due ingressi per la corrente: tramite un ponticello può essere separata fra corrente per la logica e corrente per i motori. La logica dev'essere alimentata da +5v; se l'alimentazione è separata, i motori possono ricevere fino a +12v. Per comodità (e anche dopo diversi goffi tentativi per capire come funzionava) ho preferito alimentare i motori solo con i 5v.

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;
const int distanza = 500;

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

void loop() {
 if (echo() < distanza){
   ferma();
   sinistra();
   delay(sterzo);
   ferma();
   dursx = echo();
   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);
 delay(500);
}

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;
}