Problem with comparison.
/Designs/ROBOTS/Camerus/htm/video/1.wmv |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/video/2.wmv |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/video/3.wmv |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/index.htm |
---|
0,0 → 1,450 |
<html> |
<head> |
<meta http-equiv="Content-Language" content="cs"> |
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> |
<title>Camerus</title> |
</head> |
<body> |
<p align="center"><font face="Arial"><font size="7">Robot CAMERUS<br> |
</font><font size="4">Jak se dělá robot na IstRobot<br> |
</font><br> |
<a href="mailto:kaklik@mlab.cz">kaklik@mlab.cz</a>; <a href="mailto:kakl@i.cz"> |
kakl@i.cz</a><br> |
</font></p> |
<p align="center"><a href="pic/image001.jpg"> |
<img border="0" src="pic/image001_small.jpg" xthumbnail-orig-image="pic/image001.jpg"></a></p> |
<p align="left"><font face="Times New Roman">Tato dokumentace popisuje konstrukci robota |
Camerus, který byl zkonstruován pro soutě IstRobot pro kategorii Stopár (<a href="http://www.robotika.sk/contest/">http://www.robotika.sk/contest/</a>). |
<br> |
<br> |
Snaili jsme se technickou dokumentaci pojmout poněkud netradičně. Kromě |
popisu finální verze robota zde naleznete chronologický popis jeho vývoje a |
popis vech slepých uliček. Doufáme, e takováto forma dokumentace bude mít pro |
nae následovníky větí hodnotu ne pouhý návod na zopakování konstrukce.<br> |
</font></p> |
<p align="left"><font face="Times New Roman" size="4"><b>Robot 3Orbis</b></font></p> |
<p align="left"><font face="Times New Roman"><span lang="cs">Vývoj robota Camerus začal před více jak dvěma roky vývojem |
robota 3Orbis. Robot 3Orbis měl mít novou revoluční koncepci podvozku. Pouili |
jsme tříkolý podvozek, který měl dvě hnaná kola, kadé s nezávislým motorem a |
třetí kolo, které mělo řízené zatáčení. Jednalo se tedy o nonholonomní podvozek. |
Koncepci podvozku jsme nejdříve ověřovali se dvěma senzory na čáru, jako to měly |
nai předchozí holonomní roboti. To moc nefungovalo a proto jsme přidali dalí |
senzory, pomocí kterých se diskrétně nastavoval úhel zatáčecího kolečka.</span></font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image003.jpg"> |
<img border="0" src="pic/image003_small.jpg" xthumbnail-orig-image="pic/image003.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Ob<span lang="en-us">r.</span>1: První pokusy s tříkolým a třímotorovým robotem<br> |
<br> |
<a href="pic/image005.jpg"> |
<img border="0" src="pic/image005_small.jpg" xthumbnail-orig-image="pic/image005.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 2: Baterie senzorů na čáru</font></p> |
<p align="left"><font face="Times New Roman"><br> |
Přidáním dalích senzorů na čáru jsme se dostali do problémů s počtem vstupů |
pouitého procesoru (PIC16F88). Tento problém jsme vyřeili tak, e jsme na |
zpracování signálů ze senzorů na čáru pouili dalí samostatný procesor. Toto |
řeení se vak později neukázalo jako výhodné, protoe ladit distribuovaný kód |
bylo řádově obtínějí a navíc se musela naprogramovat komunikace mezi procesory. |
Často se nám také stávalo, e jsme během vývoje do jednoho procesoru nahráli kód |
pro druhý procesor, co kupodivu občas trvalo určitou dobu, ne jsme na to |
přili.<br> |
</font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image007.jpg"> |
<img border="0" src="pic/image007_small.jpg" xthumbnail-orig-image="pic/image007.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">. </span>3: Přední náhon; přidáno druhé patro na |
elektroniku<br> |
</font></p> |
<p align="left"><font face="Times New Roman">Původní koncepce předpokládala hnaná kola vpředu a zatáčecí kolo vzadu. |
Modelářské servo vak nedokázalo dostatečně rychle zatáčet, přestoe bylo |
zpřevodováno do rychla převodem 1:2. Změnili jsme proto uspořádání na hnanou |
nápravu vzadu a zatáčecí kolečko vpředu. To nám umoňovalo ostře řezat zatáčky, |
ale objevily se dalí problémy. Podvozek se v zatáčkách dostával do smyku a |
protoe hmotnost čidel byla nezanedbatelná, docházelo i k jeho naklápění a |
následně k falenému signálu z čidel, protoe čidla nebyla drena v konstantní |
vzdálenosti od povrchu.<br> |
<br> |
Pro 3Orbise byla vysoustruena duralová kola, pro která bylo plánováno obutí O |
krouky. To se pak ukázalo jako nepouitelné. O krouky se nedokázaly udret |
v drákách na kolech. Původní kola byla tedy nahrazena plastovými z dětské |
hračky. Kola měla mení průměr, co zlepilo převodový poměr, který byl pro |
vyrobené převodovky 5:1. Jako obutí byly pouity ustřiené prsty z latexových |
rukavic pro domácnost. Jako obutí zatáčecího kolečka bylo pouito pryové |
těsnění 12x10x2. Na zatáčecí kolečko bylo obuto tak, e se jelo po hraně těsnění.</font></p> |
<p align="center"><font face="Times New Roman"> |
<br> |
<a href="pic/image009.jpg"> |
<img border="0" src="pic/image009_small.jpg" xthumbnail-orig-image="pic/image009.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 4: Robot 3Orbis. Zadní náhon a mení kolečka z autobusu |
od syna pana Hronka.<br> |
Je vidět čidlo na hledání hrany cihly.</font></p> |
<p align="left"><font face="Times New Roman"><br> |
Pro detekci a objídění cihly byly na robotovi namontovány IR senzory. Jeden měl |
detekovat překáku na dráze a zbylé dva měly slouit pro její objetí. Objetí |
cihly pomocí IR senzorů jsme vak nedokázali odladit. Objídění nebylo |
spolehlivé a tak robot nakonec objíděl cihlu naslepo. <br> |
Při soutěi se objevil nečekaný problém, kvůli kterému robot nakonec nedojel. |
Soutění dráha je tvořena dvěma deskami. Desky nejsou dokonale slícovány a tak |
mezi nimi vzniká tmavá mezera. Tato mezera byla na soutění dráze přelepena |
bílou lepicí páskou. Bohuel čidla na čáru, které robot pouíval, vyhodnocovala |
bílou lepicí pásku jako černou (čidla pracují blízko ultrafialové oblasti). |
Tento problém by el kompenzovat programově, ale na soutěi se nepodařilo |
program v časové tísni správně upravit. Robot tedy nakonec nedojel.<br> |
<br> |
Odhadovali jsme, e nám chyběl tak týden na odladění firmware, protoe v roce |
2006 u nás byla povodeň a ztratili jsme tak nejméně jeden měsíc večerů na |
programování. Nyní s odstupem času vidíme, e co se týká objetí cihly, chybělo |
mnohem více.<br> |
</font></p> |
<p align="left"><font face="Times New Roman" size="4"><b>Robot Laserus</b></font></p> |
<p align="left"><font face="Times New Roman">Dalí verzí robota se shodným podvozkem byl robot Laserus. Snahou bylo odstranit |
těká čidla předsunutá před robota a tak odstranit překlápění v ostrých |
zatáčkách. Řeením by bylo zvětení dosahu čidel na čáru tak, aby mohla být |
umístěna co nejblíe k ose otáčení robota. Zároveň by se tím sníila obvodová |
setrvačná hmotnost robota. Znovu jsme pouili tříkolý podvozek s jedním řízeným |
zatáčecím kolečkem, přestoe na IstRobotu 2006 byla tato konfigurace diskutována |
a autoři druhého robota s podobnou koncepcí se v diskusi vyjádřili, e to nebyl |
dobrý nápad, e robot při větích rychlostech má snahu se rozkmitávat. Řeení |
tohoto problému jsme viděli ve zjemnění snímání čáry tak, aby se precizněji |
nastavovalo zatáčecí kolečko.<span lang="en-us"> </span>Napadlo nás pouít laserovou čtečku čárového kódu a skutečně jsme postavili |
funkčního robota (viz Obrázek 5), který dokázal, ale pomalu, jezdit po čáře. </font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image011.jpg"> |
<img border="0" src="pic/image011_small.jpg" xthumbnail-orig-image="pic/image011.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 5: Robot Laserus. |
Na obrázku je vidět červená stopa LASERu.</font></p> |
<p align="left"><font face="Times New Roman"> <br> |
Problémy s touto konstrukcí byly dva. Pokud byl na dráze hrbol, tak se v důsledku |
vibrací zmenil rozkmit laseru, protoe laser je ve čtecím zařízení rozmítáván |
mechanicky zrcátkem, které vibruje a velké stranové zrychlení při přejetí hrbolu |
způsobovalo, e elektromagnetický mechanismus, který pohybuje zrcátkem vypadl z rezonance. |
Tento problém by ovem zřejmě lo kompenzovat softwarem, protoe se čára četla |
v obou směrech pohybu zrcátka. Jednou jsme tedy dostali polohu čáry měřenou z |
leva a jednou z prava.<br> |
<br> |
Druhý problém byl závanějí. Protoe bylo pouito zařízení na čtení čárového |
kódu, snímali jsme vlastně polohu jedné čáry ve scanovaném prostoru. V prudké |
zatáčce vak dochází k tomu, e čáru vidí snímač ikmo a tak se relativně |
zvětuje její tlouťka. Vnitřní elektronika snímače vyhodnotila tento stav, jako |
e se nejedná o čárový kód a čáru vyfiltrovala. To samozřejmě mělo v ostré |
zatáčce fatální následky. Dále jsme touto cestou nepokračovali, přesto, e víme, |
e v závodě DARPA se často pouívají laserové dálkoměry. Na soutěních vozech je |
vak vidět, e konstruktéři také mají problémy s odtlumením vibrací.<br> |
</font></p> |
<p align="left"><font face="Times New Roman" size="4"><b>Robot Camerus</b></font></p> |
<p align="left"><font face="Times New Roman">Znovu se vynořil nápad, pouít pro snímání čáry kameru. To u nás napadlo |
několikrát, ale kdy jsme nápad analyzovali, vdy se ukázalo, e jednoduchým |
jednočipovým mikropočítačem nelze zpracovávat obraz kamery. Druhým problémem je, |
e běně dostupné kamery mají snímkový kmitočet 50Hz, co se nám zdálo na |
snímání čáry pomalé.<span lang="en-us"> </span>Přesto jsme zakoupili jednu kameru a začali jsme osciloskopem testovat, co tak |
kamera vidí a jak by se to dalo zpracovat. Kupodivu jsme zjistili, e s procesorem |
na 20MHz stíháme načíst jeden obrazový řádek asi s polovičním rozliením. To |
bylo povzbudivé a zaměřili jsme se tímto směrem.<br> |
Druhým problémem bylo, e kamera nesnímá kontrastní obraz. Jak se vypořádat v jednočipovém |
počítači s tímto problémem, kdy jeho výpočetní výkon stačí sotva na načtení |
řádku a jetě se musí počítat regulace pro elektronický diferenciál? (Pro |
zvolenou koncepci podvozku je nutné diferencovat otáčky motorů na hnaných |
nápravách.)<br> |
<br> |
Problém jsme vyřeili něčím, čemu jsme pracovně začali říkat digitální |
komparátor. Jednodue jsme pomocí logických hradel provedli OR třech nejvyích |
bitů jasového signálu z kamery. Vechno co bylo pod 0x1F bylo tedy černé a |
vechno nad bylo bílé. Expozici kamery pak bylo nutné nastavit tak, aby |
nejsvětlejí černá čára, byla jetě černá. To se udělalo snadno osciloskopem, |
ale pro závod bylo nutné vyvinout nějakou strategii, jak robot provede určení |
expozice. Řeením byla rutina Expozimetr, která postupně zvyuje expoziční čas |
a hledá ve snímku (samozřejmě, e v naem případě na jedné řádce) čáru |
definované tlouťky. Vychází se z toho, e nejdříve při podexponování je černý |
celý obrázek, pak se postupně obrázek vyjasňuje, co je ovem díky chybě |
apertury objektivu nerovnoměrné. Dalím zvyováním času expozice se nakonec |
objeví čára správné tlouťky, ta se pak dále ztenčuje a nakonec je snímek |
přepálen a čára zmizí. Samozřejmě se předpokládalo, e na startu robot čáru vidí |
a ta je před ním přiblině uprostřed. <br> |
<br> |
První pokusy vypadaly velmi optimisticky, robot se drel čáry a vyjel jenom |
občas. Zajímavé bylo, e robot dokázal jezdit jenom po dráze, kde nebyly zatáčky |
doleva! Protoe jsme neměli k dispozici obraz z kamery, aby bylo moné |
zkontrolovat co kamera vidí, bylo nutné tento problém řeit pouhou úvahou. |
Napadlo nás, e můe docházet k vytrhávání obrazu na krajích snímku. |
Kompenzovalo se to tím, e se zahazovaly okraje řádku a skutečně to pomohlo, |
robot spolehlivě, i kdy pomalu, sledoval čáru. To byl velký úspěch, protoe |
kdyby nám někdo řekl před rokem, e to s kamerou a jednočipovým počítačem jde, a |
e je to spolehlivé, asi by jsme mu nevěřili.<br> |
<br> |
Po prvotních úspěích jsme zkusili zrychlit jene to nefungovalo, robot vdy |
vypadl z dráhy, kdy se zatáčecí kolečko otočilo o velký úhel. Napadlo nás, e |
to můe být způsobeno proudovými pičkami, které způsobuje motor serva. Pro |
stabilizaci napájení pro elektroniku byl toti pouit lineární stabilizátor s velkým |
drop-outem. Proto jsme vyvinuli měnič, který i při poklesu napětí baterií o 2V |
dokázal udret napětí pro řídící elektroniku a zejména kameru stabilní. Po tomto |
vylepení u robot dosahoval poměrně sluné rychlosti a nejzajímavějí bylo, e |
díky velké rozliovací schopnosti kamery (procesor dokázal rozliit asi 50 |
bodů) byla jízda v zatáčkách velmi plynulá.<br> |
<br> |
Problém s tmou v tunelu byl vyřeen jednodue tak, e si robot celou cestu |
svítil. Na osvětlení dráhy byly pouity červené LED. Nevíme, jaká barva pro |
osvětlení dráhy je nejlepí, eventuelně, jestli je lepí svítit bíle. S tím jsme |
u nestihli před soutěí experimentovat.<br> |
<br> |
Protoe pouitý procesor PIC16F876A neumí násobit a vůbec jeho výpočetní výkon |
není omračující (kdybychom ho ale měli před lety, tak by jsme si určitě |
nestěovali), byl celkem problém naprogramovat elektronický diferenciál na |
hnanou nápravu. Nakonec se to vyřeilo procedurou jakonásobení, která |
kombinací rotací a podmíněného sčítání provádí rychle potřebný výpočet s uspokojivou |
přesností.</font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image013.jpg"> |
<img border="0" src="pic/image013_small.jpg" xthumbnail-orig-image="pic/image013.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 6: Měnič v krabičce od čaje a primitivní |
osvětlení dráhy.<br> |
</font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image015.jpg"> |
<img border="0" src="pic/image015_small.jpg" xthumbnail-orig-image="pic/image015.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 7: Robot, přítel člověka.</font></p> |
<p align="left"><font face="Times New Roman">Začali jsme tedy testovat pro sledování čáry asi nejobtínějí věc, dlouhou |
rovinku a na konci pravoúhlou zatáčku. Při dalím zvyování rychlosti začal |
robot v takové zatáčce vypadávat. Ne, e by přímo vyjel a nevrátil se na dráhu, |
ale poloměr zatáčení byl mení ne poloměr zatáčky a hrozilo tedy, e v Bratislavě |
spadne ze stolu. Udělali jsme předpoklad, e je to způsobeno pomalým snímkovým |
kmitočtem kamery, ne si robot stačil vimnout, e je zatáčka ostrá, zmizela mu |
čára ze zorného pole.<br> |
<br> |
Dalím problémem bylo, e pokud bylo nerovnoměrné osvětlení dráhy, vypadával |
kameře obraz. Kamera má sice AGC, ale samozřejmě, e je schopna kompenzovat |
rozdíly jasu jenom v určitých mezích. Kupodivu nebyl problém v tunelu, kde si |
robot svítí, ale velký problém byl s denním světlem, pokud přicházelo pouze z jednoho |
směru.<br> |
<br> |
Konstrukční řeení, které následovalo, bylo doplnění dvou modrých čidel po |
stranách robota na sledování čáry. Čidla byla umístěna tak, e viděla čáru, a |
kdy čára byla mimo zorné pole kamery a uplatňovala se pouze v případě, e |
kamera čáru nevidí. To velmi zvýilo spolehlivost sledování čáry. Zároveň jsme |
tato čidla pouili pro opětovné vyhledání čáry po objetí cihly, protoe jsme se |
báli pro tento úkol pouít kameru, protoe po dobu objídění cihly kamera nevidí |
kontrastní obrázek (nevidí čáru) a díky AGC by mohla zaznamenat stín nebo pínu |
na trati jako čáru. <br> |
<br> |
Na objídění cihly byl robot Camerus vybaven odometrií na pravém kole. Vyuili |
jsme otvorů ve větím kole převodovky a IR závory z tiskárny. Citlivost |
o<span lang="en-us">d</span>ometrie nebyla velká (4 impulzy na jednu otáčku kolečka (12,6mm)).<br> |
</font></p> |
<p align="left"><b><font face="Times New Roman" size="4">Jak jsme jeli ladit do Vídně</font></b></p> |
<p align="left"><font face="Times New Roman">Ve potřebné bylo naprogramováno, robot sledoval čáru. Přeruení nedělalo |
problémy, prostě byl výpadek obrazu a robot pokračoval v původním směru před |
přeruením. Cihla byla řeena pomocí odometrie. Takto vybaveni jsme odjeli do |
Vídně na Robot Challenge 2007. Řekli jsme si, e to tam odladíme, protoe jsou |
tam jednoduí podmínky ne v Bratislavě (alespoň na první pohled, robot můe |
být větí a tunel je také větí, take robot nemusí jet tak přesně).<br> |
<br> |
Rozhodnutí ladit robota na Robot Challenge se ukázalo jako správné. Podmínky |
toti byly náročné. Bodové osvětlení, dráha sloená z desek s mezerami, styl |
soutěe play-off.<br> |
<br> |
Camerus určitě jezdil nejrychleji, ale nedokázal objet cihlu! Jednou se stalo, |
e uviděl mezeru mezi deskami, podruhé mu zřejmě proklouzlo kolečko s odometrií, |
prostě katastrofa! Alespoň, e byl třetí v paralelním slalomu, to jsme mu ale |
zavinili my, protoe jsme mu při zkouení objetí cihly stáhli výkon motorů a pak |
jsme na to zapomněli. Za třetí místo tedy nemohl robot, ale lidský faktor.<br> |
<br> |
</font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image017.jpg"> |
<img border="0" src="pic/image017_small.jpg" xthumbnail-orig-image="pic/image017.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 8: Robot Challenge 2007, Parallel Slalom. Robot |
Camerus na dráze číslo 1. Na dráze jsou patrné stíny od bodového osvětlení.<br> |
</font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image019.jpg"> |
<img border="0" src="pic/image019_small.jpg" xthumbnail-orig-image="pic/image019.jpg"></a><span lang="en-us"> |
</span><a href="pic/P3180028.JPG"> |
<img border="0" src="pic/P3180028_small.JPG" xthumbnail-orig-image="pic/P3180028.JPG"></a><br> |
<br> |
Obr<span lang="en-us">.</span> 9: Robot Camerus na Robot Challenge 2007. Robot |
nemá dostatek čidel na bezpečné objetí překáky.<br> |
</font></p> |
<p align="left"><font face="Times New Roman">Jednoznačně se ukázalo, e objídět překáku naslepo není dobrá strategie a |
zejména, pokud je odometrie na hnané nápravě.<br> |
</font></p> |
<p align="left"><font face="Times New Roman" size="4"><b>Co s cihlou?</b></font></p> |
<p align="left"><font face="Times New Roman">Dalí vývoj jsme věnovali objídění cihly za pomoci čidel. Jaká čidla ale pouít? |
Měli jsme patné zkuenosti s IR čidly s 3Orbise a roboty s ultrazvukem jsme |
zase na minulých ročnících viděli, e si spletli tunel s cihlou, případně |
neviděli cihlu, pokud se k ní blíili zeikma.<br> |
<br> |
Nevěděli jsme co s tím a tak jsme začali zkouet. Měřili jsme, co vidí |
ultrazvuk a co různá optická čidla. Při měření se ukázaly vechny předpokládané |
problémy. Ultrazvuk vidí kde co, jenom ne cihlu, kdy je ikmo. IR snímač vidí |
cihlu sice spolehlivě, ale stejně dobře jako velkou bílou zeď několik metrů |
daleko. Nakonec byla pro cihlu zvolena kombinace sedmi senzorů. Skutečně čtete |
dobře, sedmi! Jeden IR senzor vpředu na detekci přiblíení se k cihle. Funguje |
na principu triangulace. IR vysílací dioda má úzkou hliníkovou trubičkou zúen |
paprsek, aby nedocházelo k jeho integraci na velké vzdálené ploe. Dalí dva |
senzory jsou mikrospínače na mechanickém nárazníku, kdyby se stalo, e |
triangulační čidlo cihlu přehlédne. To se můe stát v prudké zatáčce. Z boku |
jsou pak ultrazvukový senzor a dálkoměr s červenou LED. Tyto čidla udrují |
konstantní vzdálenost od cihly při jejím objídění. K tomu jetě ji zmíněná |
odometrie na pravém kolečku, která zajiťuje prudkou zatáčku doleva jakmile je |
cihla detekována a nakonec kompas, který zabraňuje, aby se robot vracel zpět po |
trati (to se můe stát, protoe mezi předním čidlem a bočními čidly je slepý |
úhel).<br> |
<br> |
Přidání dalích čidel se neobelo bez konstrukčních problémů. Boční LED čidlo se |
ukázalo jako málo citlivé a bylo to zřejmě způsobeno tím, e se jedná o |
průmyslové čidlo, které je normálně napájeno napětím 12 a 48V. S naím |
napájecím napětím 7,2V a to jetě občas, nebylo moc spokojeno. Byl tady přidán |
dalí měnič nahoru na 12V. Byl pouit měnič ze staré síťové karty.</font></p> |
<p align="left"><font face="Times New Roman">Samostatným konstrukčním problémem |
bylo umístění kompasu. Nakonec musel být kompas umístěn nad vechny desky s |
elektronikou a musel být orientován tak, aby čidla byla pod úhlem 45<span lang="en">° |
k </span>ose robota.<span lang="en"> Pokud byla čidla v ose robota, byl kompas |
ovlivňován zbytkovým magnetickým polem v kovových (zejména elezných) částech |
robota.</span><br> |
</font></p> |
<p align="left"><font face="Times New Roman" size="4"><b>Poslední weekend před soutěí</b></font></p> |
<p align="left"><font face="Times New Roman">Přidání kompasu na I2C sběrnici si vyádalo přeadresaci kamery, protoe kamera a |
kompas měly na I2C sběrnici stejnou adresu a adresa kompasu se nedala změnit. To |
kupodivu byl velký problém, který jsme u řeili poslední weekend před soutěí a |
vynutil si tak zásadní zásah jako rozebrání objektivu kamery, co znamenalo |
pečlivé čitění pouzdra čipu kamery, protoe případné smítko na pouzdře čipu by |
mělo při soutěi fatální následky. Čip kamery sice přeadresaci umí, ale bylo |
nutné připojit vývod MULT (47) na <span lang="en-us">log_1 </span>a na to kupodivu na ploném spoji kamery |
nebylo pamatováno, přesto, e na ploném spoji jsou ploky na odpory, které |
umoňují změnu adresy.<br> |
</font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image021.jpg"> |
<img border="0" src="pic/image021_small.jpg" xthumbnail-orig-image="pic/image021.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 10: Propojka na PCB kamery umoňující její |
přeadresaci.<br> |
</font></p> |
<p align="left"><font face="Times New Roman">Poslední weekend před soutěí nás napadlo jetě jednou projít seznam problémů, |
které jsme si poznamenali v průběhu loňské soutěe. Hned na začátku tam bylo: Zkontrolovat, |
jestli neprokluzují kolečka na hřídeli. Prokluzovaly. Zkusili jsme je přilepit |
anaerobním lepidlem. Výsledek byl, e se zalepily hřídelky do loisek a kolečka |
prokluzovala dál. Zkusili jsme je přilepit epoxidem. Nanetěstí nám trochu |
epoxidu zřejmě nateklo do loisek a kolečka se zase utrhla. Poslední weekend |
před soutěí jsme tedy měli zatuhlé převodovky a kolečka prokluzovala. Snaili |
jsme se do hřídelek vyvrtat dírky a dát tam kolík, ale vrták vůbec nitridovanou |
ocel z CD mechanik nebral. Nakonec jsme do hřídelek pouze vypilovali dráky a |
opět jsme je zalili epoxidem. Jestli neprokluzují, jsme pro jistotu u |
nezkoueli.<br> |
<br> |
Jetě bylo nutné znovu zaběhnout převodovky, to jsme dělali přes noc z pondělí |
na úterý (IstRobot bývá ve středu a my tam obvykle jedeme v úterý dopoledne). |
Motory se točily do rána do poslední chvíle před naloením robota do auta.<br> |
</font></p> |
<p align="left"><font face="Times New Roman" size="4"><b>Noc před soutěí</b></font></p> |
<p align="left"><font face="Times New Roman">Kdyby nebylo poslední noci, tak není ádný projekt dokončen. Odpoledne jsme |
přijeli do Bratislavy na ubytovnu, rozloili dráhy a začali ladit poslední řádky |
programu. V naem případě to mělo být zpracování logu z jízdy.<br> |
<br> |
A vůbec to nejezdilo. Robot měl malý výkon v levotočivé zatáčce, při objídění |
cihly se dokonce občas zastavil. No jasně, řekli jsme si, jsou stále zatuhlé |
převodovky, změnili jsme pár konstant v programu a jak tak to zase jezdilo. |
Situace se ale o půlnoci zase zhorila a začal smrdět H-můstek. Vyměnili jsme |
tedy H-můstek a nepomohlo to. Vyměnili jsme tedy motor a pomohlo to! Prostě jsme |
neustálým laděním programu a zkouením zničili jeden motor! Vrátili jsme tedy do |
robota původní H-můstek (asi tak v jednu hodinu ráno) a zase to nejelo. Měřením |
jsme pak zjistili dvě věci, jednak byly přes pájecí lak odizolovány zemnící |
rouby na ploném spoji H-můstku a tak vechen proud tekl přes hřebínkový |
konektor a pak tam jetě byl zkrat přes jeden tranzistor H-můstku, take jeden |
motor nereverzoval. Představte si, e tyto závady byly vykompenzovány |
regulátorem v software a e s nimi byl Camerus na Robot Challenge třetí!<br> |
<br> |
Pak u jenom stačilo doprogramovat tu logovací proceduru (přepisovala paměť). A |
kolem páté hodiny ranní byl robot připraven na soutě.<br> |
</font></p> |
<p align="left"><font face="Times New Roman" size="4"><b>IstRobot 2007</b></font></p> |
<p align="left"><font face="Times New Roman">IstRobot 2007 nás skutečně překvapil, byla na něm z naeho pohledu nejsloitějí |
dráha, jakou jsme kdy viděli. Extrémně dlouhé přeruení, navíc v inflexním bodě |
(to nás vůbec nenapadlo, e je moné), cihla hned za pravoúhlou zatáčkou (sotva |
robot vyjede ze zatáčky, bác, a je tu cihla), viz Obrázek 11. </font></p> |
<p align="left"> </p> |
<p align="center"><font face="Times New Roman"><a href="pic/image023.jpg"> |
<img border="0" src="pic/image023_small.jpg" xthumbnail-orig-image="pic/image023.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span> 11: IstRobot 2007 tvar dráhy.</font></p> |
<p align="left"><font face="Times New Roman">Potenciálním problémem byly |
magnetické stojánky na kterých stály čidla časomíry. Magnetické pole nad dráhou |
bylo díky nim značně nehomogenní (stojánek na Obr. 11 vlevo dole a dva stojánky |
na startu). Robot vyuíval kompas pouze u cihly, a zřejmě byl stojánek |
dostatečně daleko/blízko, e nakonec nevadil. Údaje z kompasu se zpracovávaly |
diferenčně, take nevadilo, e byla díky stojánkům odchylka v celkové orientaci |
magnetického pole Země, podstatné bylo, aby nedocházelo k velkým zakřivením pole |
v oblasti cihly. K čemu, jak jsme změřili, částečně docházelo, ale software se |
s tím vypořádal, kdy váil údaje ze vech čidel při objídění překáky.</font></p> |
<p align="left"><font face="Times New Roman">Obtínost trati se |
ukázala hned v první jízdě, Camerus vypadnul na přeruení. V druhé jízdě jsme |
sníili výkon motorů, zde ale zase hrozilo, e se robot nerozjede, pokud někde (například |
při objídění cihly) výrazně zpomalí. Robot jel plynuleji, přesto vyjel v přeruení |
(to dá rozum, protoe kopíroval tvar dráhy před přeruením), vyhnul se tunelu, |
znovu nael dráhu (to fungovalo dobře) a na podruhé projel. Byl to úspěch, ale |
velká časová ztráta a navíc si robot patně zapamatoval dráhu pro dalí jízdu, |
protoe bloudil.</font></p> |
<p align="left"><font face="Times New Roman">Programovali jsme místo oběda a nakonec jsme to přeruení vyřeili. Prostě jsme |
zohlednili, e dráha za přeruením můe pokračovat i na druhou stranu. Zní to |
jednodue, ale úprava programu nebyla tak jednoduchá, viz soutění verzi |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Designs/ROBOTS/Camerus/sw/#_Designs_ROBOTS_Camerus_sw_">firmware</a>.</font></p> |
<p align="left"><font face="Times New Roman">Finálová jízda proběhla bez |
problémů, robot sice jel na méně jak polovinu regulačního rozsahu a bez naeho |
zásahu by se s dráhou dobře nevypořádal, ale jsme rádi, e dojel a nakonec |
stejně za to nemohl robot, ale my, e jsme mu naprogramovali, e dráha za |
přeruením nemůe vést na druhou stranu. Nakonec se podařilo s robotem s časem |
12,5s udělat rekord trati <span lang="en-us">;-)</span><br> |
</font></p> |
<p align="center"><font face="Times New Roman"><a href="pic/image025.jpg"> |
<img border="0" src="pic/image025_small.jpg" xthumbnail-orig-image="pic/image025.jpg"></a></font></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">.</span>12: Robot Camerus - finální verze robota.<br> |
<br> |
</font></p> |
<p align="center"><a href="pic/index.2.gif"> |
<img border="0" src="pic/index.1.gif" xthumbnail-orig-image="pic/index.2.gif"></a></p> |
<p align="center"><font face="Times New Roman">Obr<span lang="en-us">. </span>13: Blokové schéma propojení modulů robota.<br> |
</font></p> |
<p align="left"><font face="Arial">Desky ploných spojů a popis jednotlivých modulů robota naleznete na |
<a href="http://www.mlab.cz/">http://www.mlab.cz/</a> |
.<br> |
</font></p> |
<p align="left"><font face="Arial">Deska procesoru<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/PIC16F87x/#_Modules_PIC16F87x_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FPIC16F87x%2F#_Modules_PIC16F87x_</a> |
<br> |
</font></p> |
<p align="left"><font face="Arial">H-můstky<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/HBRIDGE/#_Modules_HBRIDGE_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FHBRIDGE%2F#_Modules_HBRIDGE_</a> |
<br> |
</font></p> |
<p align="left"><font face="Arial">LEDbar<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/LEDbar/#_Modules_LEDbar_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FLEDbar%2F#_Modules_LEDbar_</a><br> |
</font></p> |
<p align="left"><font face="Arial">Měnič<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/PowerSupply/BATPOWER02A/#_Modules_PowerSupply_BATPOWER02A_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FPowerSupply%2FBATPOWER02A%2F#_Modules_PowerSupply_BATPOWER02A_</a><br> |
</font></p> |
<p align="left"><font face="Arial">IR modulátor<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/TXIR/#_Modules_TXIR_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FTXIR%2F#_Modules_TXIR_</a><br> |
</font></p> |
<p align="left"><font face="Arial">Osvětlení dráhy<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Designs/ROBOTS/Camerus/LEDpanel/#_Designs_ROBOTS_Camerus_LEDpanel_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FDesigns%2FROBOTS%2FCamerus%2FLEDpanel%2F#_Designs_ROBOTS_Camerus_LEDpanel_</a></font><br> |
</p> |
<p align="left"><font face="Arial">Univerzálka pro 7432<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/UNI/UNIDIL1601A/#_Modules_UNI_UNIDIL1601A_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FUNI%2FUNIDIL1601A%2F#_Modules_UNI_UNIDIL1601A_</a><br> |
</font></p> |
<p align="left"><font face="Arial">Trimry<br> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/TRIMQUAD01A/#_Modules_TRIMQUAD01A_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FTRIMQUAD01A%2F#_Modules_TRIMQUAD01A_</a><br> |
</font></p> |
<p align="left"><font face="Arial">Dokumentace k pouitému kamerovému čipu je na |
<a href="http://www.cmucam.org/attachment/wiki/Documentation/OV6620.PDF">http://www.cmucam.org/attachment/wiki/Documentation/OV6620.PDF</a> |
.<br> |
</font></p> |
<p align="left"><font face="Arial">Dokumentace k US senzoru je na |
<a href="http://www.robot-electronics.co.uk/htm/srf08tech.shtml">http://www.robot-electronics.co.uk/htm/srf08tech.shtml</a> .<br> |
</font></p> |
<p align="left"><font face="Arial">Dokumentace ke kompasu je na<span lang="en-us"> |
</span><a href="http://www.robot-electronics.co.uk/htm/cmps3doc.shtml">http://www.robot-electronics.co.uk/htm/cmps3doc.shtml</a> .<br> |
</font></p> |
<p align="left"><font face="Arial">Dokumentace k robotu 3Orbis, ze kterého Camerus vyel, je na<span lang="en-us"> |
</span> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Designs/ROBOTS/3Orbis/#_Designs_ROBOTS_3Orbis_">http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FDesigns%2FROBOTS%2F3Orbis%2F#_Designs_ROBOTS_3Orbis_</a> |
.</font></p> |
<p align="left"><font face="Arial"><span lang="en-us">Videoz</span>áznam, jak |
Camerus jezdil při soutěi IstRobot 2007:<br> |
<a href="video/1.wmv">1. jízda</a>, <a href="video/2.wmv">2. jízda</a>, |
<a href="video/3.wmv">3. jízda</a>.</font></p> |
</body> |
</html> |
/Designs/ROBOTS/Camerus/htm/pic/P3180028.JPG |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/P3180028_small.JPG |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image001.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image001_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image002.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image003.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image003_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image004.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image005.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image005_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image007.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image007_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image009.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image009_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image011.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image011_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image013.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image013_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image015.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image015_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image017.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image017_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image019.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image019_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image021.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image021_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image023.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image023_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image025.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image025_small.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/image027.gif |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/index.1.gif |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/htm/pic/index.2.gif |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/LEDpanel/SCH/LEDpanel.pdf |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/LEDpanel/SCH/LEDPANEL.DSN |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/LEDpanel/CAM_AMA/BOARD.pdf |
---|
0,0 → 1,159 |
%PDF-1.3 |
%Çì¢ |
5 0 obj |
<</Length 6 0 R/Filter /FlateDecode>> |
stream |
+óIrÐJÒ˹Zj»ç³°è$gïHKjÒPC>g¥DÝÖM*¦m¸va¸ÎAwj2QéÐÓ`Ë'Ã%KcöNòiXÎÊÄêâ[JÍ"M4CC¤vsaÙ |
+(~¯±Ú±¯hÿ\Èã&õ*ÃïêW)½¢¢cºJÓU[Þ9]¥\Û«¾"㦹ÛtUGãÅéªMÏ` |
+Z·ÞHòþpßÆ |
+ SMʘj |
+Z&½³¢ºîNS@t§[æ°é%ͽ2Ê$±YNÑKÂTSpnt>Ïwb1ס'7égQ¯æÁ) |
+Z&íòlwýp»ÉGÞ1]5øŸØïöjziÁÍÆIWâ ylüô èkÔ6ønoÔF¥»mM'CûVÕ7 |
+Ö'ñ½ Û%>ºÎAö^«®²äáÄN9yo1úÜáµ Ó |
+óhLÍ9hTÞ@ôdØþ³oåá)]I3~ªÆ`ydhå¥üL%Â8Í¢otIÞÍ,X {³ôf2³Pz`ðkf1'÷ÃSÌ,xÁ6:úfyJWYåfÍsÍ=®Z[&ÎÑsÁعM©-<UµEyú8õ çVJº¨-$>)¼´sÐ2)¾d¾ |
+O]½¾çá)]I*¥¼ëÉÖ/åg*qP2ÖY·ø¼©zU£¶ðã¥Y´¶8Y(c ¶0}ÞYP[è¶{´¶8$5³ Ë3Í,ç ®9îðDm©ðáóS¾píÖ^¨%N¾ÁDztTÓ5¼¶Tx9hjÎAˤ§¬Z[kKpÐJRÑ{jmÑrÞ³sµÔ8(EûFÂOÁ»Eº.ö0kKp ÒQM×ðÚÂBkjÎAf©-4K?Í ý³<¥+IÍ,ÁrN3-"ñ%â ¢l[ê==Ñi=Ï |
+eÛ¢Ì3Hpfµ8e·¤½ñ8h½ÇØõlW¤ §¿:-²É='byDò38(ÅF[ôDäÝ̶ Åô0¶-ÎAfJwëHGÅú=ã 3{.á<érimË3Í,ç Ý92ñmI¯cò][ |
+<B¤¨3j1Vú°r§ÝµE>Îð ±ÔIOñ³.zëYÂÃóð®$½}·ÜÙº¿¢©ÄAÉ,¬-²Ý¥àÝÌ"uD÷ö0kKp R| ïfÛáºqEÚ¥f~YÒ¤fÆ@y¦Åò`Ä&'$`vM&U_ÿþ?(=&ûϤç>÷°ï@Ïç9¡Ò'á¬}2O'5ÓvKqbÜFzè«ÎAˤS4`]ç" ó<<¤+Iq¨o²<Ðe¥üL%âUÛÜ,\$±Å¢MÍÒë©fárÍbÌEã °:\:Ô,J\°âacLÍ9htCÍ¢)À,ÁA+IEï©fÑò./åg*qm·d |
+¢Lì>M³(1Ól#Lé±pú tt¦ÛøJ´\ |
+f ¦@³8-r· òùmí|E)?SôCúõºX©¶Áé%-VZe²XzJÞÆÃãLy¦|ùÍ ×þ#ôg:§ÊÍí[Þª®]hÆúÇÂodúeÞxúV!ôVhbçñ±X9Ö±XÎd'^¢Ó1U/çgÜóoç+qÐÒó#(ÅÓh×s ¯ÄAˤ²;§p.)O+§t%é¥g ËVê+JùJgÙ¹£÷ûpôþp't¸ÙÿOrNÿHîòï?rÿù/96¤cC%M©¦øúÛ+É4¾ðþøHG¼ÿè¨/÷æÇvý»íá ÞqXoÔç^xï?òÂ2à>þÒýú®_yû%ÏÀä-8_ºê#yC¾¿zCâãª'¸zCú×`ñ/Góu¬¯ðdüüO=òIyÄ0Rïwõ7¶Õ©ØsÖÍlv<Å_ó-ýí/ëË<XuC·y¸ZilÓÞýör?Xã ¼fDsñM|É÷ýGþ¸ØúÕýîá{ýÊï7ûëv»ð&ÎoùÞò¿âüó_ÿv¬¾ï[Ä·_Å7ë𼮪Å|Éßÿ¿ñßx ÿÞçûw)'öú$õè¯Z£mm6¯úªéÏ~×cÿ#!ðþÎøHg¼ÿè,;©¡säï©ð[}¿:Ïáq"Îðg`'Jä3'ò9é¬ |
+>Òï?:cáãëqí¥P<\u¾"ñKwH2ðbVÎEµ77Äö |
+1Gç"ÎZÌ¥.úÆAx7ç¦_XócJ̹ZÈÌ%Û²æ¤ië!¿lýeWE*÷¹¤·W8§þçô£t×ö+ËÝõüwåÃ¥ã/ä|¤+ß:áú49óÅjs_ׯÜþý»ãç>ÿ¼ÄA×ÇñÓÞoGðãISsJWÙÿÆ1éà÷?pðÃJAKþõ(~÷Ët¸Esê${W¿ñáxÿÑ!~¼.ñc=®_ûáß??,.»Íj4Bws'}ð®õÂh{åLìXóqÀÉ2Cóß80å#áòþpùHGɼÿè(8@ïþþö6?×ÇãÒ!::JýÙ<?;°ç§c n}Ðz4Ñ_<xèWÇ |
+Iäõé£wºÜìú¯?+Ñì¢4|»Övð |
+µwºdíúÅ kËÙº_ØÖíbµv\§¾îÎ9-ÚµoÏKæ>qõÜǸ´s»_U/³~ÁÝôKéô:¼þ |
+wîîKQõ@|·×Ì(ñóù§£-váûI÷6oί¼ÞG1øuÊZ²aÓ,b1G9|XÞ8c ÌCkIeÆeî§ë+YçÈkèY[Ra#¼:7u_kzëáÂ2Ç$sZ< õNIIæ´ð¥bsZXsÖ9Éù-Ì$9-½P]¥xw7'-Ãd®¬ïdÑÇ=ðCâcj3ªxÎAÛ>î>¼säëfêl/MbþÌ#çë¥*Ê÷ÓùF»ý3{üs·ÎAË¥é,9á12¨×{@ª¤åb\Ýn©I*8ÐÒnéÙ!Z3ô-DÍÐÂ¥åyºgqvïàî.XÍÝ]*·úd¾[ ³8ÎA뻾ôÎ-îÐR9ÐT}»wb»thli°³f×sA+ùAºÁþ£vÿ%6å/çòïƧ`dÖÚÚ1¾Úà·)öqã|Ó¿¦ré#íöËà ÎKìQƲGU.ñåT0w=¯Ç/1ÊT°×¤Û×=×tî>ù4)Vó?Ó>ÒåAëRqEF:Ôõ |
+ÍÊeßHÙ>|ìsnðn<xÄ?Ý¥xØ×CÒ+øÐ\©±+Zòý¤Ùèw)\E¼eÇÑr)öl\lzÝÁü¯R®RÏi+\±å |
+gȹ¶+°oÏ9(y®'ð|é>@÷émêãµK;²þ«êíªûã.çݽYéíK¦×qPÜ% |
+Ö3iÀ§{ì®K}ëWéJÒÈ%bìÔk¤©)$uBæRIFÍ0Mÿür¸¿ø$¹]Í íºlu÷EºÇl(¨ó8È{)=L¹ù~»(S9h¹´ùÝÝ{äá!]IN<£UÓe¥üL%¢)¹Î ¯ÜÑ/~Åéпe§yÓ÷Vï@=M^ô¬Ã'Ä$½áë[8Bø×o¾µuO÷ºþË¥-ÅÈ7îç}±k8"ÆWâ åÒÃ¥óöáå£ú¿13m´\*ÉàùöÃõjÜí«t%i\®kNxz¹®n*Ëu÷$]Iê®ÞtiÖ¥aK¡¦<è»Û×(ÅiR+}RÍý£ã`ñ ëdºMø'sºøÃ樂)wêiW%±Êî;:ôNiå ¤3¼uÛÔoW9Rë¯ïÞ¼í7Xÿüìæ^¶nV¿_ã+qÐréáÒù |
+Kñ1¨Ûnv$¶£ùw_PÍWs¯9Ç¥å__é»ks¢®©èæÒ5ï_ÝTã:ù},ÜýÍ¡C¬Ñré®oaU·×áµö)]I±ö¾P©ûÃtV^Îíeº§VR¿9ÏöæPj¥R~ÆÉ`î{¤sðõ³-éÁ<üP·ÌÃÏ3Qö`Ô³pWyÙÙ¹ÎAËýRE:uåÉ{¿¯ÄAË¥Ø3¶ñ+ÙR@Óç´ôòºßKuõÈqÐJÒ˹'Õ(å'O |
+ç|3åW÷иëòÃïåEÜÊ»<¹}UYåU¤=ô¾På ¤3\6ÇÔysXóNß]:y'²ñÏn@mL¹¹´zj5å·¦UÏ{My¯^Îêeo©yªÿ5ÏÎé]TpÐr).~íìÍST¯Ý¿JWÆ%²æ¦º¼ã |
+ZIz9w÷VZMyЩ÷¯1 »´¹.ïÀaìð÷áJMÃÄ1kgº5÷kjº÷Ãï:¦Cæ8¼ÃTNeÞè¹ÀÞelÓJÒËî¢óIê8:½ótÒïî¤í7'ÿüvææn*íZOùí)gÝóÞSÞ»³{Ù÷ÜyªßhödfìîmtºÚÚ¼Ku3]ýÅûû/´6ßHÌ*¥ëÅ¿úIÆ5æú.¸¥wQÁAË¥»¾9¸¡¦[VgæpÿÉÝ©û£éÎîL9ÓÏtO¤<s1ìÍQis]ÞûIÆîZÓáò[SGÏÌÃÒxTrtôCxÉ ÍñoÄ¿¹ÆaÑÝÝùðÆ3·»ßµ¿º°øC/ã[oÐûê°·ó=ÒòÝ~7wUEJåþ²ßVwZÓN»5jÁAáÖVÝ%;å[ |
+|K¾láÁÖ^×ï>nÚªKuö¨ëúÀkË»!÷F;RÜb,ÚôÜÌß,]ÉNh˳9¹éWÅ7W´6M,wÃﹸòtºC奮EáÄïubÂçËëNW¤î¤NLÊA+I/çênPrSبAùJmÅ¥.*¥{Ö,µÍó³¥ül÷âåÑR~¦éiÇÉ+êüxzEÑ÷É8hýxxPa5n:áLç+q{cѧk¨ÔÏK½¿¯Ò¤×ð{Ð4)îi©á¢Ã ͯqÐJÒËyZj|ªq16áMÏæFãâ[VËÌÉLïÆT¶:^«Ü=+Njv©3źIÙU´ÙÉ\4DcíM¼Ø6¹¹KCj±FÑ\wôVØæhFÕA >V^ÎpjOR§!>g¢¹}þ¾~|w1jîâCi±GJÌo9#gÆAË¥KQö<}n>CÙÉL:|оIùêäOéË{Âû *òÔ=VóÜI÷7rÜmÞ1æcÃÓ{ÔêÃþÕÅr}Eo>4Ç9fë§W÷G³O·:ÉN<ÞéxÇð1£ó8h¹(?Ýgå3ù¯¯^-§ÅÅtã ¤sOÞ)QJ[¹Qr`n%6º<»xÕqÐJÒËùpWßv¹ó"Dã+qÐrÝ6UE>øñè|9¯ï4SÜâÎc¹ô´ÔXöAòü>¤+ÙêÁÂ]2%jsÐrH)ѤD-sZ.¼Åj¦p¼Ü«ç!]IÞ9µÌ9h%éåÜÝ'µìáÊÃqõëèáZc:¡søWîÞöäî1{j2Z÷)ÈÖz|¯(Ë&ñn.2ê¯#ç+qmrW©}i)éóøsZ.ÝÝefx |
+#å!KW^?,ï£Ûò38H¯Ç3e{ù×ÑëÆ}sýcºí©ÔÃûº Û¶ÜS%MuÒçD}bÜÿDC| `þ ê¢òtÑÆærZþ«4`¨;0Â$¼H0ÓõÍÏ3]¸WW¥º<p/o_Îûë;w¤¸#ÅX.=<µé¹)¿YºØ ?ªÍt¼æòpqW}k»¹Äûd!=æKmu¶ßVw ©^uvÖ9(Fª;ôä>bï¥ÜJ|Ôxû ̲j |
+GÊC®$½¼ÜÇËÊ3^QÊÏTâ }/® |
+I¹¶X)DKZ¹¶yùwr@z¬k>¥!-B,Ðf±4dF,DòX)DKZsb<µNÍ5ºÍ¢3[Ç,ÿN±²ïQà¹Æ± ;ÓÙ÷G{`ÊciÞÁC¨Íb%mGM!®Ey,ìQ¥!g |
+ÙsÚSíµXR#û£öîé]°X9d2$¿8êÅÜ|XtFÞxªán;þ·ýKûR!8÷On?ß3Dc±bÓðxôô3îyíKÿ·×íÌ|¤ý73Þú#þ³´Â*·±=C6ÿÍ(Ùn#YgdëtÌÉ3DÙC·ÊsòôE¿KCf |
+y¤kÚæ#¤R÷;ÅÒØ·1¤æ0d¼Þ)VÒ6¶2rFÒ6¶ë±GFË%)×cÏÖQmKC=¥!µ+°µ¶ÏZ,pÚö- /ÍÅÒå±Xÿ¨ \Jj±4dGIG²ÛxÔÃû÷üL3êÎú¾ÍBάçRÛ|Ø ïÖ*¥!3jÅÊ!´µÅJÚ´VY¬´yB~Ô+t¤\»EQnÕf±4dX¬-jÛDyê-B |
+¶XIÕcõXÒRÈñÐVBÛö°5ZrÚºäqU§?¶ÚÚbåÚú|ØýÂBFÎÁHÚÌÖÌÏØ#fa¤\=[Ú<C`+æÀcådÑf!5Z>L ÝjÔQ¥!-ìVs-Õ¿A#·ÇJ!Z´!^wJh3çúè£ä{äú°ò´BÒ7Æ3äi± Ýú÷} |
++*µyÒ¤R |
+1Mò38}¸Ynv³o|Q<¶u4Kð8HZÆý4é~®ÝÍ|%Z.ÅKgl×ÙV"g»Ç¦kÌÈq+SÁõ=lËQ½TKøîb[Çci¯ÄAhKë*Þ:_KçKuÉAbLáØ"éJRè=-Ë3_QÊÏTâ mq碶ÈÅãMZ;}êlëX[¯ÄAhKë*Ñ_KÇKuÓ S@m ZI |
+MAÍâ´93³hÙú+JùJ¤fÙ£É=öhrÉÒL»5¹G&×ùJ´ÔA^¥ÖäÒÝqÐr)n÷´&)°ÉuZIRX«eë¯(åg*q¾D%õD%õDÅ{¢â=Ñz¢-õDÛüC*óæ=Ñæ=Ñz¢-õD÷D[ê6ï6ï¶Ômó«t%)Já=Qñ¨¤¨xOTf¸{=ÑiDcqðßu²÷jOä|%W¬RÚL7©_I¥÷ ®iwjOä´¥(Ã&@£©ÄAÙ,ìFL#3_ÿª=ó8ÈÍBi3]¤3Ì¢©¹Yj5³È³f |
+ìVºYÃ&@£©ÄA4Kókkókï{ ïây£6ÿÁWâ %ÒêÒÍuù¤eð8h¹t©®»Nk |
+qº®3ò`ÍHf·©ú¨8^¢à+qÒ9M×ôIËà+qå®øªkºágz4éJR7c®ë<qÇüÙäGÈFPù«CZgÓYà~Æ&7øJdPJ¿Óhêå##R3Z.Ýõòi:54¹ÁA+I³î1Óe¥üL%JfÑæõÆ0tªT--d|%2³PZéaKÍ8h¹ÔÌCåÂfyJWY4Æaº¬©ÄAz½ÍQ½mñ©o,×m:Ë»·-ÎWâ ¹\ÀÖ®Ïö ®Íßkç+qÐ2©´ÃÖ5¶-ÎA+I¡wZ¤R~¦e³°m11d¼YjÓÎÎWâ 7¥ëÚü½v¾¹Y¤=¶ó@SéÑ<¤+IÝ,aSZQÊÏTâ ¥uÿ&ºÙ¿åήc¢·¡Â,ÎWâ ¹=¤í.m¦«ù7Qð8hTB]R<¦@³8$E)ÅèÝtõy0ÊfáKÄ ½ÊNÄSÕÅ/)K|Ü,6ÓÕü(øJäf©ÕÌ"/SàKä´Ôͽ®Þ#ÆA0ËÿñãÿZÛS=endstream |
+endobj |
+6 0 obj |
+17999 |
+endobj |
+4 0 obj |
+<</Type/Page/MediaBox [0 0 612 792] |
+/Rotate 0/Parent 3 0 R |
+/Resources<</ProcSet[/PDF] |
+/ExtGState 8 0 R |
+>> |
+/Contents 5 0 R |
+>> |
+endobj |
+3 0 obj |
+<< /Type /Pages /Kids [ |
+4 0 R |
+] /Count 1 |
+/Rotate 0>> |
+endobj |
+1 0 obj |
+<</Type /Catalog /Pages 3 0 R |
+>> |
+endobj |
+7 0 obj |
+<</Type/ExtGState |
+/OPM 1>>endobj |
+8 0 obj |
+<</R7 |
+7 0 R>> |
+endobj |
+2 0 obj |
+<</Producer(GPL Ghostscript 8.15) |
+/CreationDate(D:20070312220102) |
+/ModDate(D:20070312220102) |
+/Title(BOARD.bin) |
+/Creator(PScript5.dll Version 5.2) |
+/Author(Jakub)>>endobj |
+xref |
+0 9 |
+0000000000 65535 f |
+0000018313 00000 n |
+0000018431 00000 n |
+0000018245 00000 n |
+0000018105 00000 n |
+0000000015 00000 n |
+0000018084 00000 n |
+0000018361 00000 n |
+0000018402 00000 n |
+trailer |
+<< /Size 9 /Root 1 0 R /Info 2 0 R |
+/ID [(ý*i@kìïǼþ)(ý*i@kìïǼþ)] |
+>> |
+startxref |
+18608 |
+%%EOF |
/Designs/ROBOTS/Camerus/LEDpanel/PCB/LEDpanel.pcb |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/sw/camerus.PJT |
---|
0,0 → 1,57 |
[PROJECT] |
Target=camerus.HEX |
Development_Mode= |
Processor=0x876A |
ToolSuite=CCS |
[Directories] |
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\Dr |
Library= |
LinkerScript= |
[Target Data] |
FileList=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.c |
BuildTool=C-COMPILER |
OptionString=+FM |
AdditionalOptionString= |
BuildRequired=1 |
[camerus.c] |
Type=4 |
Path= |
FileList= |
BuildTool= |
OptionString= |
AdditionalOptionString= |
[mru-list] |
1=camerus.c |
[Windows] |
0=0000 camerus.c 0 0 796 451 3 0 |
[Opened Files] |
1=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.c |
2=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.h |
3=C:\Program Files\PICC\devices\16F876A.h |
4=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\objizdka_L.c |
5=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\diag.c |
6= |
[debugperif] |
selected=Analog/Digital Conv |
[debugram] |
autoread=1 |
[debugeedata] |
autoread=1 |
[debugbreak] |
count=0 |
[pcwdebug] |
watchcol0=75 |
[debugwatch] |
count=0 |
[debugexpr] |
expr= |
sideeffects=0 |
[Units] |
Count=1 |
1=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.c (main) |
/Designs/ROBOTS/Camerus/sw/camerus.c |
---|
0,0 → 1,661 |
//********* Robot Camerus pro IstRobot 2007 ************ |
//"$Id: camerus.c 253 2007-04-24 09:26:46Z kakl $" |
//***************************************************** |
#include ".\camerus.h" |
#USE FAST_IO (C) // Brana C je ve FAST_IO modu, aby slo rychle cist z kamery |
// Rychlostni konstanty |
#define RR_CIHLA 50 // Rozumna rychlost pro objizdeni cihly |
#define RR_PRERUSENI 50 // Rozumna rychlost pro priblizeni se k preruseni |
#define BRZDNA_DRAHA 0x15 // Jak daleko pred problemem se zacne brzdit |
#define TUHOS 100 // Jak dlouho se bude couvat po narazu na naraznik |
#define ODODO_PROBLEM1 0xFFF |
#define ODODO_PROBLEM2 0xFFF |
#define ODODO_PROBLEM3 0xFFF |
// Adresy IIC periferii |
#define COMPAS_ADR 0xC0 |
#define CAMERA_ADR 0xDC |
#define SONAR_ADR 0xE0 |
// A/D vstupy |
#define RMAX 4 // AN4/RA5 - leve cidlo na vyjeti z cary |
#define LMAX 3 // AN3/RA3 - prave cidlo na vyjeti z cary |
#define CERVENA 2 // AN2/RA2 - cervene kroutitko |
#define ZELENA 1 // AN1/RA0 - zelene kroutitko |
#define MODRA 0 // AN0/RA1 - modre kroutitko |
// I/O |
#define HREF PIN_C5 // Signal HREF z kamery (v H po celou dobu radku) |
#define PIX PIN_C6 // Vstup pro body z kamery (za trivstupim hradlem OR (dig. komparator)) |
#define SERVO PIN_B4 // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem)) |
#define MOT_L PIN_B5 // Smer otaceni leveho motoru; druhy pol je RC2 |
#define MOT_R PIN_B6 // Smer otaceni praveho motoru; druhy pol je RC1 |
#define MOT_1 PIN_C1 // PWM vystpy motoru |
#define MOT_2 PIN_C2 // |
#define DATA PIN_B2 // K modulu LEDbar data |
#define CP PIN_B1 // K modulu LEDbar hodiny |
//#define ODO PIN_C0 // Ze snimace z odometrie z praveho kola na TIMER1 |
// Jeden impuls je 31,25mm |
#define IRRX !input(PIN_B0) // Vstup INT, generuje preruseni pri prekazce |
#define IRTX PIN_B3 // Modulovani vysilaci IR LED na detekci prekazky |
#define PROXIMITY PIN_C7 // Cidlo kratkeho dosahu na cihlu |
#define BUMPER !input(PIN_A4) // Naraznik |
#define CASMIN 6 // Rozsah radku snimace |
#define CASMAX 192 |
#define CASAVR ((CASMAX+CASMIN) / 2) |
#define EEMAX 255 // Konec EEPROM |
#define MAXLOG 0x10 // Maximalni pocet zaznamu v logu |
#if MAXLOG>(EEMAX/3) |
#error Prekrocena velikost EEPROM |
#endif |
#define OFFSETO 0x9F //0x9F // Vystredeni serva pro objeti prekazky |
#define THR 90 // Threshold pro UV cidla na caru |
#byte INTCON = 0x0B // Interrupt configuration register |
#bit GIE = INTCON.7 |
#bit PEIE = INTCON.6 |
#bit TMR0IE = INTCON.5 |
#bit INT0IE = INTCON.4 |
#bit RBIE = INTCON.3 |
#bit TMR0IF = INTCON.2 |
#bit INT0IF = INTCON.1 |
#bit RBIF = INTCON.0 |
enum stavy {start,rozjezd,jizda,cihla,pocihle,cil}; |
stavy stav; // Kde jsme na trati |
int8 cas; // Cas hrany bila/cerna v radce |
int8 stred; // Vystredeni kolecka |
int16 odocounter; // Zaznamenani aktualniho stavu pocitadla odometrie |
int16 last_log_odo; // Posledni stav odometrie poznamenany do logu |
int16 last_log; // Cislo posledniho zaznamu v logu v EEPROM |
int8 bb_h[MAXLOG]; // Cerna skrinka MSB |
int8 bb_l[MAXLOG]; // Cerna skrinka LSB |
int8 bb_f[MAXLOG]; // Cerna skrinka priznak (typ zaznamu) |
int8 log; // Pocitadlo pro cernou skrinku |
int8 rr; // Promenna na ulozeni Rozumne rychlost |
int8 rrold; |
int16 odo_preruseni, odo_cihla, odo_tunel; // Problemy na trati |
int16 odo_problem1, odo_problem2, odo_problem3; // Problemy na trati |
// Zobrazeni jednoho byte na modulu LEDbar |
inline void disp(int8 x) |
{ |
int n; |
for(n=0;n<=7;n++) |
{ |
if (bit_test(x,0)) output_low(DATA); else output_high(DATA); |
output_high(CP); |
x>>=1; |
output_low(CP); |
} |
} |
// Blikani LEDbarem ve stilu Night Rider |
void NightRider(int8 x) |
{ |
int n,i,j; |
for(j=0;j<x;j++) |
{ |
i=0x01; |
for(n=0;n<7;n++) |
{ |
disp(i); |
rotate_left(&i, 1); |
delay_ms(40); |
} |
for(n=0;n<7;n++) |
{ |
disp(i); |
rotate_right(&i, 1); |
delay_ms(40); |
} |
} |
disp(i); |
delay_ms(40); |
i=0; |
disp(i); |
} |
// Zaznam LOGu do EEPROM |
void SaveLog() |
{ |
int8 n,i,xlog; |
i=0; |
for(n=0;n<=(log*3);n+=3) // Ulozeni Black Boxu do EEPROM |
{ |
write_eeprom(n,bb_f[i]); |
write_eeprom(n+1,bb_h[i]); |
write_eeprom(n+2,bb_l[i]); |
i++; |
}; |
if(log>0) {xlog=log-1;} else {xlog=0;}; |
write_eeprom(EEMAX,xlog); // Zapis poctu zaznamu na konec EEPROM |
} |
// Zaznam do Logu do RAM |
void LogLog(int8 reason, int16 log_delay) |
{ |
int16 timer_pom; |
timer_pom=get_timer1(); // Timer se musi vycist atomicky |
bb_l[log]=make8(timer_pom,0); // Zaznam |
bb_h[log]=make8(timer_pom,1); |
bb_f[log]=reason; // Typ zaznamu |
if(log<(MAXLOG-1)) log++; // Ukazatel na dalsi zaznam |
last_log_odo=timer_pom+log_delay; // Dalsi mereni nejdrive po ujeti def. vzdalenosti |
rr=rrold; // Problem skoncil, znovu jed Rozumnou Rychlosti |
} |
void ReadBlackBox() |
{ |
last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano? |
{ |
int8 n,i; |
i=0; |
for(n=0;n<=last_log;n++) |
{ |
if(read_eeprom(i)==0) odo_tunel=MAKE16(read_eeprom(i+2),read_eeprom(i+1)); |
if(read_eeprom(i)==0xFF) odo_cihla=MAKE16(read_eeprom(i+2),read_eeprom(i+1)); |
if((read_eeprom(i)>0) && (read_eeprom(i)<0xFF)) odo_preruseni=MAKE16(read_eeprom(i+2),read_eeprom(i+1)); |
} |
} |
} |
// Brzdeni motorama stridou 1:1 |
void brzda() |
{ |
int8 n,i; |
set_pwm1_duty(0); // vypni PWM |
set_pwm2_duty(0); |
setup_ccp1(CCP_OFF); |
setup_ccp2(CCP_OFF); |
for (n=0;n<200;n++) |
{ |
output_low(MOT_L); |
output_low(MOT_R); |
output_high(MOT_1); |
output_high(MOT_2); |
delay_us(200); |
output_high(MOT_L); |
output_high(MOT_R); |
output_low(MOT_1); |
output_low(MOT_2); |
delay_us(200); |
} |
output_low(MOT_L); // smer vpred |
output_low(MOT_R); |
setup_ccp1(CCP_PWM); // RC1 // Zapni PWM pro motory |
setup_ccp2(CCP_PWM); // RC2 |
} |
void SetServo(int8 angle) |
{ |
int8 n; |
for(n=0; n<10; n++) |
{ |
output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servo |
delay_us(1000); |
delay_us(stred); |
delay_us(stred); |
delay_us(stred); |
delay_us(angle); |
delay_us(angle); |
output_low(SERVO); |
delay_ms(18); |
} |
} |
inline void SetServoQ(int8 angle) |
{ |
output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servo |
delay_us(1000); |
delay_us(stred); |
delay_us(stred); |
delay_us(stred); |
delay_us(angle); |
delay_us(angle); |
output_low(SERVO); |
} |
// Couvni po narazu na naraznik |
inline void bum() |
{ |
set_pwm1_duty(0); // couvni, rovne dozadu |
set_pwm2_duty(0); |
output_high(MOT_L); |
output_high(MOT_R); |
disp(0xA5); |
SetServo(CASAVR-CASMIN); |
} |
#include ".\diag.c" |
//---------------------------- INT -------------------------------- |
#int_EXT |
EXT_isr() // Preruseni od prekazky |
{ |
unsigned int8 bearing, bearing_offset, delta_bearing; |
set_pwm1_duty(0); // zabrzdi levym kolem, prave vypni |
set_pwm2_duty(0); |
output_high(MOT_L); |
output_low(MOT_R); |
// Ujistime se, ze prijaty signal je z naseho IR vysilace |
output_high(IRTX); // Vypni LED na detekci prekazky |
delay_ms(2); |
if (IRRX) // stale nas signal? |
{ |
output_low(MOT_L); // je odraz -> vpred |
output_low(MOT_R); |
return; |
}; |
output_low(IRTX); // Zapni LED na detekci prekazky |
i2c_start(); // Cteni kompasu |
i2c_write(COMPAS_ADR); |
i2c_write(0x1); // 0-255 (odpovida 0-359) |
i2c_stop(); |
i2c_start(); |
i2c_write(COMPAS_ADR+1); |
bearing_offset=i2c_read(0); // Poznamenej hodnotu pred cihlou |
i2c_stop(); |
delay_ms(9); |
if (!IRRX) // stale nas signal? |
{ |
output_low(MOT_L); // neni odraz -> vpred |
output_low(MOT_R); |
return; |
}; |
rr=rrold; // Po cihle se pojede opet Rozumnou Rychlosti |
if(stav!=cihla) |
{ |
LogLog(0xFF,3); // Cihla |
}; |
//!!! if(stav==cihla) while(true); // Zastav na furt, konec drahy |
// if(stav==cihla) return; // Po druhe nic neobjizdej |
// Pozor na rozjezd |
if((stav==jizda)||(stav==cihla)) // Objed cihlu |
{ |
#include ".\objizdka_L.c" |
}; |
last_log_odo=get_timer1()+16; // Pul metru po cihle nezaznamenavej do LOGu |
} |
//---------------------------------- MAIN -------------------------------------- |
void main() |
{ |
int8 offset; // Promena pro ulozeni offsetu |
int8 r1; // Rychlost motoru 1 |
int8 r2; // Rychlost motoru 2 |
int16 ble; |
setup_adc_ports(ALL_ANALOG); // Zapnuti A/D prevodniku pro cteni kroutitek |
setup_adc(ADC_CLOCK_INTERNAL); |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Casovac pro mereni casu hrany W/B v radce |
setup_timer_1(T1_EXTERNAL); // Cita pulzy z odometrie z praveho kola |
setup_timer_2(T2_DIV_BY_16,255,1); // Casovac PWM motoru |
//!!! setup_timer_2(T2_DIV_BY_4,255,1); // Casovac PWM motoru |
setup_ccp1(CCP_PWM); // RC1 // PWM pro motory |
setup_ccp2(CCP_PWM); // RC2 |
setup_comparator(NC_NC_NC_NC); |
setup_vref(FALSE); |
set_tris_c(0b11111001); // Nastaveni vstup/vystup pro branu C, protoze se to nedela automaticky |
set_pwm1_duty(0); // Zastav motory |
set_pwm2_duty(0); |
output_low(MOT_L); // Nastav smer vpred |
output_low(MOT_R); |
disp(0); // Zhasni LEDbar |
if(BUMPER) // Kdyz nekdo na zacatku drzi naraznik, vymaz log a spust diagnostiku |
{ |
diag(); |
} |
output_low(IRTX); // Zapni LED na detekci prekazky |
NightRider(1); // Zablikej, aby se poznalo, ze byl RESET |
// Zaroven se musi pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy |
//... Nastaveni sonaru ... |
i2c_start(); |
i2c_write(SONAR_ADR); |
i2c_write(0x02); // dosah |
i2c_write(0x03); // n*43mm |
i2c_stop(); |
i2c_start(); |
i2c_write(SONAR_ADR); |
i2c_write(0x01); // zesileni |
i2c_write(0x01); // male, pro eliminaci echa z minuleho mereni |
i2c_stop(); |
//... Nastaveni kamery ... |
i2c_start(); // Soft RESET kamery |
i2c_write(CAMERA_ADR); // Adresa kamery |
i2c_write(0x12); // Adresa registru COMH |
i2c_write(0x80 | 0x24); // Zapis ridiciho slova |
i2c_stop(); |
i2c_start(); // BW |
i2c_write(CAMERA_ADR); |
i2c_write(0x28); |
i2c_write(0b01000001); |
i2c_stop(); |
/* |
i2c_start(); // Contrast (nema podstatny vliv na obraz) |
i2c_write(CAMERA_ADR); |
i2c_write(0x05); |
i2c_write(0xA0); // 48h |
i2c_stop(); |
i2c_start(); // Band Filter (pokud by byl problem se zarivkama 50Hz) |
i2c_write(CAMERA_ADR); |
i2c_write(0x2D); |
i2c_write(0x04 | 0x03); |
i2c_stop(); |
*/ |
i2c_start(); // Fame Rate |
i2c_write(CAMERA_ADR); |
i2c_write(0x2B); |
i2c_write(0x00); // cca 17ms (puvodni hodnota 5Eh = 20ms) |
i2c_stop(); |
i2c_start(); // VSTRT |
i2c_write(CAMERA_ADR); |
i2c_write(0x19); |
i2c_write(118); // prostredni radka |
i2c_stop(); |
i2c_start(); // VEND |
i2c_write(CAMERA_ADR); |
i2c_write(0x1A); |
i2c_write(118); |
i2c_stop(); |
NightRider(1); // Musi se dat cas kamere na AGC a AEC |
{ // Mereni expozice |
int8 t1,t2; |
i2c_start(); // Brightness, zacni od uplne tmy |
i2c_write(CAMERA_ADR); |
i2c_write(0x06); |
i2c_write(0); // 80h default |
i2c_stop(); |
delay_ms(50); |
for(offset=0x04;offset<(255-0x04);offset+=0x04) // Zacni od jasu 10h |
{ |
i2c_start(); // Brightness |
i2c_write(CAMERA_ADR); |
i2c_write(0x06); |
i2c_write(offset); // 80h default |
i2c_stop(); |
disp(offset); |
delay_ms(50); |
t1=0; |
t2=0; |
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky |
delay_ms(5); |
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky |
set_timer0(0); // Vynuluj pocitadlo casu |
if(!input(PIX)) continue; |
while(input(PIX)); |
t1=get_timer0(); // Precti cas z citace casu hrany |
set_timer0(0); // Vynuluj pocitadlo casu |
while(!input(PIX)); |
t2=get_timer0(); |
if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break; // Vidis, co mas? |
delay_ms(2); // Preskoc druhou radku z kamery |
}; |
delay_ms(1000); // Nech chvili na displayi zmerenou hodnotu |
} |
set_adc_channel(CERVENA); // --- Kroutitko pro jas --- |
delay_ms(1); |
offset=read_adc(); |
offset &= 0b11111100; // Dva nejnizsi bity ignoruj |
// offset += 0x70; // Jas nebude nikdy nizsi |
disp(offset); |
i2c_start(); // Brightness |
i2c_write(CAMERA_adr); |
i2c_write(0x06); |
i2c_write(offset); // 80h default |
i2c_stop(); |
delay_ms(1000); // Nech hodnotu chvili na displayi |
set_adc_channel(ZELENA); // --- Kroutitko pro vykon motoru --- |
delay_ms(1); |
rr=read_adc()>>2; // 0-63 // Pokud by se zvetsil rozsah, tak zkontrolovat jakonasobeni! |
rr+=27; // 27-90 |
//!!! rr=read_adc()>>1; // 0-128 // Pokud by se zvetsil rozsah, tak zkontrolovat jakonasobeni! |
rrold=rr; |
cas=CASAVR-CASMIN; // Inicializace promenych, aby neslo servo za roh |
// a aby se to rozjelo jeste dneska |
stav=start; // Jsme na startu |
set_timer1(0); // Vynuluj citac odometrie |
log=0; // Zacatek logu v cerne skrince |
last_log_odo=0; // Posledni zaznam odometrie do logu |
ReadBlackBox(); // Vycteni zaznamu z Black Boxu |
odo_problem1=ODODO_PROBLEM1-BRZDNA_DRAHA; |
odo_problem2=ODODO_PROBLEM2-BRZDNA_DRAHA; |
odo_problem3=ODODO_PROBLEM3-BRZDNA_DRAHA; |
// ........................... Hlavni smycka ................................ |
while(true) |
{ |
int8 pom; |
int8 n; |
int8 gap; |
int16 ododo; |
gap=0; // Vynuluj pocitadlo preruseni |
next_snap: |
pom=0; |
disable_interrupts(GLOBAL); //----------------------- Critical Section |
while(input(HREF)); // Preskoc 1. radku |
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z 2. radky |
set_timer0(0); // Vynuluj pocitadlo casu |
while(input(HREF)) // Po dobu vysilani radky cekej na hranu W/B |
{ |
// !!!!Dodelat rozpoznani cerne cary napric pro zastaveni ? |
if(!input(PIX)) // Pokud se X-krat za sebou precetla CERNA |
if(!input(PIX)) |
// if(!input(PIX)) |
{ |
pom=get_timer0(); // Precti cas z citace casu hrany |
break; |
}; |
}; |
while(input(HREF)); // Pockej na shozeni signalu HREF |
if((pom<CASMAX) && (pom>CASMIN)) cas=pom; // Orizni konce radku |
// Na konci obrazovaho radku to blbne. Jednak chyba od apertury |
// a vubec to nejak na kraji nefunguje. |
output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servo |
delay_us(1000); |
delay_us(stred); |
delay_us(stred); |
delay_us(stred); |
delay_us(cas); |
delay_us(cas); |
output_low(SERVO); |
// Elektronicky diferencial 1. cast |
if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace |
if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;}; // pro rizeni rychlosti motoru |
if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92 |
enable_interrupts(GLOBAL); //----------------------- End Critical Section |
if(pom==0) // Kamera nevidi caru |
{ |
if((cas>(CASMIN+15))&&(cas<(CASMAX-15))) // Nebyla minule cara moc u kraje? |
{ |
gap++; |
if(gap>=3) // Trva preruseni cary alespon 2 snimky? |
{ |
cas=CASAVR-CASMIN; |
// disp(0xAA); |
} |
} |
} |
else |
{ |
gap=0; |
}; |
/* |
if(pom==0) // Kamera nevidi caru, poznamenej to do logu |
{ |
if((cas>(CASMIN+30))&&(cas<(CASMAX-30))) // Nebyla minule cara moc u kraje? |
if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu |
{ |
gap++; |
} |
} |
else |
{ |
if(gap>=4) // Trva preruseni cary alespon 2 snimky? |
{ |
LogLog(gap,8); // Dalsi mereni nejdrive po ujeti 24 cm |
rr=rrold; // Preruseni cary skoncilo, znovu jed Rozumnou Rychlosti |
cas=CASAVR-CASMIN; |
disp(0xAA); |
} |
gap=0; |
}; |
if(!input(PROXIMITY) && ((stav==jizda)||(stav==cihla))) // Tunel |
{ |
if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu |
{ |
LogLog(0xDD,16); // Priznak tunelu; dalsi mereni nejdrive po ujeti 48 cm |
rr=rrold; // Vjeli jsme do tunelu, znovu jed rychle |
} |
}; |
*/ |
//ODODO |
ododo=get_timer1(); |
if((ododo>odo_preruseni)&&(ododo<(odo_preruseni+8))) rr=RR_PRERUSENI; |
if((ododo>odo_cihla)&&(ododo<(odo_cihla+8))) rr=RR_PRERUSENI; |
if((ododo>odo_tunel)&&(ododo<(odo_tunel+8))) rr=RR_PRERUSENI; |
if((ododo>odo_problem1)&&(ododo<(odo_problem1+8))) rr=RR_PRERUSENI; |
if((ododo>odo_problem2)&&(ododo<(odo_problem2+8))) rr=RR_PRERUSENI; |
if((ododo>odo_problem3)&&(ododo<(odo_problem3+8))) rr=RR_PRERUSENI; |
// Elektronicky diferencial 2. cast |
if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN); // Neco jako nasobeni |
if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN); // rozsah 1 az 92 pro rr=0 // rozsah 1 az 154 pro rr=63 |
//!!! pro zatuhle prevodovky |
// r1<<=1; // Rychlost je dvojnasobna |
// r2<<=1; // Rozsah 2 az 184 pro rr=0 |
if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle)) // Jizda |
{ |
set_pwm1_duty(r1); |
set_pwm2_duty(r2); |
} |
else |
{ |
set_pwm1_duty(0); // Zastaveni |
set_pwm2_duty(0); |
}; |
if((stav==rozjezd)&&(get_timer1()>10)) // musi ujet alespon 31cm |
{ |
ext_int_edge(H_TO_L); // Nastav podminky preruseni od cihly |
INT0IF=0; // Zruseni predesle udalosti od startera |
enable_interrupts(INT_EXT); |
enable_interrupts(GLOBAL); |
stav=jizda; |
}; |
if(stav==start) // Snimkuje, toci servem a ceka na start |
{ |
set_adc_channel(MODRA); // Kroutitko na vystredeni predniho kolecka |
Delay_ms(1); |
stred=read_adc(); |
if(!input(PROXIMITY)) |
{ |
disp(0x80); |
while(input(PROXIMITY)); // Cekej, dokud starter neda ruku pryc |
set_timer1(0); // Vynuluj citac odometrie |
set_pwm1_duty(255); // Rychly rozjezd !!! Zkontrolovat na oscyloskopu |
set_pwm2_duty(255); |
disp(0x01); |
while(get_timer1()<=4) // Ujed alespon 12cm |
{ |
set_adc_channel(LMAX); // Levy UV sensor |
delay_us(40); |
if(read_adc()<THR) {cas=CASMIN; break;}; // Prejeli jsme caru vlevo |
set_adc_channel(RMAX); // Pravy UV sensor |
delay_us(40); |
if(read_adc()<THR) {cas=CASMAX; break;}; // Prejeli jsme caru vpravo |
cas=CASAVR-CASMIN; // Cara je rovne |
}; |
stav=rozjezd; |
}; |
} |
pom=0x80; // Zobrazeni pozice cary na displayi |
for(n=CASMAX/8; n<cas; n+=CASMAX/8) pom>>=1; |
disp(pom); |
while(true) // Ve zbytku casu snimku cti krajni UV senzory a naraznik |
{ |
if(BUMPER) // Sakra, do neceho jsme narazili a nevideli jsme to! |
{ |
bum(); |
SaveLog(); // Zapis Black Boxu do EEPROM |
delay_ms(TUHOS); //!!! Zatuhle prevodovky |
set_pwm1_duty(200); // pomalu vpred |
set_pwm2_duty(200); |
output_low(MOT_L); |
output_low(MOT_R); |
cas=CASAVR-CASMIN; |
}; |
set_adc_channel(LMAX); // Levy UV sensor |
for(n=0;n<20;n++) if(input(HREF)) goto next_snap; |
if(read_adc()<THR) cas=CASMIN; |
set_adc_channel(RMAX); // Pravy UV sensor |
for(n=0;n<20;n++) if(input(HREF)) goto next_snap; |
if(read_adc()<THR) cas=CASMAX; |
}; |
} |
} |
/Designs/ROBOTS/Camerus/sw/camerus.h |
---|
0,0 → 1,16 |
#include <16F876A.h> |
#device adc=8 |
#FUSES NOWDT //No Watch Dog Timer |
#FUSES HS //High speed Osc (> 4mhz) |
#FUSES NOPUT //No Power Up Timer |
#FUSES NOPROTECT //Code not protected from reading |
#FUSES NODEBUG //No Debug mode for ICD |
#FUSES NOBROWNOUT //No brownout reset |
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O |
#FUSES NOCPD //No EE protection |
#FUSES NOWRT //Program memory not write protected |
#use delay(clock=20000000) |
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3,force_hw) |
/Designs/ROBOTS/Camerus/sw/diag.c |
---|
0,0 → 1,68 |
//--- Diagnostika cidel a vymazani EEPROM --- |
void diag() |
{ |
int8 n; |
// Vymaz Black Box v EEPROM |
for(n=0;n<255;n++) write_eeprom(n,0); |
bb_l[0]=0; // Zapis na pozici 0 vzdalenost 0 |
bb_h[0]=0; |
bb_f[0]=0; |
write_eeprom(EEMAX,0); // Zapis do EEPROM pocet zaznamu 0, tedy jeden zaznam |
for(n=0;n<=4;n++) |
{ |
disp(0x55); // Blikni pro potvrzeni |
delay_ms(200); |
disp(0xAA); |
delay_ms(200); |
}; |
while(true) |
{ |
if(!IRRX) |
{ |
int8 ble; |
i2c_start(); // Cteni kompasu |
i2c_write(COMPAS_ADR); |
i2c_write(0x1); |
i2c_stop(); |
i2c_start(); |
i2c_write(COMPAS_ADR+1); |
ble=i2c_read(0); |
i2c_stop(); |
disp(ble); |
delay_ms(200); |
} |
else |
{ |
i2c_start(); // Diagnostika sonaru |
i2c_write(SONAR_ADR); |
i2c_write(0x02); // dosah |
i2c_write(0x03); // n*43mm |
i2c_stop(); |
i2c_start(); |
i2c_write(SONAR_ADR); |
i2c_write(0x01); // zesileni |
i2c_write(0x01); // male, pro eliminaci echa z minuleho mereni |
i2c_stop(); |
i2c_start(); // Sonar Ping |
i2c_write(0xE0); |
i2c_write(0x0); |
i2c_write(0x51); // 50 mereni v palcich, 51 mereni v cm, 52 v us |
i2c_stop(); |
delay_ms(100); |
i2c_start(); // Odraz ze sonaru |
i2c_write(0xE0); |
i2c_write(0x3); |
i2c_stop(); |
i2c_start(); |
i2c_write(0xE1); |
n=i2c_read(0); |
i2c_stop(); |
disp(n); // Zobrazeni hodnoty ze sonaru a zaroven diagnostika predniho IR cidla |
delay_ms(200); |
} |
} |
} |
/Designs/ROBOTS/Camerus/sw/objizdka_L.c |
---|
0,0 → 1,183 |
// **** Objeti cihly vlevo **** LLLL |
#define L_TOUCH 1 // Cara vlevo |
#define R_TOUCH 2 // Cata vpravo |
#define B_TOUCH 3 // Both |
int8 n; |
int8 r1,r2,rr; |
int8 touch; |
enum okolo_cihly {pred_carou,na_care,po_care}; |
okolo_cihly ridic; // V jakem jsme stavu objizdeni cihly |
int8 vzdalenost; |
int8 visualisation; |
stav=cihla; // Dalsi prekazku uz nezaznamenavej (je to s velkou pravdepodobnosti cil) |
odocounter=get_timer1(); |
cihla: |
rr=RR_CIHLA; //!!! Rozumna rychlost pro objizdeni cihly (bylo by lepsi rychlost zvysovat) a pri detekci pohybu zase snizit |
disp(0x99); |
set_pwm1_duty(0); // zabrzdi levym kolem, prave vpred |
set_pwm2_duty(255); |
output_high(MOT_L); |
output_low(MOT_R); |
while(true) // Na zacatku se vyhni cihle, zatoc co muzes |
{ |
cas=CASMIN-5; // jeste vic nez hodne do leva |
if(BUMPER) // Narazili jsme do cihly, musime couvnout! |
{ |
bum(); |
SaveLog(); // Zapis Black Boxu do EEPROM |
delay_ms(TUHOS); //!!! Zatuhle prevodovky |
brzda(); |
goto cihla; // Znovu zacni cihlu objizdet |
}; |
set_pwm1_duty(0); |
set_pwm2_duty(255); // !!! mozna prilis maly vykon pro rozjezd pro zatuhlou prevodovku |
output_high(MOT_L); // leve kolo reverz |
output_low(MOT_R); // prave kolo vpred |
if(get_timer1()>(odocounter+5)) // konec zatacky? |
{ |
disp(0x66); |
break; |
} |
SetServoQ(cas); |
delay_ms(18); |
}; |
//------ Objeti cihly v konstantni vzdalenosti ------ |
touch=0; // Indikator detekce cary pri objizdeni |
ridic=pred_carou; |
cas=CASAVR-CASMIN; // rovne |
output_low(MOT_L); // vpred |
output_low(MOT_R); |
visualisation=0; |
while(true) |
{ |
if(BUMPER) // Narazili jsme do cihly, musime couvnout! |
{ |
bum(); |
SaveLog(); // Zapis Black Boxu do EEPROM |
delay_ms(TUHOS); //!!! Zatuhle prevodovky |
set_pwm1_duty(160); // vpred |
set_pwm2_duty(160); |
output_low(MOT_L); |
output_low(MOT_R); |
cas=CASMIN; |
}; |
delta_bearing=bearing-bearing_offset; |
visualisation=(delta_bearing & 0xF0) | (visualisation & 0x0F); |
if(IRRX) // hrozi celni srazka s cihlou v prubehu objizdeni |
{ |
cas=CASMIN; |
} |
else |
{ |
if((vzdalenost!=0)||!input(PROXIMITY)||((delta_bearing>60)&&(delta_bearing<128))) // Udrzovani konstantni vzdalenosti od cihly |
{ |
if(cas>(CASMIN+30)) cas-=30; |
} |
else |
{ |
if(cas<(CASMAX-30)) cas+=30; |
}; |
}; |
// Elektronicky diferencial |
if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace |
if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;}; // pro rizeni rychlosti motoru |
if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92 |
if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN); // Neco jako nasobeni |
if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN); |
//!!! pro zatuhle prevodovky |
// r1<<=1; // Rychlost je dvojnasobna |
// r2<<=1; // Rozsah 2 az 184 pro rr=0 |
set_pwm1_duty(r1); // Nastav rychlost motoru |
set_pwm2_duty(r2); |
SetServoQ(cas); |
i2c_start(); // Sonar Ping |
i2c_write(SONAR_ADR); |
i2c_write(0x0); |
i2c_write(0x52); // mereni v us |
i2c_stop(); |
for(n=1;n<=90;n++) // 18ms testovani cary do dalsi korekce serva |
{ |
set_adc_channel(LMAX); |
delay_us(100); |
if(read_adc()<THR) touch|=L_TOUCH; |
set_adc_channel(RMAX); |
delay_us(100); |
if(read_adc()<THR) touch|=R_TOUCH; |
}; |
i2c_start(); // Odraz ze sonaru |
i2c_write(SONAR_ADR); |
i2c_write(0x3); |
i2c_stop(); |
i2c_start(); |
i2c_write(SONAR_ADR+1); |
vzdalenost=i2c_read(0); |
i2c_stop(); |
i2c_start(); // Cteni kompasu |
i2c_write(COMPAS_ADR); |
i2c_write(0x1); // uhel 0-255 |
i2c_stop(); |
i2c_start(); |
i2c_write(COMPAS_ADR+1); |
bearing=i2c_read(0); |
i2c_stop(); |
if(touch==L_TOUCH) visualisation|=0x2; |
if(touch==R_TOUCH) visualisation|=0x1; |
if((touch==B_TOUCH)&&(ridic==pred_carou)) ridic=na_care; |
if((ridic==na_care)&&(touch==0)) break; |
if(ridic==na_care) touch=0; |
disp(visualisation); |
}; |
disp(0xC3); |
set_pwm1_duty(0); //!!! pred zatuhlejma prevodovkama tam bylo 20 a 200 |
set_pwm2_duty(255); |
output_high(MOT_L); |
output_low(MOT_R); |
delay_us(40); |
odocounter=get_timer1(); // Poznamenej aktualni stav odometrie |
while (true) // Znovu se musime dotknout cary |
{ |
for(n=1;n<=90;n++) // 18ms testovani cary do dalsi korekce serva |
{ |
set_adc_channel(LMAX); // Levy UV sensor |
delay_us(100); |
if(read_adc()<THR) // Dotkli jsme se levym senzorem |
{ |
disp(0xE0); |
cas=CASAVR-CASMIN; // nastavime, ze cara je rovne |
goto cara; |
}; |
set_adc_channel(RMAX); // Pravy UV sensor |
delay_us(100); |
if((get_timer1()>=(odocounter+2)) && (read_adc()<THR)) // Pravym senzorem nesmime caru prejet! |
{ |
disp(0x07); |
cas=CASMAX; // kdyz prejedem, tak nastavime, ze cara je vpravo |
goto cara; |
}; |
} |
SetServoQ(CASMIN-5); // max. max. doleva L |
} |
cara: |
output_low(MOT_L); // oba motory vpred |
output_low(MOT_R); |