Yrobot

Pochlubte se svým robotem ostatním!
Odpovědět
Baworek

Re: Yrobot

Příspěvek od Baworek »

Takže všetko som ponastavoval ako si písal. :)

Dúfam že na videu je vidno všetko... :D
Je tam vidieť že v jednom smere ide bez menších problémov a akonáhle ho otočím tak už sa mu niečo nepáči... :?
Sranda ešte je že ak dám dráhu na slnko. Tak pokračuje stále rovno asi ten odraz mu vadí... Ale to je jedno. :D

https://www.youtube.com/watch?v=rgbKY0pa2z8
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

OK, vypadá to, že při takto nízké nastavené rychlosti nedochází k většímu rušení od motorů. Hlavním problémem asi bude okolní světlo, což jsem měl předpokládat. Možná, že pro různé okolní osvětlení bude třeba nastavovat různé rozhodovací úrovně. Toho se dá dosáhnout "kalibrací" po zapnutí robota (změří se programově aktuální hodnoty nad bílou a nad černou a podle té skutečnosti se nastaví vhodná rozhodovací úroveň). Přesto bych ještě vyzkoušel jednodušší pokus, a to je značné snížení rozhodovací úrovně (tentokrát třeba na 300) a v algoritmu ještě více preferovat zatáčení tím, že tam zase vrátíme ty "else" ale přeskládáme pořadí vyhodnocování snímačů. Třeba takto (v tom výseku kódu chybí změna v nastavení rozhodovací úrovně v "cara_je" [na 300]):

Kód: Vybrat vše

      if (cara_je(VLEVO)) {
        motor_run(0, -60);
        led_display_hex(0xEE);  // signalizace toceni vlevo
      }
      else if (cara_je(VPRAVO)) {
        motor_run(60, 0);
        led_display_hex(0x33);  // signalizace toceni vpravo
      }
      else if (cara_je(UPROSTRED)) {
        motor_run(60, -60);
        led_display_hex(0x11);  // signalizace jizdy rovne
      }
Pokud tato změna nepřinese dostatečnou spolehlivost sledování čáry, tak budeme hledat (a zkoušet) další možná řešení (asi tu kalibraci, ale možná to předtím znovu "proměříme" [jinou signalizací na sedmisegmentovkách]). Mohli bychom se také pokusit o jiný algoritmus. Uvidíme.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Tak som to tak nastavil...

Robot sa mi točí dokola :/ občas sa vydá rovno...
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Zaexperimentuj trochu s tou rozhodovací úrovní (300, 400, 500, 600, 700 [a případně i 200 a 800]). Vypadá to ale, že si budeme muset znovu nechat vypisovat naměřené hodnoty z vybraného senzoru i za jízdy (na sedmisegmentovkách). Pak asi také budeme muset nějak zjistit, jak rychle vlastně ta hlavní smyčka běží (jak často to vzorkuje senzory).
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ahoj.

Hral som sa stým asi cca hodinu.
Najlepšie na tom bola hodnota 300 ale...
"else if (ciara_je (UPROSTRED)... Som dal dostredu miesto toho aby to bolo posledné tak ako si to sem dal...
Síce to občas blblo no bezproblémov prešiel v oboch smeroch cca 4-8x :)
Keď prídem domov cca okolo 17stej. Premeriam hodnoty a dam vedieť :)

Chcel by som ťa poprosiť keby si mal čas... Pozrieť si "ENCODER _TUTORIAL"
Troška som sa zamotal chcel som to vyriešiť sám no nepodsrilo sa mi to zatiaľ...
Ako mu do toho "ENCODER_TUTORIAL.c" nakódovať že po 20ot. Kolieska zastaví a otoči sa a zas pokračuje 20ot...
Viem že mam využiť motor_run, g_encoder.left/right==20 a kroky aby zastavil a ukázal na segmentovke...
No neviem to dať dokopy...
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Dobře, "sledovač čáry" můžeme prohlásit za použitelný. Spolehlivost by sice měla být vyšší (klidně i 100 ujetých okruhů bez zaváhání), ale to může být námět pro případné další experimentování a vylepšování.

Pokud se teď chceš věnovat enkoderům, můžeme to zkusit. Díval jsem se na příklad "ENCODER_Tutorial" a podle mne v něm není nic zásadního, co by nebylo i v knihovně "yellow_robot". Ten "tutorial" vlastně nedělá nic rozumného (jen se točí kola při stisku tlačítka) a o využití enkodérů tam prakticky nic není. Proto doporučuji vyjít zase z knihovny "yellow_robot".

