Wall Following di un robot Omniwhell!

Salve a tutti.
Vorrei sapere se qualcuno mi potrebbe dare una mano sul codice in questione: dovrei implementare un codice di Wall following di un robot omniwheel, attraverso 4 ultrasonar (hy srf05) e avendo scritto il codice, non capisco dove sbaglio, si tratta di una board Arduino Duemilanove modificata, progettata appositamente per il robot, dotata di un microcontrollore ATmega328 inoltre ho un serio problema a utilizzare le librerie degli interrupt, dato che sia i sensori che i motori condividono lo stesso pin. Se qualcuno mi potesse dare una mano, mi farebbe un gran favore

questo e' il codice:

#define _NAMIKI_MOTOR 
#include <MotorWheel.h>
#include <Omni3WD.h>
#include <Omni4WD.h>
#include <PID_Beta6.h>
#include <PinChangeInt.h>
#include <PinChangeIntConfig.h>
#include <NewPing.h>
/*   Convenzione per ruote, velocità (notare i versi che indicheranno la direzione di advance per le ruote)
             __                
             /|               \
   wheel1   /                  \   wheel4
   v0      /                   _\|   v3
    
    
                              power switch
          __
          |\                    /
   wheel2   \                  /   wheel3
      v1     \               |/_   v2

 */
irqISR(irq1,isr1);           // Interrupt function on the basis of the pulse, work for wheel1
MotorWheel wheel1(3,2,4,5,&irq1);       //This will create a MotorWheel object called Wheel1
                                        //Motor PWM:Pin5, DIR:Pin4, Encoder A:Pin12, B:Pin13
irqISR(irq2,isr2);
MotorWheel wheel2(11,12,14,15,&irq2);
irqISR(irq3,isr3);
MotorWheel wheel3(9,8,16,17,&irq3);
irqISR(irq4,isr4);
MotorWheel wheel4(10,7,18,19,&irq4);
Omni4WD Omni(&wheel1,&wheel2,&wheel3,&wheel4);

#define SONAR_NUM     4 // numeri di sonar usati
#define MAX_DISTANCE 800 // la distanza massima  tra l'oggetto e il sensore
#define PING_INTERVAL 33 //  il tempo tra i ping dei sensori espresso in millesecondi

//definisco i pin dei sensori

#define trigPin1 12
#define echoPin1 11

#define trigPin2 8
#define echoPin2 9

#define trigPin3 0 
#define echoPin3 1

#define trigPin4 10 
#define echoPin4 9



NewPing sonar[SONAR_NUM] = {                                // Define a Newping array to measure the distance

  NewPing(trigPin1, echoPin1, MAX_DISTANCE),

  NewPing(trigPin2, echoPin2, MAX_DISTANCE),

  
  NewPing(trigPin3, echoPin3, MAX_DISTANCE),

  
  NewPing(trigPin4, echoPin4, MAX_DISTANCE)

};



void setup() {
  
 Serial.begin(9600);
    delay(4000);
  TCCR1B=TCCR1B&0xf8|0x01; // Pin9,Pin10 PWM 31250Hz
  TCCR2B=TCCR2B&0xf8|0x01; // Pin3,Pin11 PWM 31250Hz
  Omni.PIDEnable(0.31,0.01,0,10); // Enable PID
  
  pinMode(trigPin1, OUTPUT);

  pinMode(echoPin1, INPUT);

  digitalWrite(trigPin1, LOW);
  

  pinMode(trigPin2, OUTPUT);

  pinMode(echoPin2, INPUT);

  digitalWrite(trigPin2, LOW);
  

  pinMode(trigPin3, OUTPUT);

  pinMode(echoPin3, INPUT);

  digitalWrite(trigPin3, LOW);


  pinMode(trigPin4, OUTPUT);

  pinMode(echoPin4, INPUT);

  digitalWrite(trigPin4, LOW);

  
}


int vicinoalmuro = 1800;           //Initialze and define the values for distance between wall and robot

int lontanodalmuro = 2500;

int vicinomurodavanti = 1000;

int rangeSinistra = 0;

int rangeDavanti  = 0;

int rangeDestra = 0;

int rangeIndietro  = 0;



