Stránka 25 z 26

Re: Pavouk Hiwonder

Napsal: 15 pro 2024, 10:24
od luger
Díky moc, tak jsem to otestoval a funguje to ! :D
Po startu se zobrazí datum:
IMG_20241215_101105_782.jpg
a po 5 sekundách přejde na info displej:
IMG_20241215_101015_384.jpg
Ještě se tam pokusím vrazit aktuální čas ale zatím nevím jak to rozdělit aby se to na ten displej vlezlo.

Re: Pavouk Hiwonder

Napsal: 15 pro 2024, 17:00
od gilhad
Stejně jako u toho info displaye bych to rozdělil na tři řádky

Datum prekladu
Dec 15 2024
10:24:00

Re: Pavouk Hiwonder

Napsal: 23 pro 2024, 14:56
od luger
Prozatím stačí rozlišení na dny. Uvidíme časem, kdyžtak to doplním o přesný čas.

Dnes jsem nechal asi tak půl hodiny proběhnout pavoučka. Běhal si jen tak po bytě a vypozoroval jsem že se občas sekne v nějakém prostoru menším jak 0,5 x 0,5 m (samotný pavouček má stejné rozměry :lol: ) a provádí pořád stejné operace - pohyby- stále dokola. Po několika proběhnutí "koleček" sem a tam se přece jen trochu posune mimo a "rozběhne" se do prostoru...
Tato opakovací smyčka netrvá dlouho - je tam ještě podmínka náhody která ho po několika "pokusech" někam posune a nebo při osvětlení baterkou udělá nějakou otočku apod.. se chová jako by měl vlastní "rozum" a dělá si co chce . Na 5 min odejdu a pavoučka najdu na opačné straně bytu jak si otevírá dveře :lol: (škoda že sem nejde vložit video)

Stejně mě to stále přivádí na myšlenku použít Lidar 360°

Re: Pavouk Hiwonder

Napsal: 27 led 2025, 16:28
od luger
Vracím se k problému narážení dlouhých nožiček pavoučka do překážek které nejsou přímo před ultrazvukovým sensorem. Ten má na vzdálenost 50 cm rozsah asi 12-15 cm (kužel s vrcholovým úhlem cca 15°. Z obrázku je jasné že "rozpětí" nožiček je mnohem větší - cca 40 cm.
pavouk překážky 1.jpg
Ke sledování "slepých míst" jsem zvolil kmitání serva s ultrazvukovým sensorem v rozsahu asi 20°.

Kód: Vybrat vše

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

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

    sonarServo.write (110,50,true);          // vzdálenost mírně vpravo 110°
    delay (10);
    ultrazvuk ();
    if (vpred <= vzdalenost ) { vzdalenost = vpred; }

    sonarServo.write (90,50,true);            // vzdálenost přímo vpřed 90°
    delay (10);
    ultrazvuk ();
    if (vpred <= vzdalenost ) { vzdalenost = vpred; }
     OLED ();
Vzhledem ke komplikovanému ovládání BUS serv nožiček je program trochu krkolomný. Možná někoho z vás napadne elegantnější algoritmus.

Kód: Vybrat vše

//----------------------------------   POHYB   PODLE VZDALENOSTI   ---------------------------------------------------------------------------------------

   zmerit_vzdalenost();           // kmitání serva sonaru
   sonarServo.stop ();            // ukončit kmitání serva
   //ultrazvuk ();
   //vzdalenost = vpred;
   
      if (vzdalenost <= 30) {
          Controller.stopActionGroup();
          Controller.runActionGroup(GO_BACK, 2);     // dva kroky zpět
          delay (2500);
            sonar1 ();
            //goto konec;  
      }
      
      if ((vzdalenost >= 80 ) and (xxxB == 1)) {     // vzd. větší než 100 a běží pomalu
        Controller.stopActionGroup();                 // stop
        xxxAA = 0;                                    // pomocná proměnná
      }
            
      if ((vzdalenost >= 80 ) and (xxxAA == 0)){             // vzd. větší než 100 a stojí
          Controller.runActionGroup(RYCHLE_DLOUHY_KROK, 0);   // stále běžet rychle 
          xxxA = 1;                                           // běží rychle
          xxxB = 0;
      }
      
      if ((vzdalenost < 80) and (xxxA == 1)){              // vzd. menší než 100 a běží rychle          
          Controller.stopActionGroup();                     // stop
          xxxBB = 0;                                         // 
      }

      if ((vzdalenost < 80) and (xxxBB == 0)){             // vzd. menší než 100 a stojí
          Controller.runActionGroup(POMALU_POKUS, 0);       // stále běžet pomalu
          xxxB = 1;
          xxxA = 0;
      }  

Re: Pavouk Hiwonder

Napsal: 09 úno 2025, 11:35
od luger
Pavoučka bych chtěl obohatit o další funkci- podmínku.
Ke kontrole náklonu v osách XY pomocí gyroskopu mi to funguje. Při větším náklonu se pavouček zastaví a čeká až se zase dostane cca do vodorovna. Chtěl bych tuto podmínku rozšířit o kontrolu - zastavit pavoučka když ho relativně rychle ručně zvednu od podlahy.
Používám knihovnu MPU6050 a program:

Kód: Vybrat vše

//*************************************   GYROSKOP    *************************************************************************************************

void gyroskop() {
    
  // zjistí všechny hodnoty z akcelerometru    accelgyro.getMotion (&ax, &ay, &az);   accelgyro.getAcceleration(&ax, &ay, &az);
  //accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  
  counter = 0;
  while (counter < 100)             // provede  měření
  {
    accelgyro.getAcceleration(&ax, &ay, &az);
  
  ax_p = ax_p + ax;
  ay_p = ay_p + ay;
  az_p = az_p + az;

  counter++;
  }
    
    x = ax_p/counter;               //zjistíme průmerné hodnoty
    y = ay_p/counter;
    z = az_p/counter;
    
    angle_x = abs(atan2(x, sqrt(pow(y,2) + pow(z,2)))/(pi/180));
    angle_y = abs(atan2(y, sqrt(pow(x,2) + pow(z,2)))/(pi/180));    //angle_z = atan2(az, sqrt(square(ax) + square(ay)))/(pi/180);
    angle_z = abs(atan2(z, sqrt(pow(x,2) + pow(y,2)))/(pi/180));
    
    //counter = 0;
    ax_p = 0;
    ay_p = 0;
    az_p = 0;
  }
Na výstupu jsou hodnoty X a Y v pohodě, úhlově sedí. s osou Z si nevím rady.
Pokud pavouček stojí vodorovně je hodnota Z - 88 (nevím proč zrovna 88, asi neleží úplně vodorovně)
Při změně polohy pavoučka v osách X a Y se změní i hodnota Z -> např. : X=5 Y= 10 Z= 75
Takže se neměří akcelerace
Co vlastně měří osu Z a jak ?

Re: Pavouk Hiwonder

Napsal: 09 úno 2025, 16:28
od kiRRow
to -88 je gravitační zrychlení ... ber ho ve svých výpočtech jako nulu :)
když ho položíš rovně na záda, měl bys dostat 88
průměrnou chybu měření v podstatě znáš, takže až zjistíš průměrnou hodnotu Z, tak k ní připočti chybu

