Problema evitare gli ostacoli

Buongiorno a tutti…
Tempo fa avevo fatto un topic dove chiedevo un paio di consigli per il mio robot… A distanza di quasi sette mesi il mio progetto è finito ed ho un piccolo problema riguardante il programma…
Sostanzialmente il mio progetto (oramai diventato più un “supporto didattico” per l’esame di stato) consiste in una macchina telecomandata tramite un telecomando a infrarossi in grado di evitare gli ostacoli… Il progetto in sè non è complesso ma come ho già detto serve solo per supportare la maggior parte degli argomenti trattati nella mia tesina…
Il mio problema è il programma… Per far muovere il robot sto usando Arduino Uno con la la Motor Shield FE, e qui tutto va bene… Per ricevere e decodificare i segnali del telecomando uso la libreiria IRremote.h di Ken Shirriff e anche qui tutto ok… Sulla macchina ho installato due sensori ad ultarsuoni molto simili ai famosi hc-04 (questi per la precisione http://www.ebay.it/itm/N-2-HC-SR04-Sensore-di-distanza-ad-ultrasuoni-compatibile-Arduino-c8-/151005497278?pt=Componenti_elettronici_attivi&hash=item2328a107be)… Inizialmente avevo usato la libreria NewPing.h (http://forum.arduino.cc/index.php?topic=106043.0) il problema è che va in conflitto con la libreria IRremote.h… Così ho trovato un programma che mi faceva passo dopo passo la media delle letture senza ricorrere ad una libreria e il programma funziona…
Nel momento di mettere insieme il tutto mi sono accordo che il i sensori si rilevano la distanza ma non mi fermano la macchina come, penso, di aver impostato… Il programma che ho scritto è solo una prova, se rileva un ostacolo la macchina si ferma e basta, più avanti lo modificherò…
Vi allego lo sketch di seguito, sperando che qualcuno mi possa illuminare :slight_smile:

//programma 
#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int pinDirA=2;
int pinDirB=8;
int pinPwmA=3;
int pinPwmB=10;
const int numOfReadings = 10;                   // numero di letture
int readings[numOfReadings];                    
int arrayIndex = 0;                             // contatore per ciclare nell'array
int total = 0;                                  
int averageDistance = 0;                        // distanza media

#define sensibilita 30

// inizializzo i PIN per collegare la scheda SFR05
int echoPin = 4;                                // echo (digital 4)
int initPin = 6;                                // trigger  (digital 6)
unsigned long pulseTime = 0;                    
unsigned long distance = 0;                     // distanza in cm

//setup
void setup() {
  pinMode(initPin, OUTPUT);                    
  pinMode(echoPin, INPUT);    
  pinMode( pinDirA,OUTPUT );
  pinMode( pinPwmA,OUTPUT );
  pinMode( pinDirB,OUTPUT );
  pinMode( pinPwmB,OUTPUT );
 
// inizializza un array delle letture
  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {
    readings[thisReading] = 0;
  }
     Serial.begin(9600);  //inizializza la seriale
     irrecv.enableIRIn(); // Avvia il ricevitore
}

// loop 
void loop() {
  //manda un impulso di ampiezza 10 us
  digitalWrite(initPin, HIGH);                    
  delayMicroseconds(10);                          
  digitalWrite(initPin, LOW);                    
  pulseTime = pulseIn(echoPin, HIGH);             // Aspetta l'eco di risposta
  distance = pulseTime/58;                        // Distance = tempo impulso / 58 per calcolare i [cm] di distanza.
 
 //Per diminuire l'errore crea un array con le letture e calcola la media
  total= total - readings[arrayIndex];            
  readings[arrayIndex] = distance;              
  total= total + readings[arrayIndex];            
  arrayIndex = arrayIndex + 1;                    
 
  if (arrayIndex >= numOfReadings)  {
      arrayIndex = 0;
  }
  averageDistance = total / numOfReadings;      //Media dei valori delle distanze acquisite
 
  //Scrive il valore della distanza media sulla seriale
  Serial.print ("Distanza (media): ");
  Serial.println(averageDistance, DEC);        
  delay(100);     

  if (irrecv.decode(&results)) 
   {
   Serial.println(results.value); // Stampa il codice del tasto
   irrecv.resume();
   }
 
 if ( results.value == 0xE246AFCA)
 {
   digitalWrite( pinDirA,HIGH );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,255 );
   analogWrite( pinPwmB,255 );
   if ( sensibilita < averageDistance )
 {
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
 }
   results.value=0;
 }
 
 if ( results.value == 0x3AFB26D4)
 { 
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,LOW );
   analogWrite( pinPwmA,255 );
   analogWrite( pinPwmB,255 );
   if ( sensibilita < averageDistance )
 {
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
 }
   results.value=0;
 }
 
 if ( results.value == 0xBB0EDD22)
 {
   digitalWrite( pinDirA,HIGH );
   digitalWrite( pinDirB,LOW );
   analogWrite( pinPwmA,255 );
   analogWrite( pinPwmB,255 );
   if ( sensibilita < averageDistance )
 {
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
 }
   results.value=0;
 }
 
 if ( results.value == 0x4D43596A)
 {
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,255 );
   analogWrite( pinPwmB,255 );
   if ( sensibilita < averageDistance )
 {
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
 }
 results.value=0;
 }
 
 if ( results.value == 0x1D15F4D7)
 {
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
   results.value=0;
 }
}
if ( sensibilita < averageDistance )

Questo IF è vero quando la distanza è maggiore della sensibilità.
Volevi che facesse questo o il contrario?

PaoloP:

if ( sensibilita < averageDistance )

Questo IF è vero quando la distanza è maggiore della sensibilità.
Volevi che facesse questo o il contrario?

Alè primo errore stupido :smiley:
Si esatto è come dici te… Oltre a quello ci potrebbero essere altri errori?

Errori di concetto non credo anche se ho controllato velocemente.
Però potresti sostituire quasi tutti gli INT con BYTE o CONST BYTE, a seconda dei casi, recuperando spazio nella flash e nella ram.