Problema "Avoider" Robot

Ho costruito un piccolo rover che evita gli ostacoli con un sensori Ultrasuoni URM37.
E sono riuscito a programmarlo e funziona.

Solo che volevo aggiungere un servo che controllasse a raggio più ampio come su moltissimi di questi progetti.

Ho semplicemente copiato e incollato lo sketch della libreria servo Sweep ma non funziona a dovere.

Infatti sembra come non rilevare più gli ostacoli, nemmeno se ci metto la mano davanti :fearful:

/* Ultrasound Sensor
 *------------------
 * URM V3.2 ultrasonic sensor TTL connection with Arduino
 * Reads values (0-300) from an ultrasound sensor (3m sensor)
 * and writes the values to the serialport.
 * Pin +5v (Arduino)-> Pin 1 VCC (URM V3.2)
 * GND (Arduino) -> Pin 2 GND (URM V3.2)
 * Pin11 (Arduino) -> Pin 7 (URM V3.2)
 * Pin 0 (Arduino) -> Pin 9 (URM V3.2)
 * Pin 1 (Arduino) -> Pin 8 (URM V3.2)
 * www.yerobot.com
 * Last modified 20/04/2009
 */
 
#include <Servo.h> 
Servo myservo;  // create servo object to control a servo 
int pos = 0;    // variable to store the servo position 




int E1 = 6;   // Pin MotorShield
int M1 = 7;
int E2 = 5;                         
int M2 = 4;                           



int USValue = 0;
int timecount = 0; // Echo counter
int ledPin = 13; // LED connected to digital pin 13
boolean flag=true;
uint8_t DMcmd[4] = { 
  0x22, 0x00, 0x00, 0x22}; //distance measure command

void setup() {
  Serial.begin(9600);                  // Sets the baud rate to 9600
  pinMode(M1, OUTPUT);   
  pinMode(M2, OUTPUT); 
  delay(200); //Give sensor some time to start up --Added By crystal  from Singapo, Thanks Crystal.
    myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
}

void loop()

{
  
    for(pos = 0; pos < 120; pos += 1)  // goes from 0 degrees to 120 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 120; pos>=1; pos-=1)     // goes from 120 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  
  //----------------------------------- Fine Servo
  //----------------------------------- Inizio codice Libreria URM37

  flag=true;
  //Sending distance measure command :  0x22, 0x00, 0x00, 0x22 ;

  for(int i=0;i<4;i++)
  {
    Serial.print(DMcmd[i],BYTE);
  }

  delay(75); //delay for 75 ms

  while(flag)
  {


    int header=Serial.read(); //0x22
    int highbyte=Serial.read();
    int lowbyte=Serial.read();
    int sum=Serial.read();//sum

    if(highbyte==255)
    {
      USValue=65525;  //if highbyte =255 , the reading is invalid.
    }
    else
    {
      USValue = highbyte*255+lowbyte;
    }



    flag=false;
  }




  if(USValue > 30 ){          // Robot va dritto
    digitalWrite(M1,HIGH);   
    digitalWrite(M2, HIGH);       
    analogWrite(E1, 150);   //PWM Speed Control
    analogWrite(E2, 180);   //PWM Speed Control

  }
  else                     // Robot Gira invertendo uno dei due motori ( LOW ) 

  {

    digitalWrite(M1,LOW);   
    digitalWrite(M2, HIGH);       
    analogWrite(E1, 100);   //PWM Speed Control
    analogWrite(E2, 100);   //PWM Speed Control





  }
}

Il codice è molto semplice credo che si possa ottimizzare, mi sono limitato a fare dei taglia cuci e almeno senza servo funziona...

:frowning:

anche io avevo un problema simile al tuo.. ho risolto predisponendo un'alimentazione separata per i servo..

già lo alimento esternamente :zipper_mouth_face:

Sto provando con questo codice preso dal sito di Gioblu ma da DUE errori per colpa delle parentesi graffe credo...

