Salve a tutti, è la prima volta che scrivo su questo forum. non è da molto tempo che mi diletto con arduino ma ultimamente ho avuto alcuni problemi con la programmazione del mio primo robot.
prima dell'ultima modifica il robot utilizzava solo due motoriduttori controllati con l293 e un sensore ad ultrasuoni hc-sr04. il robottino si muoveva e quando trovava un'ostacolo ad una certa distanza tornava indietro e provava a girare, provava..
Poi ho pensato, con l'utilizzo di un servomotore potrei semplificare di gran lunga le cose, facendo in modo che quando il robot è vicino all'ostacolo, si guarda intorno e trova "una via di fuga". Qui i problemi: non riesco a far leggere correttamente la distanza tramite il sensore ultrasuoni.
Questo è lo sketch ancora in fase di lavorazione:
#define ECHOPIN 6 // Pin to receive echo pulse
#define TRIGPIN 7 // Pin to send trigger pulse
int motor1_pin1 = 2;
int motor1_pin2 = 3;
int motor2_pin1 = 4;
int motor2_pin2 = 5;
int distance = 0;
int distanceleft = 0;
int distancefront = 0;
int distanceright = 0;
int pos = 0;
#include <Servo.h>
Servo myservo;
void setup ()
{
Serial.begin(9600);
myservo.attach(9);
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
pinMode(motor1_pin1,OUTPUT);
pinMode(motor1_pin2,OUTPUT);
pinMode(motor2_pin1,OUTPUT);
pinMode(motor2_pin2,OUTPUT);
}
void ultrasuoni() {
digitalWrite(TRIGPIN, LOW); // Set the trigger pin to low for 2uS
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH); // Send a 10uS high to trigger ranging
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW); // Send pin low again
int distance = pulseIn(ECHOPIN, HIGH); // Read in times pulse
distance= distance/58; // Calculate distance from time of pulse
if (distance <0 or distance >500) distance=0;
return;
}
void loop()
{
myservo.write(15);
digitalWrite(TRIGPIN, LOW); // Set the trigger pin to low for 2uS
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH); // Send a 10uS high to trigger ranging
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW); // Send pin low again
int distance = pulseIn(ECHOPIN, HIGH); // Read in times pulse
distance= distance/58; // Calculate distance from time of pulse
if (distance <0 or distance >500) distance=0;
distanceleft = distance;
Serial.print(distanceleft);
Serial.print(" ");
delay(2000);
myservo.write(90);
digitalWrite(TRIGPIN, LOW); // Set the trigger pin to low for 2uS
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH); // Send a 10uS high to trigger ranging
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW); // Send pin low again
distance = pulseIn(ECHOPIN, HIGH); // Read in times pulse
distance= distance/58; // Calculate distance from time of pulse
if (distance <0 or distance >500) distance=0;
distancefront = distance;
Serial.print(distancefront);
Serial.print(" ");
delay(2000);
myservo.write(165);
digitalWrite(TRIGPIN, LOW); // Set the trigger pin to low for 2uS
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH); // Send a 10uS high to trigger ranging
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW); // Send pin low again
distance = pulseIn(ECHOPIN, HIGH); // Read in times pulse
distance= distance/58; // Calculate distance from time of pulse
if (distance <0 or distance >500) distance=0;
distanceright = distance;
Serial.print(distanceright);
Serial.print(" ");
delay(2000);
}
Vorrei fare in modo di evitare di ripetere la parte di codice che fa funzionare il sensore ultrasuoni, ma ho avuto dei problemi nel farlo..
Attendo vostre notizie.
Simone