Yrobot

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

Re: Yrobot

Příspěvek od Baworek »

Ahoj.

No som rád že mi to funguje ako to viem...
Jedine fakt neviem čo písať do tých súborov ".h" bo to čo tam vidím mi nič nehovorí.... Aj z toho čo spomínaš... :D Hlavne že to ide. :D

Natočil som aj video :) tak si ho pozri ako to ide:
https://www.youtube.com/watch?v=C-pgBXtc96M

Jediný problém je že to pri držaní toho tlačítka stále pípa to neviem :D či je dobré alebo zle...
A kedže som nemal 10 rúk :D keď stlačím obidve naraz tak nezasvieti ani jedna ale skúsim dať podmienku if... a dať tam obe či sa mi to podarí :)
Toto mi nefunguje... Tak neviem :D

Kód: Vybrat vše

		if (is_low(PINB,PB2|PB3))
		{
			tbi(LED_BUZZER_PORT,PA5|PA6);
			while(is_low(PINB,PB2|PB3))
			{
				cbi(LED_BUZZER_PORT,PA7);
			}
			sbi(LED_BUZZER_PORT,PA7);
			_delay_ms(100);
		}
Určite ak vidíš že to viem tak môžeme ísť dopredu :) pomaličky :D
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Ahoj.

Pěkné video :) Podle mne by to mělo fungovat tak, že pokud jedno z tlačítek podržíš trochu déle (alespoň vteřinu), tak by jednak měl stále pískat bzučák, ale také by přitom měla příslušná LED blikat (5x za sekundu). To jsem v tom videu nějak neviděl (při tom jednom trochu delším přidržení tlačítka). Podstatné je, aby Ti bylo jasné, proč by měl program (Yrobot) fungovat zrovna takhle (jak jsem popsal). Zkušebně můžeš ten program upravit tak, aby jen blikaly LED, ale bzučák aby byl zticha.

V těch vnořených ",h" souborech je přesně to, co můžeš napsat i přímo do svého programu (jen je to v externím souboru). V principu tedy ty ".h" soubory vůbec nemusíš používat a to co je v nich můžeš vložit přímo do hlavního kódu (na začátek, tedy tam, kde je ta direktiva #include [místo ní]).

Pokud chceš pokročit směrem k ježdění, snímání čáry a případně i k sonaru, tak doporučuju stavět na těch knihovnách "yellow_robot.h" a "yellow_robot.c" z Demo programu. Prostě ty dva soubory zkopíruj do adresáře svého projektu (do adresáře k souboru "Led_Button.h"), pak ze začátku svého programu vyhoď to #include "Led_Button.h" a místo toho tam dej #include "yellow_robot.h". Pak sice budeš muset předělat i zbytek svého programu, ale zase budeš moci začít používat velmi užitečné funkce "motor_run", "led_display_hex" nebo "adc_read". Smyslem dalšího vývoje programu pak bude napsat vlastní funkce pro obsluhu OPT modulu a pak je použít pro řízení robota (spolu s funkcemi z "yellow_robot.h").

Není to asi zrovna "pomalý" postup vpřed, ale připadá mi nejvhodnější. Jde o to pochopit, že složitý program můžeš rozdělit do několika jednodušších funkcí (které si můžeš sám napsat a pak je dál používat ve svých programech [pro Yrobota]).

P.S.: U té tvé poslední ukázky kódu nerozumím té poznámce "toto mi nefunguje". Co to znamená "nefunguje"? Nejde to přeložit? Nedělá to to co má? Co to tedy dělá? Slovo "nefunguje" je prostě nedostatečné pro popis situace.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Budem vždy natáčať to čo spravím aby si videl ako to funguje... :D

Funguje ten program tak že po stlačení zasvieti a pípne (viď. na videu)...
Po držaní tlačítka to pípa v kuse a ledka svieti (nebliká ani nič)...
Keď to stláčam vkuse tak to ide ako keby si zapínal svetlo v izbe :D svieti-nesvieti...

Mám pred sebou tie súbory Demo (main.c, yellow_robot.c/.h) no pozerám na to a viac neviem...
Nemám predstavu ako sa v tom zorientovať :D :D
Čo je OPT modul ? :D (senzory či ?)

PS:
Myslel som tým že keď toto hodím do autíčka a stlačím obe tlačítka tak sa naraz zapnú no nefunguje to :) :D
Program preloží bez chyby... No nejde to.