V knihovně "yellow_robot" jsou nadefinované užitečné funkce "void encoder_reset()" (vynuluje čítače enkodérů), "u16 encoder_get_right()" a "u16 encoder_get_left()" (vrací aktuální hodnotu čítače příslušného enkodéru). Tyto funkce se dají použít pro "odměřovanou jízdu".

Takže zkusím popsat, jak bych na to šel. Nejprve "pseudokód":
- načíst knihovnu "yellow_robot"
- definovat novou funkci "rovne(vzdalenost)" pro odměřovanou jízdu vpřed ("vzdalenost" je v cm)
- definovat novou funkci "otoc(uhel)" pro odměřované otočení o zadaný úhel (záporný úhel znamená otočení vlevo, jinak vpravo)
- hlavní program
-- init()
-- nekonečná smyčka (točí dokola dva níže uvedené příkazy)
--- jeď rovně 20 cm
--- otoč se o 90 stupňů vpravo

A teď první pokus o přepis do reálného kódu:

Kód: Vybrat vše

#include "yellow_robot.h" // vlozeni HAL knihovny pro abstrakci od HW Yrobota
void rovne(u16 vzdalenost) { // vzdalenost je v cm
   encoder_reset(); // vynulujeme citace enkoderu
   motor_run(60,-60); // rozjedeme se vpred
   while (encoder_get_right()<vzdalenost) { // pockame az enkoder napocita urceny pocet impulzu
      // zatim predpokladam ze jeden impulz enkoderu je 1 cm
   }
   motor_run(0,0); // zastavime motory
}
void otoc(u8 uhel) { // uhel je ve stupnich (-180 az +180)
   encoder_reset(); // vynulujeme citace enkoderu
   uhel = uhel/5; // od boku zatim odhadnu ze jeden impulz z enkoderu je otoceni o 5 stupnu (nutno doladit)
   if (uhel>0) { // pro kladne uhly budeme tocit vpravo
      motor_run(60,0); // zacneme tocit vpravo (jedeme jen levym kolem)
      while (encoder_get_left()<uhel) { // pockame az enkoder napocita urceny pocet impulzu
      }
   } else { // pro zaporne uhly budeme tocit vlevo
      motor_run(0,-60); // zacneme tocit vlevo (jedeme jen pravym kolem)
      while (encoder_get_right()<uhel) { // pockame az enkoder napocita urceny pocet impulzu
      }
   }
   motor_run(0,0); // zastavime motory
}
int main()
{
   init(); // inicializace vseho potrebneho v Yrobotovi
   while (1) 
   { // zakladni nekonecna smycka
      rovne(20); // jed rovne 20 cm
      otoc(90); // otoc se o 90 stupnu vpravo
   }
}
Kód je zcela neodzkoušený, protože nejsem u počítače, kde mám AVR studio. Výsledkem by měla být jízda Yrobota do čtverce o straně 20 cm. Podle mne to ale nikdy nepůjde vyladit úplně přesně, protože nevěřím, že by ty enkodéry mohly být tak dokonalé. Uvidíme.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Zo sledovačom budem pokračovať a vyladím ho dúfam... :)
V priebehu 7dní by som mal mať ešte jedno autíčko také aj z modulom...
Tak ich navzájom porovnám a tak ti dám vedieť.
Dnes som si aj premeriaval hodnoty pri jazde... Bez menšej zmeny ukazovalo to čo predtým...

Neviem to na 100% ale oni chcú spraviť súťaž stým a sú 4 tímy a 3miesta...
Tak ak sa mi podarí byť aspoň tretí dostanem robota ktorého ti darujem... ;)

Teraz spať k Encoderom...
Celý návrh vypadá pekne aj zostavenie prebehne...
Ak sa však momentálne to ide len dopredu stým som rátal... :D

No ešte chýba tam zopár riadkov kódu...
Hlavne som si na 70% istí že prerušenie je po pol centimetri lebo pod kolieskom ten bielo-čierny pásik je tak spravený že: pol centimetra čierny.. potom biela a dokola...

Obrázek Obrázek
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Pokud sledovač i za jízdy ukazuje na bílé pod "20" a na černé nad "B0", tak v tom by problém být neměl. Rád bych věděl, jakou rychlostí to vzorkuje, ale zatím přesně nevím, jak to změřit. Možná by to šlo zhruba tímto doplňkovým kódem (je to výsek z upraveného a doplněného "main"):

Kód: Vybrat vše

  u32 pocitadlo = 0;
  u32 cas = get_time() + 100;
  while(1) {
    pocitadlo++;
    if (get_time()>cas) {
      if (pocitadlo>255) pocitadlo = 255;
      led_display_hex(pocitadlo);
      cas = get_time() + 100;
      pocitadlo = 0;
    }
    ... // tady je puvodni kod sledovace v hlavni smycce
  }