void loop() {

{

Main:

  rangeDavanti = readRangeDavanti();  

  Serial.print(rangeDavanti);          

  Serial.print(" Davanti ");

  Serial.println();

  rangeSinistra = readRangeSinistra();

  Serial.print(rangeSinistra);

  Serial.print(" Sinistra ");

  Serial.println(); 

rangeDestra = readRangeDestra();

  Serial.print(rangeDestra);

  Serial.print(" Destra ");

  Serial.println(); 
 

  rangeIndietro = readRangeIndietro();

  Serial.print(rangeIndietro);

  Serial.print(" Indietro ");

  Serial.println(); 
  
}







if (rangeDavanti < vicinomurodavanti && rangeSinistra < vicinoalmuro )  //Condizione per vedere se il robot e vicino al muro sia da davanti che a sinistra, quindi trovo uno spigolo

 {

   
    delay(500);

    indietro();

    delay(500);

    Serial.print(" Indietro ");

    destra();

    Serial.print(" Destra ");

    Serial.println();

    delay(800);

    avanti();

    delay(1700);

    goto Main;   
  } 



if (rangeDavanti < vicinomurodavanti && rangeDestra < vicinoalmuro )  //Condizione per vedere se il robot e vicino al muro sia da davanti che a destra, quindi trovo uno spigolo

 {

   
    delay(500);

    indietro();

    delay(500);

    Serial.print(" Indietro ");

    sinistra();

    Serial.print(" Sinistra ");

    Serial.println();

    delay(800);

    avanti();

    delay(1700);

    goto Main;   
  } 



if ( rangeDavanti < vicinomurodavanti && rangeDestra > vicinoalmuro || rangeDavanti < vicinomurodavanti && rangeSinistra > vicinoalmuro   )

{  //condizione in cui sono davanti al muro

   
    delay(500);

    indietro();

    delay(500);

    Serial.print(" Indietro ");

    sinistra();

    Serial.print(" Sinistra ");

    Serial.println();

    delay(800);

    avanti();

    delay(1700);

    goto Main;   
  } 






if (rangeIndietro < vicinomurodavanti)  //Condition to check whether front sensor is close to robot

 {

    delay(500);

    avanti();

    delay(500);

    Serial.print(" avanti ");

  } 





if(rangeSinistra > vicinoalmuro  && rangeSinistra < lontanodalmuro){ //condizione per controllare se la distranza vicino al muro e mantenuta correttamente
     
     avanti();

    Serial.print(" avanti");
    goto Main;
  }



if(rangeDestra > vicinoalmuro  && rangeDestra < lontanodalmuro) //condizione per controllare se la distranza vicino al muro e mantenuta correttamente
  {
     
     avanti();

    Serial.print(" avanti ");
    goto Main;
  }


if (rangeSinistra < vicinoalmuro )                       //sono vicino al muro di sinistra

  {

    delay(100);

     destra();

    delay(500);

    Serial.print(" destra");

    avanti();

    Serial.print(" avanti ");

    Serial.println();

    goto Main;

  }


if (rangeDestra < vicinoalmuro )                       //condition to check side wall is close to robot

  {

    delay(100);

    sinistra();

    delay(500);

    Serial.print(" Sinistra ");

    avanti();

    Serial.print(" avanti ");

    Serial.println();

    goto Main;

  }


 if (rangeSinistra > lontanodalmuro && rangeDestra < lontanodalmuro )                         //ccondizione per il quale il robot e lontano dal muro 

  {

    delay(100);


    sinistra();

    Serial.print(" sinistra ");

    delay(500);

    avanti();

    Serial.print(" avanti");

    Serial.println();

    goto Main;

  }  


if (rangeDestra > lontanodalmuro && rangeSinistra < lontanodalmuro)                         //condition to check robot is far from side wall

  {

    delay(100);

    destra();

    Serial.print(" destra");

    delay(500);

    avanti();

    Serial.print(" avanti");

    Serial.println();

    goto Main;

  } 


  }



void avanti()                               // function to drive the robot forward

{   

    Omni.setCarAdvance(200);
    Omni.delayMS(17);
}


void indietro()                             // function to drive the robot backward

{   

    Omni.setCarBackoff(200);
    Omni.delayMS(17);

}




void sinistra()                                  // function to turn the robot left

{  

    Omni.setCarLeft(200);
    Omni.delayMS(17);

}



void destra()                                     //function to turn the robot right

{

   Omni.setCarRight(200);
   Omni.delayMS(17);

}














int readRangeDavanti()                                 //function to read the front sensor value

{

  delay(50);

  unsigned rangeDavanti = sonar[0].ping();

  sonar[0].timer_stop();

  return rangeDavanti;

}


int readRangeSinistra()                                 // function to read the left sensor value

{

  delay(50);

  unsigned rangeSinistra = sonar[1].ping();

  sonar[1].timer_stop();

  return rangeSinistra;

}


int readRangeDestra()                                 //function to read the front sensor value

{

  delay(50);

  unsigned rangeDestra = sonar[2].ping();

  sonar[2].timer_stop();

  return rangeDestra ;

}


int readRangeIndietro()                                 //function to read the front sensor value

{

  delay(50);

  unsigned rangeIndietro = sonar[3].ping();

  sonar[3].timer_stop();

  return rangeIndietro;

}

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Mi scusi ed ha perfettamente ragione, con la foga del momento, mi sono dimenticato di presentarmi :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.