Fout in code autonome robot

Hey iedereen!
Voor een schoolproject moet ik een autonome robot door een doolhof laten gaan zonder de randen van dit doolhof te raken. Ik maak gebruik van 3 Ultrasoon sensor en twee DC motoren, elektrisch schema bijgevoegd.

Het doolhof bevat drie actiepunten: Bochten naar rechts, bochten naar links en een draai van 180 graden maken.

De bocht naar links gaat perfect en ook de 180 graden draai heb ik niks op aan te merken, dan komt het probleem: De bocht naar rechts.

De auto is zo geprogrammeerd dat in een gewone fase alleen het linkerwiel draait, zodra de US sensor een muur rechts ziet wordt er met het rechterwiel bijgestuurd, dit valt onder een voorwaarde dat de US sensor voor een waarde groter dan 8 herkent. Mijn robot ’ zigzagt ’ dus door het doolhof heen, maar dit is voor de eindbeoordeling geen probleem.

Ik voeg in deze post de code , het elektrisch schema en een duidelijker filmpje van het probleem bij, zodat ik mijn probleem zo duidelijk mogelijk aan jullie kan laten zien.

Het probleem is dat mijn code based is op het vinden van gaten om vervolgens links of rechts af te slaan, en hij ziet in dit geval het gat rechts veel te snel en duikt direct het gat in, wat dus niet de bedoeling is, en nu heb ik dus twijfel of er iets ontbreekt in de code, of dat juist twee voorwaarden botsen etc etc

int snelheidLinks = 10;
int snelheidRechts = 11;
int e1=8; // bepaal de richting van motor LINKS;
int e2=9; // bepaal de richting van motor LINKS;
int d1=12; //bepaal de richting van motor RECHTS;
int d2=7; // bepaal de richting van motor RECHTS;
int trigVoor = A4; // sensor voor
int echoVoor = A5; //

int trigLinks = A2;// sensor links
int echoLinks = A3;//

int trigRechts = A0;// sensor rechts
int echoRechts = A1;//

void setup()
{
Serial.begin(9600);
pinMode(trigVoor, OUTPUT); // zend signaal voor trigVoor
pinMode(echoVoor, INPUT);// ontvang signaal van echoVoor

pinMode(trigLinks, OUTPUT);// zend signaal voor trigVoor
pinMode(echoLinks, INPUT);// ontvang signaal van echoVoor

pinMode(trigRechts, OUTPUT);// zend signaal voor trigVoor
pinMode(echoRechts, INPUT);// ontvang signaal van echoVoor

pinMode(e1, OUTPUT);// zend signaal voor richting van motor links
pinMode(e2, OUTPUT);// zend signaal voor richting van motor links
pinMode(d1, OUTPUT);// zend signaal voor richting van motor rechts
pinMode(d2, OUTPUT);// zend signaal voor richting van motor rechts
delay(5000);
}