Tento kód by měl zobrazit počet cyklů, které proběhnou během desetiny sekundy (100 ms). Pokud to bude více než 255, tak se zobrazí "FF", jinak to zobrazí ten počet.

Ohledně enkoderů prosím ještě o ověření, že je zapojena propojka na napájení enkoderů (v dokumentaci je označena číslem 19). Bez napájení ty enkodery nepojedou. Jinak už by měl být kód plně funkční (i když by odměřování bylo nepřesné). Pro ověření funkčnosti enkoderů by se hodilo zobrazovat na sedmisegmentovkách jejich stav, třeba takto (ve funkci "rovne"):

Kód: Vybrat vše

   while (encoder_get_right()<vzdalenost) { // pockame az enkoder napocita urceny pocet impulzu
      // zatim predpokladam ze jeden impulz enkoderu je 1 cm
      led_display_hex(encoder_get_right());
   }
Podle svých možností tedy ověř to napájení enkoderů a případně uprav program na indikaci počítadla enkoderu při jízdě rovně.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Tak doplnil som to a celý čas ukazoval FF...

Čo sa týka enkoderov...
Sú funkčné lebo ak tam nahrám Enkoder_tutorial tak mi romálne na segmentovke počíta otáčky...
Myslím že nefunguje to pretože tam niesu na začiatku programu uvedené...

Kód: Vybrat vše

void init_encoder(void){
cli();

ENCODER_DDR  = 0;									// Piny PD2 a PD3 Nastavime ako vstupne. PD2 a PD3 sluzia taktiez ako INT0 a INT1, pretoze mozu fungovat ako externe prerusenia.
ENCODER_PORT = ENCODER_RIGHT|ENCODER_LEFT;
DDRD = (1<<PD5)|(1<<PD6) | (1<<PD4)|(1<<PD7);		// Vsetky tieto piny nastavime ako vystupne. 
PORTD&=~(1<<PD5)|(1<<PD6) | (1<<PD4)|(1<<PD7);		// Nulovanie bitov registra na poziciach PD5, PD6, PD7 a PD4.

g_encoder.right = 0;
g_encoder.left = 0;

MCUCR = (1<<ISC10)|(1<<ISC00);						// Externe prerusenia su nastavene ako "Akakolvek logicka zmena generuje poziadavku na prerusenie". 
GICR = (1<<INT0)|(0<<INT1);							// Najskor povolime INT0 a INT1 nie.
sei();												// Povolenie globalneho prerusenia.
}
Pričom ako sa mi zdá INT0/1 by mali byť senzory...
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

OK, rychlost vzorkování ve sledovači je dostatečná (častěji než 1x za milisekundu, takže za tu dobu Yrobot ujede méně než 1 mm). Asi by bylo nejlepší upravit algoritmus tak, aby si program pamatoval na které boční straně viděl naposledy čáru, i když jako úplně poslední ji viděl uprostřed (před vyjetím na bílou). Tím bychom zajistili, že na bílé bude Yrobot vždy někam prudce zatáčet (a nepojede dál rovně). Je to trochu kruté opatření, ale mohlo by zvýšit spolehlivost sledování čáry (takže pak by snad bylo možno zvýšit rychlost jízdy Yrobota). Zkus tuto úpravu doplnit do programu sám, případně to tu prodiskutujeme podrobněji.

Ohledně enkoderů je to tak, že přesně ten Tebou uvedený kód je obsažen i ve funkci "init()", definované v knihovně "yellow_robot". Takže po "init()" v našem "main" programu by ty enkodéry fungovat měly (teoreticky). S tou doplněnou signalizací to tedy teď pořád ukazuje nuly?

Teď jsem si ještě podrobněji prohlédnul ta Tvoje videa z jízdy Yrobota a připadá mi, že funguje jen levý enkodér (protože chod motoru má být indikován problikáváním příslušné LED, ale pokud dobře vidím, tak problikává jen levá LED). Možná by tedy pomohlo odpočítávat jízdu rovně pomocí levého enkodéru (náhodně jsem v původním programu zvolil pravý enkodér a on je zřejmě zrovna "problémový"). Takže zkus funkci "rovne" upravit takto:

Kód: Vybrat vše

   while (encoder_get_left()<vzdalenost) { // pockame az levy enkoder napocita urceny pocet impulzu
      // zatim predpokladam ze jeden impulz enkoderu je 1 cm
      led_display_hex(encoder_get_left());
   }
Pak sem dej vědět, jestli se něco změnilo.

P.S.: Mimochodem, jak problikávají LED v tom "ENCODER_Tutorial"? Měly by také problikávat obě (levá i pravá).
Odpovědět