Kód: Vybrat vše

      if (is_low(PINB,PB2|PB3))
      {
         tbi(LED_BUZZER_PORT,PA5|PA6);
         while(is_low(PINB,PB2|PB3))
         {
            cbi(LED_BUZZER_PORT,PA7);
         }
         sbi(LED_BUZZER_PORT,PA7);
         _delay_ms(100);
      }
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

A sakra. moje chyba. Ten program nemá blikat LEDkou, špatně jsem se díval. Funguje to tedy tak, jak má (ten původní program). Omlouvám se.

Aby Ti dobře fungovalo rozpoznání stlačení obou tlačítek, tak musíš vědět, jak přesně funguje makro _BV(bit), které je obsaženo v "Led_Button.h". Toto makro očekává jako parametr (bit), číslo od 0 do 7 a převádí ho na byte, ve které je nastaven na jedničku jen ten příslušný bit. Nelze u něj tedy použít logické "nebo" stylem (PB2|PB3). PB2 ve skutečnosti znamená číslo 2 a PB3 znamená číslo 3 Výsledkem té bitové "nebo" operace je tedy opět číslo 3, takže jsme si nijak nepomohli (kontroluje to jen pravý spínač). Podobné je to i u snahy o ovládání dvou LED jedním řádkem programu. Šlo by to, kdyby ty funkce sbi, tbi a cbi byly jiné, ale takhle to nejde. Můžeš ale bez problémů nastavovat (nebo testovat) dva různé bity pomocí dvou nezávislých volání těch funkcí (maker).

Takže např. nějak takto:

Kód: Vybrat vše

      if (is_low(PINB,PB2) && is_low(PINB,PB3))  // takhle otestuju dva ruzne bity
      {
         tbi(LED_BUZZER_PORT,PA5);  // tady prepnu stav LED7
         tbi(LED_BUZZER_PORT,PA6);  // tady prepnu stav LED8
         while(is_low(PINB,PB2) && is_low(PINB,PB2))  // tady cekam na uvolneni treba i jen jednoho z tlacitek
         {
            cbi(LED_BUZZER_PORT,PA7);  // tady zapinam bzucak (a necham ho zapnuty, dokud drzim obe tlacitka)
         }
         sbi(LED_BUZZER_PORT,PA7);  // tady vypinam bzucak
         _delay_ms(100);  // tady cekam desetinu sekundy napr. abych potlacil zakmity tlacitek
      }
Přidal jsem tam komentáře, abys mohl zhodnotit, nakolik je Ti to jasné. Pro zajímavost si můžeš (pokud chceš) upravit ten program tak, aby ty LED opravdu blikaly tak, jak jsem omylem psal dříve.

