Yrobot

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

Re: Yrobot

Příspěvek od Baworek »

Ahoj...
Prepípal som to ked som spojíl piny 1a2 tak to pípalo :) tak som to tak zatial nechal :)
Na videu môžeš vidieť čo to ukazuje...

Vlastne vždy ked zmením polohu snimača teda výšku alebo ich pritlačím k tomu ukáže niečo iné :D

No kukni sa na to :)
http://youtu.be/Al9ZB0hsp-A
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Samozřejmě, že se to mění i se vzdáleností čidel od podložky. To je standardní. Hlavně je ale dobré, že už to funguje, a rozdíl mezi "černou" a "bílou" je velký! Na videu je naštěstí vidět, že nad černou je hodnota E3 až E5 a nad bílou je hodnota 29 až 2A (tato čísla by mi bohatě stačila napsaná a nepotřeboval bych ani to video).

Takže teď už můžeme určit úroveň pro rozhodnutí, jestli je pod snímačem černá čára nebo bílý papír. Zobrazovaná hodnota je v HEXa a je dělená čtyřmi. 29 HEXa odpovídá číslu 41 dekadicky a po vynásobení čtyřmi je to 164 (jako originál hodnota z ADC). HEXa E3 odpovídá číslu 227 dekadicky a x4 je to pak 908 jako originál hodnota z ADC. Pro začátek tedy můžeme jako rozhodovací úroveň dát ADC hodnotu třeba cca 500 až 600 (co bude menší prohlásíme za "bílé", co bude větší prohlásíme za "černé").

Pro jistotu by to chtělo ověřit, jak se naměřená hodnota mění u snímače VPRAVO a pak hlavně VLEVO (který možná koliduje s trimrem v Yrobotu [ale možná ne]). Uprav tedy dvakrát ten testovací program a zjisti, co to ukazuje u zbývajících dvou snímačů (postupně, jeden po druhem, každý s extra upraveným programem). Výsledky sem napiš.

Pokud se to u všech snímačů bude měnit podobně, můžeme všude použít stejnou rozhodovací úroveň (limit). Pokud budou změny různé, určíme pro každý snímač jinou rozhodovací úroveň. V každém případě už se můžeš zamyslet i nad tím, jak testovací program převedeme na opravdový sledovač čáry. Zkus navrhnout (a sem napsat) reálný program, který by odpovídal následujícímu "pseudokódu" (je to jen ta část v nekonečné smyčce):
- změř ADC hodnotu snímače UPROSTRED a pokud je hodnota větší než limit (600), jeď rovně (nebo zatím jen rozsviť obě LED [LED_7 i LED_8])
- jinak, změř hodnotu snímače VLEVO a pokud je větší než limit (600?), tak začni točit vlevo (nebo zatím jen rozsviť LED vlevo [LED_7?])
- jinak, změř hodnotu snímače VPRAVO a pokud je větší než limit (600?), tak začni točit vpravo (nebo zatím jen rozsviť LED vpravo [LED_8?])

P.S.: A prosím, netahej (nezvedej) toho Yrobota za OPT modul. Hrozí nebezpečí, že ulomíš nebo poškodíš ten konektor, na kterém to visí.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Takže otestoval som všetky 3...
tu sú zhruba hodnoty čo mi ukazovalo...
Hodnoty namerané sú zhruba to čo mi tam zobrazovalo najčastejšie :)

UPROSTRED: E1(čierna)[E2,E0,E3], 16(biela) [13,14,15] - niekedy aj napr. 1C,1A,22,20...

PRAVO: E7(čierna)[F3,E6,E9], 07(biela)

VLAVO: b5(čierna)[b4,b7,b6], 08(biela)


Tu je ne nekonečná smyčka:

Kód: Vybrat vše

	while(1) 
	{ 
	   // zakladni nekonecna smycka
      if (cara_je(VLEVO)) led_on(LED_7|LED_8);
      if (cara_je(UPROSTRED)) led_on(LED_7);
      if (cara_je(VPRAVO)) led_on(LED_8); 
	}
}
Jediné čo mi ešte tak hlavu láme je:

u8 cara_je(u8 snimac)... Tam ako tak rozmýšlam by sa mala zadať tá hodnota 600 :D či ?
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Super! Snímač VLEVO je sice opravdu trochu ovlivněn trimrem v Yrobotu, ale pořád je to dobře použitelné. Jen bych pro všechny snímače snížil tu rozhodovací hranici na 500.

Ten Tvůj program je "skoro" použitelný, ale neodpovídá dostatečně ani mnou navrženému "pseudokódu", ani "selskému rozumu". Proč bych měl naznačovat, že jedu rovně, když mám čáru pod levým snímačem? Beru to ale jen jako překlep, takže zatím změníme jen pořadí snímačů v řádcích kódu na UPROSTRED, VLEVO a VPRAVO. Kromě rozsvěcení, musíme LED i zhasínat (nezhasnou "automaticky"). Chtěl jsem také trochu upřednostnit rovnou jízdu, takže výsledný výsek kódu může vypadat třeba takto:

Kód: Vybrat vše

      if (cara_je(UPROSTRED)) led_on(LED_7|LED_8);
      else if (cara_je(VLEVO)) { led_on(LED_7); led_off(LED_8); }
      else if (cara_je(VPRAVO)) { led_off(LED_7); led_on(LED_8); }
Problém je ale samozřejmě ještě v tom, že funkci "cara_je()" jsme ještě nenapsali. Takže ji zkus napsat podle tohoto "pseudokódu" (parametrem je "snimac"):
- vyber ADC kanál pro "snimac"
- načti do pomocné proměnné aktuální hodnotu z ADC
- pokud je hodnota > 500 nastav návratovou hodnotu funkce na 1
- jinak nastav návratovou hodnotu funkce na 0

Funkce "cara_je()" musí být pak v celkovém programu zapsána ještě před funkcí "main()". Při zápisu se inspiruj stávajícím testovacím programem a také třeba funkcí "switch_read()" z Dema (pro příklad jak nastavit návratovou hodnotu funkce [je to u příkazu "return"]).

Zkus to napsat a třeba i vyzkoušet v Yrobotu. Výsledky sem pošli. Pokud LED budou svítit správně (při pohybu snímačů nad simulátorem čáry), tak budeme už jen krůček od funkčního sledovače čáry.

(Edit: dodatečně jsem musel opravit svoje vlastní překlepy v kódu)
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ahoj :)

No ja som sa troška čudoval keď som ti to písal sem ten svoj.. :D
No dúfam že raz sa mi to podarí..

Toto je dobre zatiaľ dobre ?

Kód: Vybrat vše

u8 cara_je(u8 snimac) {  
	  adc_channel_set(snimac);
	  adc_read(500);
	  
	  return 0;
  }
Troška len nerozumiem čo pod switch_read() lebo keď si pozriem tie príklady tak nechápem troška čo s toho vypísať :)
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Ahoj. Zatím je to správně jen částečně. Co má dělat příkaz "adc_read(500);"? Nebylo by lepší použít totéž, co bylo v testovacím programu (před výpisem hodnoty jednoho čidla)? Pro porovnání s limitní hodnotu použij prostě "if". Z toho "switch_read()" jsem měl na mysli pochopit jen to "return 1;" a "return 0;" nic víc (za tím "return" je návratová hodnota funkce, to je důležité vědět).
Baworek

Re: Yrobot

Příspěvek od Baworek »

Nerozumiem tomu :cry:
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Nechci Ti rovnou napsat úplně celý výsledek, to by ses toho moc nenaučil. Pokusím se tedy ještě o pár přímějších "nápověd".

Zopakuji znovu "pseudokód" pro žádanou funkci "cara_je" (parametrem je "snimac"):
- vyber ADC kanál pro "snimac"
- načti do pomocné proměnné aktuální hodnotu z ADC
- pokud je hodnota > 500 nastav návratovou hodnotu funkce na 1
- jinak nastav návratovou hodnotu funkce na 0

Převod "pseudokódu" do reálného programu bývá obvykle poměrně přímočarý (níže je částečný příklad toho přímočarého převodu):

Kód: Vybrat vše

