giorno a tutti ho realizzato un progetto una macinino che rileva l ostacolo e lo evita ma ho un problema con il programma perché il sensore mi rileva sempre 0 o ogni tanto qualche valore strano e così facendo mi va in stallo la macchinina potreste dirmi quali sono gli errori e come risolverli?
grazie in anticipo
posto sotto il programma a causa delle dimensioni
#include <Servo.h>
// creazione degli oggetti servo
Servo MotoreSinistro;
Servo MotoreDestro;
const int periodoStampaSuSeriale = 250; // stampa sulla Serial Monitor ogni 1/4 di secondo
unsigned long ritardoSuSeriale = 0;
const int periodoLoop = 20; // un periodo di 20 ms = una frequenza di 50Hz
unsigned long ritardoLoop = 0;
// specifica i pin di trig e echo usati per il sensore ad ultrasuoni
const int TrigPin = 8;
const int EchoPin = 9;
int distanza; // distanza rilevata dal sensore
int durata; // durata dell'eco rilevata dal sensore ad ultrasuoni
int minimaDistanza = 10; // distanza di soglia a cui il robot deve cambiare direzione
unsigned long tempoRotazioneSx = 1100; // 1,1 secondi (circa) per effettuare una rotazione di 90°
// variare questo valore in funzione nel caso la rotazione non sia perfettamente di 90°
// definizione degli stati
#define VAI_AVANTI 0
#define GIRA_SX 1
int stato = VAI_AVANTI; // 0 = vai avanti (DEFAULT), 1 = gira a sinistra
void setup()
{
Serial.begin(9600); // configurazione dei pin Arduino a cui colleghiamo il sensore
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
MotoreSinistro.attach(11);
MotoreDestro.attach(10);
}
void loop()
{
printOutput(); // stampa un messaggio di debug sulla Serial Monitor
if(millis() - ritardoLoop >= periodoLoop)
{
letturaSensoreUltrasuoni(); // legge e memorizza la distanza misurata
azioneRobot();
ritardoLoop = millis();
}
}
void azioneRobot()
{
if(stato == VAI_AVANTI) // non viene rilevato nessun ostacolo
{
if(distanza > minimaDistanza || distanza < 0)
// non è presente nessun ostacolo di fronte al sensore
// nota: la distanza rileata può assumere valori negativi se non è presente nessun ostacolo di fronte
{ MotoreDestro.write(180);
MotoreSinistro.write(180);
// vai avanti
}
else // se ci sono oggetti di fronte gira a sinistra
{
stato = GIRA_SX;
}
}
else if(stato == GIRA_SX) // viene rilavato un ostacolo, il robot gira a sinistra
{
unsigned long tempoRotazioneSx = 1100; // ci voglion circa 1,1 secondi per ruotare di 90°
unsigned long tempoInizioRotazione = millis(); // memorizziamo l'istante in cui incomincia la rotazione
while((millis()-tempoInizioRotazione) < tempoRotazioneSx) // il robot ruota a sinistra fino a quando non sono passati 1,1 secondi
{
// gira a sinistra
MotoreSinistro.write(180);
MotoreDestro.write(0);
}
stato = VAI_AVANTI;
}
}
void letturaSensoreUltrasuoni()
{
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10); // mantiene alto il trigger per almeno 10us
digitalWrite(TrigPin, LOW);
durata = pulseIn(EchoPin, HIGH);
distanza = (durata/2)/29;
}
void printOutput()
{
if((millis() - ritardoSuSeriale) > periodoStampaSuSeriale)
{
Serial.print("distanza: ");
Serial.print(distanza);
Serial.print("cm: ");
Serial.println();
ritardoSuSeriale = millis();
}
}