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 ![]()
/* 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...