u8 cara_je(u8 snimac) {
  adc_channel_set(snimac); // vyber ADC kanál pro "snimac" (viz náš testovací program)
  u16 adc_res = adc_read(); // načti do pomocné proměnné aktuální hodnotu z ADC (viz náš testovací program)
  if ([něco]>500) return 1; // pokud je změřená hodnota > 500 nastav návratovou hodnotu funkce na 1 (viz konec funkce "switch_read")
  [co napsat sem abychom měli návratovou hodnotu 0?] // jinak nastav návratovou hodnotu funkce na 0 (viz konec funkce "switch_read")
}
Už Ti toho zbývá dopsat opravdu málo, tak to zkus zvládnout (uprav to, co je naznačeno v hranatých závorkách).

Jak napsat ten "adc_read" jsem do kódu doplnil úplně, protože už jsme to v testovacím programu měli a opravdu mi není moc jasné, proč jsi to ve svém návrhu pro "cara_je" nepoužil naprosto stejně. Nehledej v tom žádné složitosti ani záludnosti. Prostě používej pokud možno to, co už dříve prokazatelně fungovalo.

Poslední poznámku (info) mám k tomu, že když zpracování funkce narazí na příkaz "return x;", tak dál už zpracování funkce nepokračuje, funkce je ukončena a do hlavního programu vrací hodnotu "x".
Baworek

Re: Yrobot

Příspěvek od Baworek »

No dúfam že som na to prišiel bo som to testoval a zrejme to išlo...
Síce niekedy to blbne no troška stým pohnem a svieti správne :)

Kód: Vybrat vše

	u8 cara_je(u8 snimac) {
		adc_channel_set(snimac); 
		u16 adc_res = adc_read(); 
		if (switch_read(adc_res)>500) return 1;
		if (switch_read(adc_res)>500) return 0;
		
	}
Len to ukáže:
Warning 1: control reaches end of non-void function [-Wreturn-type]
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Tak bohužel, ten Tvůj výsledek je zmatený a je zcela mimo (vyjadřuje naprosté nepochopení). Omlouvám se, prostě neumím "učit", jsem jen schopen občas něco "poradit".

V tomto případě už rezignuji a posílám celou svoji představu funkčního řešení:

Kód: Vybrat vše

u8 cara_je(u8 snimac) {    // funkce vraci hodnotu 0 pokud cara neni pod snimacem "snimac" a 1 pokud cara je pod snimacem
  adc_channel_set(snimac);  // vyber AD prevodnik
  u16 adc_res = adc_read();     // cti hodnotu z ADC
  if (adc_res>500) return 1;    // pokud je slaby odraz, je to cara, vracime 1
  return 0;                 // jsme nad bilou, vracime 0
}
To už žádný "warning" při překladu nenapíše (alespoň na mém PC).

Ve svém předchozím příspěvku jsem očekával, že místo "[něco]" napíšeš "adc_res" a na poslední řádek že napíšeš jen "return 0;" (viz výše).

Bojím se už skoro cokoliv napsat, protože nerozumím Tvému uvažování. Netušil jsem, že po mojí zmínce aby ses inspiroval funkcí "switch_read" se pokusíš "naroubovat" do programu přímo její volání (i když to v tomto případě nedává vůbec žádný logický smysl). Pokud ten Tvůj program něco rozumného dělal, tak to byla jen náhoda (skoro zázrak).

Uznávám, že "programátorský způsob uvažování" může být pro řadu lidí divný, nelogický a nesrozumitelný. Věřím ale, že trpělivostí a pílí se to dá překonat a "dostat se do toho". Každý si tím ale musí projít sám. Nevím, jestli jsem schopen Ti v tom nějak pomoci (zatím to tak nevypadá).

Každopádně, pokud chceš pokračovat, tak vyzkoušej ten upravený program v celé verzi, jestli ty LED svítí podle očekávání (mimochodem, dokážeš slovně popsat, jak by ty LED měly "správně" svítit?). Pokud bude program funkční, můžeš složit "maturitu" tím, že ho doplníš o reálné ovládání motorů (jsou to navíc jen tři stejné příkazy s různými parametry) a tím vytvořit základní opravdový "sledovač čáry". Jdi do toho!
Odpovědět