void loop()
{
// verklaar de variabelen;
long durationVoor, durationLinks, durationRechts, rechts, links, voor;

digitalWrite(trigVoor, LOW); // é declarada as respectivas entradas e saídas de sinal do
delayMicroseconds(2); // sensor ultrassônico e armazenada pela variável do sensor
digitalWrite(trigVoor, HIGH); // que converte a velocidade do som que é de 340 m/s ou
delayMicroseconds(5); // 29 microsegundos por centímetro, como o sinal vai e volta
digitalWrite(trigVoor, LOW); // esse tempo é a metade sendo sensor= tempo/29/2 ;
durationVoor = pulseIn(echoVoor, HIGH); // assim segue também nos outros dois sensores .
voor = durationVoor/29/2;

digitalWrite(trigLinks, LOW);
delayMicroseconds(2);
digitalWrite(trigLinks, HIGH);
delayMicroseconds(5);
digitalWrite(trigLinks, LOW);
durationLinks = pulseIn(echoLinks, HIGH);
links = durationLinks/29/2;

digitalWrite(trigRechts, LOW);
delayMicroseconds(2);
digitalWrite(trigRechts, HIGH);
delayMicroseconds(5);
digitalWrite(trigRechts, LOW);
durationRechts = pulseIn(echoRechts, HIGH);
rechts = durationRechts/29/2;

Serial.print(“voor:”); Serial.println(voor);
Serial.print(“links:”); Serial.println(links);
Serial.print(“rechts:”); Serial.println(rechts);

analogWrite(e1, 0); //
analogWrite(e2, 0); //
analogWrite(d1, 0); //
analogWrite(d2, 0); //

if(voor >8,0) //
{

if(rechts >5 && rechts<=7) // iets rechts
{
analogWrite(e1, 130);
analogWrite(e2, 0);
analogWrite(d1, 130);
analogWrite(d2, 0);
delay(10);
}

if(rechts >5) // naar rechts
{
analogWrite(e1, 255); //e1 255;e2 0: links vooruit
analogWrite(e2, 0);
analogWrite(d1, 120); //d1 0; d2 255: rechts achteruit
analogWrite(d2, 0);
delay(10);
}

if(rechts <=5) // naar links
{
analogWrite(e1, 127);
analogWrite(e2, 0);
analogWrite(d1, 255);
analogWrite(d2, 0);
delay(10);
}

}

if(links <=18 && rechts>18 && voor <=6) rec(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts groter dan 20cm
//afstand links minder of gelijk aan 20cm geldt de functie rec();

if(links >18 && rechts>18 && voor <=6) rec(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts groter dan 20cm
//afstand links meer dan 20cm geldt de functie rec();

if(rechts <=18 && links>18 && voor <=6) lin(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts minder of gelijk aan 20cm geldt de functie
//afstand links meer dan 20cm geldt de functie lin();

if(rechts<=18 && links<=18 && voor<=6) draai(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts minder of gelijk aan 20cm geldt de functie
//afstand links minder of gelijk aan 20cm geldt de functie draai();

}

void lin() // met deze functie draaien met 90º links;
{
analogWrite(e1, 0);
analogWrite(e2, 255);
analogWrite(d1, 255);
analogWrite(d2, 0);
delay(400);

}

void rec() // met deze functie draaien met 90º rechts;
{

analogWrite(e1, 0);
analogWrite(e2, 150);
analogWrite(d1, 0);
analogWrite(d2, 130);
delay(400);

}

void draai() // met deze functie draaien met 180º;
{
analogWrite(e1, 255);
analogWrite(e2, 0);
analogWrite(d1, 0);
analogWrite(d2, 255);
delay(800);

}

Op dit moment weet ik niet waar de fout zit in mijn code, daarom vraag ik hier hulp:

Elektrisch schema: bijlage

Filmpje: test - YouTube

alvast super bedankt voor jullie hulp!

Hoi.

Ik heb alleen je relaas gelezen, niet de code en ook niet andere bijlagen (want die zijn er niet).
Wel heb ik je filmpje bekeken.

Ik vermoed dat je kijkt of er een muur is, en als er een muur is ga je die ontwijken.
Dat betekent dus dat als er geen muur is, je die ook niet zal ontwijken.
Maar je kijkt in een rechte lijn en in 3 richtingen.
Je kijkt dus niet of het gat groot genoeg is om er door te kunnen.

Ik kan een aantal mogelijk oplossingen bedenken.
De eerste is kijken hoe groot het gat is.
Dat weet je pas als je het gat al voorbij bent, dus dan moet je weer achteruit als het gat groot genoeg blijkt.
Hiervoor moet je ook weten hoe groot je zelf bent, anders weet je niet of je er door past.
Deze oplossing kan een probleem zijn als je niet alleen het parcours foutloos moet afleggen, maar ook zo snel mogelijk.

De tweede is een scanner creëren.
Dat wil zeggen een beweegbare sensor.
Daarmee kun je min of meer van 1 positie kijken of een gat groot genoeg is.

De eenvoudigste oplossing is wel het meest risicovol.
Dan ga je kijken of je een gat ziet, en vervolgens ga je eerst nog een vast stukje verder.
Dit werkt als het parcours is zoals ik in het filmpje kon zien:
Als er een gat is, is het ook groot genoeg om er door te kunnen.

Overigens, als het parcours inderdaad zo is, dan ga je dus een gat opzoeken, maar rijd je door tot je de muur aan de voorzijde ziet.
Het ligt er aan hoe ver je vooruit kunt kijken, maar als je rekening met beiden houd, kun je dus ook beter controle houden over de route.

Hey, de code had ik als quote gezet maar is blijkbaar niet doorgekomen, ik zal hem dan wel hier uit typen


int snelheidLinks = 10;
int snelheidRechts = 11;
int e1=8; // bepaal de richting van motor LINKS;
int e2=9; // bepaal de richting van motor LINKS;
int d1=12; //bepaal de richting van motor RECHTS;
int d2=7; // bepaal de richting van motor RECHTS;
int trigVoor = A4; // sensor voor
int echoVoor = A5; //

int trigLinks = A2;// sensor links
int echoLinks = A3;//

int trigRechts = A0;// sensor rechts
int echoRechts = A1;//

void setup()
{
Serial.begin(9600);
pinMode(trigVoor, OUTPUT); // zend signaal voor trigVoor
pinMode(echoVoor, INPUT);// ontvang signaal van echoVoor

pinMode(trigLinks, OUTPUT);// zend signaal voor trigVoor
pinMode(echoLinks, INPUT);// ontvang signaal van echoVoor

pinMode(trigRechts, OUTPUT);// zend signaal voor trigVoor
pinMode(echoRechts, INPUT);// ontvang signaal van echoVoor

pinMode(e1, OUTPUT);// zend signaal voor richting van motor links
pinMode(e2, OUTPUT);// zend signaal voor richting van motor links
pinMode(d1, OUTPUT);// zend signaal voor richting van motor rechts
pinMode(d2, OUTPUT);// zend signaal voor richting van motor rechts
delay(5000);
}

void loop()
{
// verklaar de variabelen;
long durationVoor, durationLinks, durationRechts, rechts, links, voor;

digitalWrite(trigVoor, LOW); // é declarada as respectivas entradas e saídas de sinal do
delayMicroseconds(2); // sensor ultrassônico e armazenada pela variável do sensor
digitalWrite(trigVoor, HIGH); // que converte a velocidade do som que é de 340 m/s ou
delayMicroseconds(5); // 29 microsegundos por centímetro, como o sinal vai e volta
digitalWrite(trigVoor, LOW); // esse tempo é a metade sendo sensor= tempo/29/2 ;
durationVoor = pulseIn(echoVoor, HIGH); // assim segue também nos outros dois sensores .
voor = durationVoor/29/2;

digitalWrite(trigLinks, LOW);
delayMicroseconds(2);
digitalWrite(trigLinks, HIGH);
delayMicroseconds(5);
digitalWrite(trigLinks, LOW);
durationLinks = pulseIn(echoLinks, HIGH);
links = durationLinks/29/2;

digitalWrite(trigRechts, LOW);
delayMicroseconds(2);
digitalWrite(trigRechts, HIGH);
delayMicroseconds(5);
digitalWrite(trigRechts, LOW);
durationRechts = pulseIn(echoRechts, HIGH);
rechts = durationRechts/29/2;

Serial.print(“voor:”); Serial.println(voor);
Serial.print(“links:”); Serial.println(links);
Serial.print(“rechts:”); Serial.println(rechts);

analogWrite(e1, 0); //
analogWrite(e2, 0); //
analogWrite(d1, 0); //
analogWrite(d2, 0); //

if(voor >7) //
{

if(rechts >5 && rechts<=7) // iets rechts
{
analogWrite(e1, 130);
analogWrite(e2, 0);
analogWrite(d1, 130);
analogWrite(d2, 0);
delay(10);
}

if(rechts >5) // naar rechts
{
analogWrite(e1, 255); //e1 255;e2 0: links vooruit
analogWrite(e2, 0);
analogWrite(d1, 120); //d1 0; d2 255: rechts achteruit
analogWrite(d2, 0);
delay(10);
}

if(rechts <=5) // naar links
{
analogWrite(e1, 127);
analogWrite(e2, 0);
analogWrite(d1, 255);
analogWrite(d2, 0);
delay(10);
}

}

if(links <=18 && rechts>18 && voor <=6) rec(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts groter dan 20cm
//afstand links minder of gelijk aan 20cm geldt de functie rec();

if(links >18 && rechts>18 && voor <=6) rec(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts groter dan 20cm
//afstand links meer dan 20cm geldt de functie rec();

if(rechts <=18 && links>18 && voor <=6) lin(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts minder of gelijk aan 20cm geldt de functie
//afstand links meer dan 20cm geldt de functie lin();

if(rechts<=18 && links<=18 && voor<=6) draai(); //afstand voor minder of gelijk aan 8 cm,
//afstand rechts minder of gelijk aan 20cm geldt de functie
//afstand links minder of gelijk aan 20cm geldt de functie draai();

}

void lin() // met deze functie draaien met 90º links;
{
analogWrite(e1, 0);
analogWrite(e2, 255);
analogWrite(d1, 255);
analogWrite(d2, 0);
delay(400);

}

void rec() // met deze functie draaien met 90º rechts;
{

analogWrite(e1, 0);
analogWrite(e2, 150);
analogWrite(d1, 0);
analogWrite(d2, 130);
delay(400);

}

void draai() // met deze functie draaien met 180º;
{
analogWrite(e1, 255);
analogWrite(e2, 0);
analogWrite(d1, 0);
analogWrite(d2, 255);
delay(800);

}


De vier opgesomde If functies laat hij voor wat het is betreft rechts, het voertuig zoekt naar een muur rechts zodat hij kan bijsturen naar links, alleen op dat punt is er dus geen muur en knalt hij dus meteen naar links, dit moet hij niet doen maar hij zal bijv moeten doorrijden of de bocht ruimer nemen.

De bocht ruimer nemen lijkt ook een moeilijke oplossing, de twee motoren zullen dan moeten draaien maar dan gaat het bij het bijsturen in de rechte gangen ook mis,

Ik hoop dat U de code nu wel ziet en mij misschien verder kunt helpen!

ik zie geen simpele rechtdoor.
en maak de tijden korter dus geen bocht van 90 maar een klein beetje maar en dan weer testen.

Hoi.

Code plaats je het beste tussen [code] [/code] tags.
Das dus precies het zelfde als een quote, maar dan met code.
Ik zei overigens niet dat ik je code niet zag, maar dat ik 'm niet gelezen had.
Dat kwam door dat ik nog even gauw om 1 uur 's nachts een antwoord zat te typen en ik geen zin had dan die code te gaan uitpluizen.

TS heeft in de 1e post aangegeven dat zijn voertuig ook niet recht rijdt, maar door het doolhof zigzagt.
Das dus een bewuste keuze en zou voor de opdracht geen probleem geven.
Ik vind dat zelf wel oké, weer eens een poging om een andere en iets minder voor de hand liggende oplossing toe te passen.

Je zou zelfs kunnen stellen dat je zo niet een scannende sensor maakt, maar dat het hele voertuig scant en dus ook de sensoren.
Ik denk niet dat dat een doel was en dat dat ook gebruikt word, maar toch.

In het filmpje is dus het voertuig te zien.
Zodra er een gat naar rechts te zien is, duikt ie daar in.
En das dus wat er mis gaat.
Wat me ook opvalt, is dat alle sensoren wat ver naar voren zitten.
De zijdelingse sensor printjes steken zelfs voor het voertuig uit (maar wel ongeveer even ver als de voorwaarts gerichte sensor uitsteekt).

Ik weet niet precies hoe die sensoren geconstrueerd zijn.
Wel meen ik te weten dat er een ultrasoon zender en een ontvanger op zitten.
De ene zit links en de andere zit rechts op het printje.
Ik zie op de video dat alle draden naar boven gericht zijn (op zich wel logisch).

Nu vraag ik me af of het misschien zo zou kunnen zijn dat de sensor links een gat later zou zien dan de sensor rechts.
Dat kun je natuurlijk testen.
Als dat zo zou zijn, dan kun je eens kijken wat er gebeurt als je de sensor print omdraait, en dan dus de kant waar je draden zitten naar beneden wijst.

Ik kan het niet echt goed zien in het filmpje, maar het lijkt er op dat het voertuig het laatste stuk een beetje meer aan de linker zijde rijdt.
Wellicht kun je dan iets bedenken waardoor het ding meer het midden aanhoudt.

Ik denk ook dat het mogelijk moet zijn om de sensoren meer naar achter op het voertuig te plaatsen.
Dan zie je het gat als je voertuig al verder vooruit is .

En als je commetaren in je code hebt, zorg dan dat die ook kloppen.
Dus als je iets wijzigt, neem dan het daarbij behorende commentaar mee.
En het commentaar in 2 talen is ook een beetje jammer, maar goed.

Ik vermoed dat je probleen hier zit :slight_smile:

  if (voor > 7) //
  {
    if (rechts > 5 && rechts <= 7) // iets rechts
    {
      ...
      ...
    }
    if (rechts > 5) // naar rechts
    {
      ...
      ...
    }

Vul maar 6 of 7 in voor rechts. Aan de voorwaarde voor de eerste ‘if’ is voldaan en we sturen een beetje naar rechts. Aan de voorwaarde voor de tweede ‘if’ is ook voldaan en dus sturen we vol naar rechts.

Misschien dat dit het oplost

  if (voor > 7) //
  {
    if (rechts > 5)
    {
      if (rechts <= 7)
      {
        // beetje rechts
      }
      else
      {
        // vol rechts
      }
    }
    else
    {
      // vol links
    }
  }

Wat commentaar puntjes
1)
De name ‘lin’ en ‘rec’ kunnen wat meer beschrijvend zijn, bv draaiLinks en draaiRechts; ik moest nu eerst naar die functies gaan om te begrijpen wat er in loop() gebeurde.
2)
In het begin van loop() schakel je alle motoren uit als ik het goed begrijp. Resulteert dat niet in een beetje schokkend bewegen?