Re: Pavouk Hiwonder

Napsal: 09 úno 2025, 16:53
od jankop
S tím tíhovým zrychlením je to pravda. Ty totiž nečteš gyroskop, ale čteš akcelerometr. Náklony se s ním dají detekovat ovšem právě dík tíhovému zrychlení velmi dobře. Náklon jde spočítat právě z podílu tíhového zrychlení na všech osách. V principu, když robota položíš na bok, měl bys dostat těch -88 na další ose a když ho položíš na hlavu tak bys měl mít -88 na té poslední ose. Vzpomínám si, že jsem snad naměřil dokonce opravdu těch 9,8m/s2.

Re: Pavouk Hiwonder

Napsal: 09 úno 2025, 17:05
od luger
díky, ale to je rotace. Já bych potřeboval zjistit změnu ve směru nahoru-dolů. Jako bych měřil výšku.

Re: Pavouk Hiwonder

Napsal: 09 úno 2025, 18:23
od kiRRow
normálně ti pavouk dává gravitační zrychlení -88, když ho začneš zvedat, tak ta hodnota půjde k nule - pokud ho zvedneš rychleji než gravitační zrychlení půjde i do plusu ... naopak když bude padat, tak to půjde hluboko pod -88

nejjednodušší metoda jak odstranit známou chybu je počítat s ní ...

Kód: Vybrat vše

    int zChyba = 88;
    
    x = ax_p/counter;               //zjistíme průmerné hodnoty
    y = ay_p/counter;
    z = az_p/counter;
    z = z + zChyba;			//počítáme s chybou

Re: Pavouk Hiwonder

Napsal: 09 úno 2025, 21:48
od luger
Už to docela funguje.
Podmínka funguje asi takto:
Pavouček si běží a když ho najednou zvednu tak se schoulí a čeká.
Jakmile ho budu pokládat na zem, zjistí že se pohybuje dolů. Chvilku počká (asi 2 sek.) a pak pokračuje v běhání.
Teď se pokouším vyladit hodnoty zrychlení aby nereagoval na rychlé pohyby při běhání, ale jen na zvedání a pokládání.