|
Ciao a tutti, tempo fa lessi questo articolo e lo trovai molto interessante, quando mi arrivò il kit octagon per fare un robottino che avrei dovuto presentare al Linux Day, decisi di fare qualcosa di simile. Avendo a disposizione poco tempo il codice non è perfetto, ma immagino che la linea di principio sia la stessa del robot di Alessandro.



Includete la libreria Servo.h
#define SONAR_TRIGGER_PIN 2
#define SONAR_ECHO_PIN 3
Servo sensor;
Servo left;
Servo right;
unsigned int current_distance;
int angle = 0;
int dir = 0;
int misura =0;
unsigned int measure_distance()// funzione che misura le distanze
{
// Manda al sensore una pulsazione di 10 microsecondi
digitalWrite(SONAR_TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(SONAR_TRIGGER_PIN, LOW);
// Aspetta l'eco.
unsigned long pulse_length = pulseIn(SONAR_ECHO_PIN, HIGH);
// aspettiamo 50ms per non creare interferenze
delay(50);
// converte in cm e restituisce il valore della distanza
unsigned int distance = pulse_length / 58;
Serial.println(distance);
return distance;
}
void setup()
{
pinMode(SONAR_TRIGGER_PIN, OUTPUT);
pinMode(SONAR_ECHO_PIN, INPUT);
Serial.begin(9600);
sensor.attach(8);
left.attach(9);
right.attach(10);
sensor.write(90);
}
void loop()
{ //se la distanza è maggiore di 30 cm avanza
if(measure_distance()>30) avanza();
//altrimenti
else{
// Il robot si ferma
Stop();
//Aspetta 200 ms
delay(200);
//Inizia la scansione
for(int i = 0; i<12;i++){
// suddivido 180 gradi in 12 parti
sensor.write(15*i);
// se la misura che viene fatta è maggiore di 30
// allora salvo in dir l'angolo del sensore
if(measure_distance()>30) dir =15*i;
}
//Se dir è minore di 90 gradi giro a destra
if(dir < 90)
destra();
//Altrimenti giro a sinistra
else sinistra();
//Riporto il sensore nella posizione iniziale
sensor.write(90);
}
delay(100);
}
// Funzioni di movimento
void avanza(){
left.write(180);
right.write(180);
}
void indietro(){
left.write(0);
right.write(0);
}
void destra(){
left.write(180);
right.write(0);
}
void sinistra(){
left.write(0);
right.write(180);
}
void Stop(){
left.write(90);
right.write(90);
}
Eccovi gli schemi

Trigger e Echo vanno rispettivamente al pin 2 e al pin 3. I servo per far muovere il corpo sono attaccati ai pin 9 e 10 e il servo del sensore è attaccato al pin 8.
Lista del materiale:
1x Arduino
1x SRF05
2x Servo Standard da Modificare
1x Ruota pivottante in plastica