#include "URMSerial.h"
#include <Servo.h> 

Servo uservo;
int ang=0;
int angolomax=0;
int distmax=0;
int value=100;
int ind=0;
int rotazione=0;

int E1 = 6;   // Pin MotorShield
int M1 = 7;
int E2 = 5;                         
int M2 = 4;  

// Definizione delle misure
#define DISTANCE 1
#define TEMPERATURE 2
#define ERROR 3
#define NOTREADY 4

//angolo di riposo dei servi delle ruote
#define RIPOSOS 94
#define RIPOSOD 93

// inizializza l'oggetto della libreria urm del sensore ultrasuoni
URMSerial urm;

void setup()
{
Serial.begin(9600);  // Imposta il baud rate a 9600
urm.begin(6,7,9600); // RX Pin, TX Pin, Baud Rate
uservo.attach(3);    // Attacca il servo degli ultrasuoni al pin 3
uservo.write(90);    // metti il servo degli ultrasuoni dritto
pinMode(M1, OUTPUT);   
pinMode(M2, OUTPUT); 
delay(200);
}

void loop()
{
//  sservo.write(RIPOSOS); // ferma il robot
//  dservo.write(RIPOSOD); // ferma il robot
    digitalWrite(M1,HIGH);   
    digitalWrite(M2, HIGH);       
    analogWrite(E1, 150);   //PWM Speed Control
    analogWrite(E2, 180);   //PWM Speed Control

// Richiedi la distanza al sensore ad ultrasuoni
urm.requestMeasurement(DISTANCE);
delay(50); // attendi allineamento dei servi
if(urm.hasReading())
{
switch(urm.getMeasurement(value)) // Verifica che il valore letto sia una distanza
{
case DISTANCE: // Ulteriore verifica che sia una distanza

if (value>0 & value<20)  // se il valore e'  distmax)
break;                            
} // end switch interno
} // end if(urm.hasReading())
} //end for (ang=0; ang 180)

angolomax=180;
if (angolomax < 0)
angolomax=0;

rotazione=abs(angolomax-90); //serve per far durare di più la rotazione

// scrivi un po' di valori di controllo nel serial monitor 
Serial.print("Angolo inviato ai servi \t");
Serial.println(RIPOSOS+angolomax-90);
Serial.print("Valore di rotazione \t");
Serial.println(rotazione / 5);

// fai andare i servi verso l'angolo di max distanza
for (ind=1; ind < rotazione/5; ind+=1)
{
    digitalWrite(M1,LOW);   
    digitalWrite(M2, HIGH);       
    analogWrite(E1, 100);   //PWM Speed Control
    analogWrite(E2, 100);   //PWM Speed Control
delay (40); // attendi allineamento servi
} // end for (ind=1; ind < rotazione / 9; ind+=1)
} //  end if (value 0)
break;    
} // end switch esterno
} // end if(urm.hasReading()) esterno

} //end loop

=(

sketch_aug13a:87: error: expected unqualified-id before 'break'
sketch_aug13a:88: error: expected declaration before '}' token

cosa devo fare? :drooling_face:

help!...... mi serve per domani :sweat_smile:

Non posso scaricare la libreria e quindi provare a compilarlo... però potevi chiedere aiuto prima caspita.... magari una soluzione la si trovava...

Per il momento ho "risolto" allungando con un delay il codice senza il servo...

Ora gira di più ed è meno probabile che tocchi con le fiancate perchè inverte di 90°

Però se si trova tra due muri ad angolo impazzisce e ruota fino alla fine delle batterie :grin:

qui la libreria:

http://milesburton.com/URM37_Ultrasonic_Distance_Measurement_Library

purtroppo il parser del codice di gioblu si mangia il codice. guarda questo, è sempre lo stesso codice, ma dovrebbe funzionare:
http://robottini.altervista.org/robot-with-obstacle-avoidances