Stránka 12 z 26

Re: Pavouk Hiwonder

Napsal: 25 kvě 2024, 10:49
od luger
Pořád se snažím vyladit chování pavoučka.
Stále mám problém s narážením nožiček do překážek které jsou přímo před pavoučkem ale mírně stranou. Řeším to tak že při pohybu vpřed kmitá servo ultrazvuku vlevo, vpravo a přímo vpřed. Změří všechny tři hodnoty a vyhodnotí nejkratší vzdálenost a tu potřebuji :

Kód: Vybrat vše

//******************************************** KMITANI SERVA  ************************************************************

void  zmerit_vzdalenost() {                                         //čtení vzdálenosti ultrazvuku
      
    sonarServo.write (50,230,true);           // vzdálenost mírně vlevo 50°    230 - rychlost otáčení
    ultrazvuk ();
      vzdalenost1 = vpred;

    sonarServo.write (130,230,true);          // vzdálenost mírně vpravo 130°
    ultrazvuk ();
      vzdalenost2 = vpred;

    sonarServo.write (90,230,true);            // vzdálenost přímo vpředu 90°
    ultrazvuk ();
      vzdalenost3 = vpred; 
        
    if ((vzdalenost1 < vzdalenost2) and (vzdalenost1 < vzdalenost3)){          //   vyhodnocení vzdáleností
      vzdalenost = vzdalenost1;
    }
      else if ((vzdalenost2 < vzdalenost1) and (vzdalenost2 < vzdalenost3)){
       vzdalenost = vzdalenost2;  
    }
          else {
           vzdalenost = vzdalenost3;
    }
}
Je to jen výřez z programu.
ještě musím doplnit že hodnota "vpred" je vzdálenost získaná z ultrazvuku.
Nejsem si jistý jestli je to správně protože občas pavouček zareaguje poněkud nepředvídatelně.
Díky

Re: Pavouk Hiwonder

Napsal: 25 kvě 2024, 16:06
od gilhad
Pokud jsou například ty vzdálenosti 10,30,30, tak vzdalenost bude 30 :twisted:

Dej tam <= místo pouhého < pokud si některé jsou rovny, je jedno, kterou z nich vezmeš

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 10:21
od luger
díky gilhad, ale nějak se mi to nezdá. Přece už v první podmínce je jasné že 10 je menší než 30 a 30, takže nejmenší hodnota vzdálenosti je 10.

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 10:25
od kiRRow

Kód: Vybrat vše

vzdalenost1 = 10;
vzdalenost2 = 10;
vzdalenost3 = 30;

    if ((vzdalenost1 < vzdalenost2) and (vzdalenost1 < vzdalenost3)){          //   vyhodnocení vzdáleností
      vzdalenost = vzdalenost1;
    }
      else if ((vzdalenost2 < vzdalenost1) and (vzdalenost2 < vzdalenost3)){
       vzdalenost = vzdalenost2;  
    }
          else {
           vzdalenost = vzdalenost3;
    }
vzdalenost bude ? :) ... 30 ;)

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 10:31
od luger
Aha :?: já jsem vycházel z možnosti 10 30 30 a tato varianta mě nenapadla. Včera byl hokej tak mi to moc nemyslí :lol: díky

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 11:05
od luger
Tak jsem objednal černou umělou kožešinu s chlupem 25mm. Pavouček asi dostane nový kabátek :D . Uvidíme co bude doručeno a pak se vymyslí upevnění kožešiny na skelet a nožičky. Asi začnu nožkama, na skeletu těla je hromada senzorů a nechci je nějak ovlivňovat chlupama :lol: .

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 11:49
od gilhad
Jo, zvoral jsem to :oops: , kiRRow to napsal správně :D

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 18:01
od kiRRow
moc to kombíš, pokud mám X proměnných a chci z nich ven dostat tu nejmenší, tak si udělám proměnnou pro uložení výstupu, zapíšu do ní okamžitě první možnou hodnotu z porovnávaných, a pak ji postupně porovnávám s těmi ostatními a kdykoliv najdu menší, tak tu výstupní přepíšu

Kód: Vybrat vše

int vstup1 = 20;
int vstup2 = 30;
int vstup3 = 10;
int vystup;

vystup = vstup1; // předpokládejme že první vstup je nejmenší
if(vstup2 < vystup){vystup = vstup2;} // porovnáme s druhým, ale není menší
if(vstup3 < vystup){vystup = vstup3;} // porovnáme s třetím, je meší zapíšu si ho
ale i nakonec tohle je taky docela blbost a nesmysl... dá se to celý napsat tak, aby to bylo pružnější, pomocí polí a cyklů ... ono kouzlo je potom v tom, že když místo 3 měření chceš měření 5, tak jen přepíšeš jedno číslo v celém programu. Ten program se pak celý překompiluje tak, aby měl paměť pro pět měření a měřil 5x.

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 19:22
od gilhad
A hlavně, když ty vzdálenosti získáváš postupně, tak stačí rovnou uložit jen tu nejmenší

Kód: Vybrat vše


void  zmerit_vzdalenost() {                                         //čtení vzdálenosti ultrazvuku
      
    sonarServo.write (50,230,true);           // vzdálenost mírně vlevo 50°    230 - rychlost otáčení
    ultrazvuk ();
     vzdalenost = vpred;

    sonarServo.write (130,230,true);          // vzdálenost mírně vpravo 130°
    ultrazvuk ();
    if (vzdalenost > vpred) { vzdalenost = vpred; };

    sonarServo.write (90,230,true);            // vzdálenost přímo vpředu 90°
    ultrazvuk ();
    if (vzdalenost > vpred) { vzdalenost = vpred; };
}
(A ta funkce ultrazvuk by taky asi nemusela zapisovat do globálních proměnných, ale mohla by vracet přímo tu hodnotu.
A já bych si to ještě spíš udělal tak, že o to čidlo by se mi staral objekt, takže by pak v setupu bylo něco jako

Kód: Vybrat vše

UVvpred.init(......); // nastavení pinů a tak
a pak v kódu

Kód: Vybrat vše

vpred=UVvpred.vzdalenost();
if (vzdalenost > vpred) { vzdalenost = vpred; };
A kdybych pak chtěl pavouka naučit i couvat, tak mu přidám další čidlo a budu používat ještě navíc UVvzad.
Stejně tak, kdybych nechtěl kroutit krkem, tak mu dám dopředu víc čidel a budu mít UVvpredL, UVvpredC, UVvpredL, nebo rovnou pole UVvpred[3]
)

Re: Pavouk Hiwonder

Napsal: 26 kvě 2024, 21:27
od luger
Vidím že existuje hodně různých metod. Zase jsem se něco naučil.
Asi použiji tuto přehlednou variantu:

Kód: Vybrat vše

sonarServo.write (50,230,true);           // vzdálenost mírně vlevo 50°    230 - rychlost otáčení
    ultrazvuk ();
     vzdalenost = vpred;

    sonarServo.write (130,230,true);          // vzdálenost mírně vpravo 130°
    ultrazvuk ();
    if (vzdalenost > vpred) { vzdalenost = vpred; };

    sonarServo.write (90,230,true);            // vzdálenost přímo vpředu 90°
    ultrazvuk ();
    if (vzdalenost > vpred) { vzdalenost = vpred; };
Mám k tomu otázku. Jaký význam má ten středník za složenou závorkou ?