Salve a tutti, vado subito al punto:
Ho realizzato un robot il cui principale scopo è quello di muoversi autonomamente in un ambiente domestico, per fare questo ho deciso di acquistare dei sensori ad ultrasuoni HC-SRO4 (per capirci a 4 pin, vcc, gnd, echo, trig).
L'idea (già abbastanza collaudata) è stata quella di montare al centro del robot un sensore sopra di un servomotore che è in grado di compiere i 180 gradi, quindi, nel momento in cui il sensore trova un ostacolo di fronte a sè si "volta" a destra e a sinistra e prende una decisione sul dove dirigersi, un'altro sensore fisso è posto più in basso e serve per rilevare ostacoli più bassi che il sensore "principale" non rileverebbe.
Fin qua tutto bene, il problema è che spesso il robot si ferma e cerca una nuova strada senza che però ci sia nessun ostacolo di fronte a lui, infatti ho verificato dal seriale che i sensori spesso registrano dei "falsi zero", ovvero il valore si abbassa sotto la "soglia di allerta" o addirittura scende a 0 anche se non c'è nessun oggetto realmente vicino.
Non riesco a capire se si tratti di un problema hardware o software, l'elettronica è assemblata cosi: una power bank alimenta a 2.1 amp una Raspberry pi 3 model B (che mi serve, almeno per ora, solo a tenere sotto controllo da remoto il seriale), la Rpi alimenta a sua volta Arduino uno via USB, che si occupa di tutto il lavoro. I motori sono controllati sempre da Arduino tramite un l293n, alimentato esternamente a 12 volt (8 pile stilo per capirci)
Ho già pensato più volte di cambiare approccio: visto che ho comprato 5 di questi sensori potrei pensare di disporli "a pentagono" intorno al robot (che è circolare) ed evitare il discorso servomotore e quant' altro, mi converrebbe? o è meglio rimanere con questo sistema?
In entrambi i casi avrei il problema degli ostacoli fantasma che i sensori mi rilevano, quindi devo risolverlo per qualche verso.
Qui vi posto il codice che sto usando attualmente, mi piacerebbe anche avere un opinione su come è scritto, e ovviamente sapere se il problema sta proprio lì. Per i sensori uso la libreria NewPing che mi è sembrata la più affidabile.
#include <NewPing.h>
#include <Servo.h>
#define TRIGGER_PIN 10
#define ECHO_PIN 11
#define TRIGGER_PIN1 12
#define ECHO_PIN1 13
#define MAX_DISTANCE 200
int dist = 0;
int dist1 = 0;
int DistanzaDestra = 0;
int DistanzaSinistra = 0;
Servo servo;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
NewPing sonar1(TRIGGER_PIN1, ECHO_PIN1, MAX_DISTANCE);
void setup() {
Serial.begin(115200);
/*Pin di controllo dei motori*/
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(7, OUTPUT);
servo.attach(5);
/*Il sensore guarda davanti*/
servo.write(90);
delay(700);
}
void loop() {
Avanti();
dist = (sonar.ping_cm()); //Calcola la distanza di fronte al robot (sensore alto)
dist1 = (sonar1.ping_cm());//Calcola la distanza di fronte al robot (sensore basso)
Serial.print(dist);
Serial.print("||");
Serial.println(dist1);
Serial.flush();
delay(500);
/*If principale*/
if(dist > 10) //Distanza di allerta
{
if (dist1 > 10){
Avanti();
}
else {
/*Giochetti col seriale*/
Serial.println("Rilevato ostacolo sul percorso");
Serial.print("Calcolo");
delay(100);
Serial.print(".");
delay(100);
Serial.print(".");
delay(100);
Serial.print(".");
TrovaStrada();
}
}
if(dist <= 10)
{ /*Giochetti col seriale2*/
Serial.println("Rilevato ostacolo sul percorso");
Serial.print("Calcolo");
delay(100);
Serial.print(".");
delay(100);
Serial.print(".");
delay(100);
Serial.print(".");
TrovaStrada();
}
}
void Avanti(){
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(7, LOW);
return;
}
void TrovaStrada(){
Stop();
Indietro();
GuardaDestra();
GuardaSinistra();
if (DistanzaDestra > DistanzaSinistra)
{
Serial.print("Decisione: giro a destra");
GiraDestra();
}
else
{
Serial.print("Decisione: giro a sinistra");
GiraSinistra();
}
}
void Stop(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
delay(500);
return;
}
void Indietro(){
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(7, HIGH);
delay(500);
Stop();
return;
}
void GuardaDestra(){
servo.write(0);
delay(700);
DistanzaDestra = (sonar.ping_cm());
servo.write(90);
delay(700);
return;
}
void GuardaSinistra(){
servo.write(180);
delay(700);
DistanzaSinistra = (sonar.ping_cm());
servo.write(90);
delay(700);
return;
}
void GiraDestra(){
digitalWrite(4, HIGH);
digitalWrite(7, LOW);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
delay(1500);
Stop();
return;
}
void GiraSinistra(){
digitalWrite(4, LOW);
digitalWrite(7, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
delay(1500);
Stop();
return;
}
Il codice non è molto commentato ma credo sia abbastanza lineare da capire.
Grazie mille per l'attenzione spero di essere stato abbastanza chiaro nel descrivere il progetto e il problema, oviamente ben vengano consigli di ogni genere.
Scusate per eventuali "irregolarità" ma è la prima volta che scrivo su questo forum.