Robot evita ostacoli

Ciao a tutti !

sono riuscito a completare il mio robot evita ostacoli, per lo meno fino a quando il robot non si è andato a schiantare !!

qui posto il video per farvi capire meglio, comunque se arriva in obliquo su una superficie piatta non si ferma, al 99% il sensore non riceve il segnale di ritorno o sbaglio ??

se avete qualche suggerimento, ad esempio modifiche o aggiungere qualcosa fatemi sapere !

Questo è il video: http://youtu.be/xtC4MWY_Sqg

questo è il codice:

#include <Servo.h>
const byte MOTOR_in1 = 11;      // ingresso in1 - motore DX       
const byte MOTOR_in2 = 10;      // ingresso in2 - motore DX
const byte MOTOR_in3 = 9;       // ingresso in3 - motore SX
const byte MOTOR_in4 = 6;       // ingresso in4 - motore SX
const byte pin_segnale = 8; // pin sensore collegato ad arduino
const byte led1 = 13;
const byte led2 = 12;
const byte decelera = 0;
unsigned long leftDistance;
unsigned long rightDistance;
unsigned long frontDistance;
Servo servo;

void setup() 

{
  
  delay(1000);
  Serial.begin(9600);
  servo.attach(2);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(MOTOR_in1, OUTPUT);       // imposta i pin digitali come output 
  pinMode(MOTOR_in2, OUTPUT);       // imposta i pin digitali come output
  pinMode(MOTOR_in3, OUTPUT);       // imposta i pin digitali come output
  pinMode(MOTOR_in4, OUTPUT);       // imposta i pin digitali come output
  
}

void loop() 

{
  
  servo.write(85);
  delay(500);
  frontDistance = Srf(pin_segnale);
  if (frontDistance>=30)
  {
    Forward();
  }
  
  else
  
  {
    Arrest();
    if (frontDistance<=30)
  {
    compareDistance();
  }
  
}



   

}


void compareDistance() 

{
  servo.write(0); 
  delay(500);
  rightDistance = Srf(pin_segnale); 
  delay(500);
  servo.write(175);
  delay(700);
  leftDistance = Srf(pin_segnale); 
  delay(500);
  servo.write(85); 
  delay(100);
  
  if (rightDistance<=25 && leftDistance<=25)
  {
    Backward();
    delay(1050);
    Arrest();
}
  
 else 
 {
   FreeRoad();
   
 }
}

void FreeRoad() 

{
  
  if (leftDistance>rightDistance) 
  {
    Turnleft();
  }
  
  else 
  {
    Turnright(); //turn 180 degrees
   
  }
  
}


 void Forward() {
  
  digitalWrite(MOTOR_in1, LOW);   // in1
  digitalWrite(MOTOR_in2, HIGH);  // in2
  digitalWrite(MOTOR_in3, LOW);   // in1
  digitalWrite(MOTOR_in4, HIGH);
  //analogWrite(enablePinA, 255);
  //analogWrite(enablePinB, 255);
}
  
 void Backward() {
  
  digitalWrite(MOTOR_in1, HIGH);   // in1
  digitalWrite(MOTOR_in2, LOW);  // in2
  digitalWrite(MOTOR_in3, LOW);   // in1
  digitalWrite(MOTOR_in4, HIGH);
   
 }
 
 void Arrest() { 
 
  digitalWrite(MOTOR_in1, LOW);   // in1
  digitalWrite(MOTOR_in2, LOW);  // in2
  digitalWrite(MOTOR_in3, LOW);   // in1
  digitalWrite(MOTOR_in4, LOW);
  
   }
 
 
 void Turnleft() {
  
  digitalWrite(MOTOR_in3, LOW);   
  digitalWrite(MOTOR_in4, HIGH);
  delay(1200);
  digitalWrite(MOTOR_in3, LOW);   
  digitalWrite(MOTOR_in4, LOW);
  
  //delay(500);
  //analogWrite(enablePinA, 255);
  //analogWrite(enablePinB, 0);
  
 }
 
 void Turnright() {
   
  digitalWrite(MOTOR_in1, LOW);   
  digitalWrite(MOTOR_in2, HIGH);
  delay(1200);
  digitalWrite(MOTOR_in1, LOW);   
  digitalWrite(MOTOR_in2, LOW);
 
  //delay(500);
  //analogWrite(enablePinA, 0);
  //analogWrite(enablePinB, 0);
 
 }
 
 
 unsigned long Srf(byte pin) {
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);      // viene posto a LOW pin, per 2 microsecondi prima di inviare un breve impulso di trigger
  delayMicroseconds(2);  
  digitalWrite(pin, HIGH);     // invia un impulso di trigger 
  delayMicroseconds(10);               // di 10 microsecondi
  digitalWrite(pin, LOW);      // pone il pin al LOW in attesa che l'impulso torni indietro
  pinMode(pin, INPUT);
  unsigned long durata = pulseIn(pin, HIGH); // legge l'eco dell'impulso emesso in microsecondi
  unsigned long distanza = durata/60;                // divide la durata per 58 per ottenere la distanza in cm
  Serial.println(distanza);            // stampa sul Serial Monitor il valore della distanza
  return distanza;
  
  }

è possibile che l’inclinazione non faccia rimbalzare il suono al sensore. Più sei perperndicolare e migliore è la lettura.

Potresti aggiungere dei sensori di prossimita' lungo il perimetro. Gli ultrasuoni hanno difficolta' a vedere oggetti con superfici inclinate e non vedono per niente le stoffe e altre cose cha fanno passare le onde sonore. I sensori ad infrarossi potrebbero risolvere il problema.