Problema con sensore ad ultrasuoni HC-SRO4, robot per movimento autonomo.
salve 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 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 180 gradi, quindi, nel momento in cui il sensore trova un ostacolo di fronte sè si "volta" destra e 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 lui, infatti ho verificato dal seriale che sensori spesso registrano dei "falsi zero", ovvero il valore si abbassa sotto la "soglia di allerta" o addirittura scende 0 anche se non c'è nessun oggetto realmente vicino.
non riesco capire se si tratti di un problema hardware o software, l'elettronica è assemblata cosi: una power bank alimenta 2.1 amp una raspberry pi 3 model b (che mi serve, almeno per ora, solo tenere sotto controllo da remoto il seriale), la rpi alimenta sua volta arduino uno via usb, che si occupa di tutto il lavoro. motori sono controllati sempre da arduino tramite un l293n, alimentato esternamente 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 casi avrei il problema degli ostacoli fantasma che 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 sensori uso la libreria newping che mi è sembrata la più affidabile.
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.
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 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 180 gradi, quindi, nel momento in cui il sensore trova un ostacolo di fronte sè si "volta" destra e 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 lui, infatti ho verificato dal seriale che sensori spesso registrano dei "falsi zero", ovvero il valore si abbassa sotto la "soglia di allerta" o addirittura scende 0 anche se non c'è nessun oggetto realmente vicino.
non riesco capire se si tratti di un problema hardware o software, l'elettronica è assemblata cosi: una power bank alimenta 2.1 amp una raspberry pi 3 model b (che mi serve, almeno per ora, solo tenere sotto controllo da remoto il seriale), la rpi alimenta sua volta arduino uno via usb, che si occupa di tutto il lavoro. motori sono controllati sempre da arduino tramite un l293n, alimentato esternamente 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 casi avrei il problema degli ostacoli fantasma che 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 sensori uso la libreria newping che mi è sembrata la più affidabile.
code: [select]
#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 destra");
giradestra();
}
else
{
serial.print("decisione: giro 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.
buongiorno,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti qui (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione il su citato regolamento ... grazie
guglielmo
p.s.: qui una serie di link utili, non necessariamente inerenti alla tua domanda:
- serie di schede xxxpighi per collegamenti elettronici vari: abc - arduino basic connections
- pinout delle varie schede xxxpighi: pinout
- link generali utili: link utili
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti qui (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione il su citato regolamento ... grazie

guglielmo
p.s.: qui una serie di link utili, non necessariamente inerenti alla tua domanda:
- serie di schede xxxpighi per collegamenti elettronici vari: abc - arduino basic connections
- pinout delle varie schede xxxpighi: pinout
- link generali utili: link utili
Arduino Forum > International > Italiano > Generale (Moderator: leo72) > Problema con sensore ad ultrasuoni HC-SRO4, robot per movimento autonomo.
arduino
Comments
Post a Comment