Buonasera, ho costruito un robot 2wd in grado di evitare ostacoli tramite HCSR04. Vorrei sapere come si potrebbe far scegliere in che direzione girare, se a destra o a sinistra. Allego codice.
Grazie a tutti.
#include <AFMotor.h> // includo libreria adafruit per shield L293D
AF_DCMotor motor(1); // Definisco motori, trigger ed echo del sensore HCSR-04, led rosso e verde, delay tempo rotazione robot
AF_DCMotor motor1(2);
AF_DCMotor motor2(4);
const int triggerPort = 14;
const int echoPort = 15;
int rotazione90 =500;
long duration;
float distance;
int ledgreen = 16;
int ledred = 17;
void setup() // Setup programma
{
motor.setSpeed(110); // Vengono settate le velocità dei motori ( valori impostabili da 0 a 255 )
motor1.setSpeed(110);
motor2.setSpeed(100);
pinMode(14,OUTPUT); // Inizializzo ingressi e uscite
pinMode(15,INPUT);
pinMode(16, OUTPUT);
pinMode(17, OUTPUT);
Serial.begin(9600); // Imposto comunicazione seriale a 9600 baud
}
void avanti (void) // Creo menù avanti
{
motor.run(FORWARD); // per andare avanti, setto entrambi i motori in run Forward
motor1.run(FORWARD);
}
void dx90 (void) // Creo menù destra
{
motor.run(FORWARD); // In questo modo i motori girano in senso inverso in modo da compiere rotazione
motor1.run(BACKWARD);
delay(rotazione90); // per il tempo impostato come rotazione90= 500
}
void sx90 (void) // menù sinistra, vedi destra
{
motor.run(BACKWARD);
motor1.run(FORWARD);
delay(rotazione90);
}
void sensore (void) // gestione sensore
{
digitalWrite(triggerPort, LOW);
digitalWrite(triggerPort, HIGH);
delayMicroseconds(20);
digitalWrite(triggerPort, LOW);
duration = pulseIn ( echoPort, HIGH);
distance = duration/58;
Serial.print("distanza: ");
if (duration > 38000)
{
Serial.print(" Fuori portata ");
}
else{
Serial.print( distance );
Serial.println("cm");
}}
void loop (){
sensore();
if( distance > 30 ){
avanti();
digitalWrite(16,HIGH);
digitalWrite(17,HIGH);
}
else{
motor.run(RELEASE);
motor1.run(RELEASE);
motor2.run(RELEASE);
sensore();
if ( distance < 20){
dx90();
digitalWrite(16, LOW);
digitalWrite(17,HIGH);
}
else {
sx90();
}
}
}