V souboru "yellow_robot.h" nemusíš v prvním přiblížení chápat, jak je to tam napsáno, ale všímej si hlavně těch slovensky psaných komentářů, které vysvětlují, co a proč je tam definováno (hlavně názvy pomocí "#define" a funkce obvykle pomocí "void funkce()".

Možná se můžeme vrátit ještě o kousek zpátky a pobavit se trochu obecněji o vývoji programů. Osobně jsem ze "staré školy" a používám tzv. metodu "shora dolů" (top down), kdy se na celý řešený problém podívám z velkého nadhledu a napíšu si "kostru", která popisuje to hlavní, co by měl program dělat, ale používá přitom ještě neexistující funkce, které rozpracuju teprve později (jdu tedy od celkového k detailům). Existují i jiné programátorské metody, ale ten "top down" mi prostě vyhovuje.

Takže například ten svůj původní návrh algoritmu sledovače čáry bych mohl "z nadhledu" napsat např. takto:

Kód: Vybrat vše

#include "yellow_robot.h" // vlozeni HAL knihovny pro abstrakci od HW Yrobota
init(); // inicializace vseho potrebneho mimo OPT modul
initOPT(); // inicializace OPT modulu
motor_run(150,150);  // zacneme jizdou rovne
while(1) { // zakladni nekonecna smycka
  if (cara_je(VLEVO) motor_run(0,150); // kdyz je cara vlevo, zatacim vlevo
  if (cara_je(UPROSTRED) motor_run(150,150); // kdyz je cara uprostred, jedu rovne
  if (cara_je(VPRAVO) motor_run(150,0); // kdyz je cara vpravo, zatacim vpravo
  // zadny dalsi test tu uz nemam, takze kdyz nevidim caru, delam to posledni, co jsem delal predtim
}
V této "kostře" programu jsem využil funkce "init" a "motor_run", které jsou definované v "yellow_robot.h" (a "yellow_robot.c"), ale kromě toho jsou tam zatím neexistující názvy VLEVO, UPROSTRED, VPRAVO a funkce "initOPT" a "cara_je", které teprve budu muset napsat. Obvykle pak postupuju tak, že napíšu "prototypy" potřebných funkcí, které zpočátku nedělají vůbec nic (jen existují, aby se dal program přeložit) a ty postupně rozpracovávám, aby dělaly to, co od nich očekávám. Když by mi nějaká funkce připadala moc složitá, tak ji opět "rozdělím" na několik jednodušších pomocí stejného "top down" přístupu.

Programování by prostě podle mne mělo být přehledné a co nejjednodušší.

Chceš používat tento "top down" přístup, nebo preferuješ něco jiného? Dej vědět.

P.S.: Ano, zkratkou OPT označuju senzorový modul, protože je tak označen v dokumentaci na webu autorů Yrobota. Ten soubor se jmenuje "OPTmodul.pdf".
Naposledy upravil(a) AlesH dne 23 úno 2015, 21:36, celkem upraveno 2 x.
Baworek

Re: Yrobot

Příspěvek od Baworek »

V pohode hlavne že je to dobré a ide to :D

Nebudem riešiť _BV bo asi ma porazí...

To čo si mi sem hodil som skúsil no dal som to do robota a nešlo to tak je to jedno už to neriešme...


Síce sa v tom strácam lebo je tam veľa veľa vecí na ktoré pozerám ako keby som videl hieroglyfy :D
No musel by som mať v tom poriadok lebo už ani neviem kde mi hlava stojí...

To čo si dopísal akým spôsobom by si to navrhol algoritmus a tak alebo ako to vidíš...
Ja to nevidím :D v sebe vôbec :D až sa toho bojím čo to všetko treba ale rozumiem mu troška no neviem si prestaviť ako by som definoval
"VLEVO, UPROSTRED, VPRAVO a funkce "initOPT" a "cara_je" a kam to tam dopíšem do toho yellow_robot.c
Je tam moc neporiadku na mňa a vecí čo neviem čo je.. :D

To by si mi musel fakt strašne veľa vecí vysvetliť :D a časovo máš svoje veci a to sa nedá... Jednoduchšie mi to hodiť nejak lopatisticky aa nejak sa s toho vysomáriť musím... :D

Určite mi to vyhovuje má to svoju hlavu aj pätu a je to omnoho jednoduchšie ako to čo mám pred sebou z toho dema...
Tvoj postup by som bral teda :) "top_down"

A dik za OPT vysvetlenie už viem :D ...
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

OK, ten můj "tlačítkový kód" funguje jen pro stisknutí obou tlačítek najednou, takže to asi není dobrý příklad. Pojďme tedy jinam.

Pochopení, jak (a proč) definovat názvy (jako VLEVO), funkce a kam je napsat je jednou z nejdůležitějších věcí. Až Ti to bude jasné, budeš mít polovinu problémů za sebou.

Takže. Svůj nový název definuješ direktivou (příkazem) "#define <novy_nazev> <starsi_znamy_nazev>". Napsat to můžeš kamkoliv na začátek svého programu (před první použití toho nového názvu. Například "#define VLEVO 0" jen říká, že v programu všude místo čísla 0 můžeš používat název VLEVO. Jde jen o lepší čitelnost a přehlednost programu (a také o to, aby program případně nemusel být upravován na více místech pokud by došlo ke změně zapojení HW [pokud se něco změní, stačí to pak změnit na jediném místě u toho #define]). Nepiš to do "Led_Button.h", ale přímo na začátek svého programu (hned za případné #include direktivy).

Na "Led_Button.h" teď raději zapomeň, pro sledovače čáry se nám moc nehodí. Použijeme místo toho #include "yellow_robot.h" (protože je pro Yrobota mnohem užitečnější).

Direktiva #include "knihovna" v principu prostě vloží do tohoto místa Tvého programu celý obsah externího souboru "knihovna". Teď zatím neřeš co v tom souboru je, ale jen to, že se zařadí do Tvého programu. Pokud je v té "knihovně" nějaký další příkaz #include, tak se tam vkládají další a další soubory zřetězeně.

Chápeš #define a #include ? Pokud ne, nemůžeme ještě pokračovat.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Dobre teda už rozumiem čo je #define, #include :D

Už som si vytvoril projekt kde som si hodil #include "yellow_robot.h" a to čo si mi poslal ten navrch algoritmu...

Teraz listujem to "yellow_robot.h" pozerám že tam je miesto Vlevo,Pravo (left,right definované), to stačí prepísať na VLAVO,PRAVO ak dobre rozumiem ??
Popozeraj si to: :D
Obrázek

Potom som sa zastavil pri Uprostred,initOPT a čara_je ... :D
Rozumiem že to tam napíšem :D ale za aké slovo to nahradím? ...
Akurát ma napadá jedno mohlo by byť void initOPT(); ?? :D
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Ano, budeme muset sami napsat funkci "void initOPT()". Ještě předtím si ale musíš uvědomit tu podstatnou věc, že k souboru "yellow_robot.h" neoddělitelně patří i soubor "yellow_robot.c". Oba musíš mít v adresáři svého projektu a nesmíš je přejmenovat (.h soubor v tomto případě obsahuje jen "prototypy" funkcí, které jsou podrobně zapsané uvnitř .c souboru). Další důležitou věcí je to, že knihovna "yellow_robot" definuje názvy a funkce jen pro samotného Yrobota, bez OPT modulu.

Osobně bych k tomu přistoupil tak, že knihovnu "yellow_robot" nechám zcela bez změny (nebudu do ní nic nového připisovat ani v ní nic měnit), jenom z ní použiju ty definované názvy (jako např. LED_7, LED_8 nebo BEEP) a funkce (jako např. "motor_run"). Všechno ostatní potřebné napíšeme přímo do Tvého hlavního programu ("Robot_yellow.c"?).

Musíš ještě rozlišovat mezi názvy, definovanými pomocí #define a názvy proměnných, které jsou použity jako parametry funkcí (jako např. "void motor_run(i16 left, i16 right);" ... tam to "left" a "right" nejsou externě použitelné "názvy", ale jen interní označení proměnných, které používá ta funkce uvnitř). Pro nás to opět znamená, že do toho nebudeme hrabat a necháme to bez změny.

Na začátek Tvého hlavního programu rozhodně nesmíš zapomenout napsat:

Kód: Vybrat vše

#include "yellow_robot.h"
Tím bych s knihovnami skončil a zbytek bych napsal do Tvého programu. Musíš si uvědomit, že mnou navržené názvy VLEVO, VPRAVO a UPROSTRED se netýkají samotného těla robota, ale jen připojeného modulu OPT.

Pokud dobře chápu dokumentaci Yrobota, tak by ty názvy měly být definovány takto (je to vlastně další pokračování Tvého programu):

Kód: Vybrat vše

#define VLEVO PA0  // levy snimac cary je pripojen na pin PA0 (nazev PA0 je definovan nekde v <avr/io.h>)
#define UPROSTRED PA1  // stredni snimac cary je pripojen na pin PA1
#define VPRAVO PA2  // pravy snimac cary je pripojen na pin PA2
Aby šel navržený program přeložit, musíme ještě do kódu zapsat "minimální verze" těch navržených funkcí:

Kód: Vybrat vše

void initOPT(void) { // void znamena neco jako "nic" (tato funkce tedy nevraci zadnou navratovou hodnotu)
  // zatim ta funkce nedela vubec nic, ale pozdeji bude inicializovat porty a piny pro modul OPT
}

u8 cara_je(u8 snimac) {  // funkce musi vratit hodnotu 0 pokud cara neni pod snimacem "snimac"a 1 pokud cara je pod snimacem
  // tato funkce zatim take nedela nic, ale pozdeji bude vyhodnocovat stav snimace "snimac" a vracet hodnotu 0 nebo 1
  // u8 je zkratka pro "unsigned char", definovana v "int_def.h" (takze "int_def.h" take musi byt v adresari projektu)
}
Nejsem si jist, jestli definice těch nových funkcí mohou být až za hlavním programem ("main"), ale doufám, že ano, protože by to bylo přehlednější (z pohledu "top down"). Pokud to nepůjde na konci programu, tak ty funkce zapiš ještě před "main" část kódu.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ahoj.
Tak int_def.h som tam prihodil :)

Neviem či to dobre píšem to čo si mi už popísal no vždy to hodí 3 errory...

Kód: Vybrat vše

/*
 * Robot_yellow.c
 *
 * Created: 23.2.2015 17:44:09
 *  Author: Baworek
 */ 


#include "yellow_robot.h" // vlozeni HAL knihovny pro abstrakci od HW Yrobota

#define VLEVO PA0  // levy snimac cary je pripojen na pin PA0 (nazev PA0 je definovan nekde v <avr/io.h>)
#define UPROSTRED PA1  // stredni snimac cary je pripojen na pin PA1
#define VPRAVO PA2  // pravy snimac cary je pripojen na pin PA2

	void initOPT(void) { // void znamena neco jako "nic" (tato funkce tedy nevraci zadnou navratovou hodnotu)
		// zatim ta funkce nedela vubec nic, ale pozdeji bude inicializovat porty a piny pro modul OPT
	}

	u8 cara_je(u8 snimac) {  // funkce musi vratit hodnotu 0 pokud cara neni pod snimacem "snimac"a 1 pokud cara je pod snimacem
		// tato funkce zatim take nedela nic, ale pozdeji bude vyhodnocovat stav snimace "snimac" a vracet hodnotu 0 nebo 1
		// u8 je zkratka pro "unsigned char", definovana v "int_def.h" (takze "int_def.h" take musi byt v adresari projektu)
	}

int main(void)
{
	init(); // inicializace vseho potrebneho mimo OPT modul
	initOPT(); // inicializace OPT modulu

	motor_run(150,150);  // zacneme jizdou rovne

	while(1) 
	{ // zakladni nekonecna smycka
		if (cara_je(VLEVO) motor_run(0,150); // kdyz je cara vlevo, zatacim vlevo
		if (cara_je(UPROSTRED) motor_run(150,150); // kdyz je cara uprostred, jedu rovne
		if (cara_je(VPRAVO) motor_run(150,0); // kdyz je cara vpravo, zatacim vpravo
	// zadny dalsi test tu uz nemam, takze kdyz nevidim caru, delam to posledni, co jsem delal predtim
	}

}
Skúšal som dať "void initOPT a u8... hoci kde stále zobrazí 3errory :D
Obrázek
Do yellow_robot.h som dopísal void initOPT(); neviem či je to správne :) ?

Neviem čo je zle niečo mu vadí :D
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Jojo, "ladění" je běžná součást vývoje programů. Ty errory říkají, že tam chybí zavírací závorky u těch if. Jsou to prostě moje překlepy. Vždycky se musíš snažit přečíst a pochopit, co je u těch errorů napsáno (hlavně u toho prvního erroru).

Správně má být (všimni si těch dodatečných zavíracích závorek):

Kód: Vybrat vše

      if (cara_je(VLEVO)) motor_run(0,150); // kdyz je cara vlevo, zatacim vlevo
      if (cara_je(UPROSTRED)) motor_run(150,150); // kdyz je cara uprostred, jedu rovne
      if (cara_je(VPRAVO)) motor_run(150,0); // kdyz je cara vpravo, zatacim vpravo
Jinak nechápu, proč jsi něco psal do té knihovny "yellow_robot.h", když jsem jasně uváděl, že do ní nebudeme vůbec hrabat. Prosím, nezkoušej věci "naslepo". Takový přístup přináší víc problémů než řešení.

P.S.: Ještě je tam nějaký "warning" kterému zatím moc nerozumím, ale to vyřešíme později. "Warning" by neměl vadit úspěšnému přeložení a chodu programu.
Edit: už asi vím, o co jde. Tomu "warningu" vadí, že funkce "cara_je" teď nevrací žádnou hodnotu, i když by měla. Jako rychlé řešení můžeme na konec funkce "cara_je" dát řádek " return 0;". Pak ta funkce zatím vždycky vrátí nulu (0), tedy jako že čáru nevidí.

P.S.2: Pokud se to podaří přeložit, tak si ještě před nahráním do Yrobota uvědom, co vlastně bude teď ten program dělat. Můžeš to popsat před reálnou zkouškou v Yrobotu? Co můžeme udělat pro to, aby program byl pro robota bezpečnější a přitom bylo vidět, že program pracuje?
Odpovědět