Problem with comparison.
/Designs/ROBOTS/Camerus/htm/index.htm |
---|
0,0 → 1,489 |
<html> |
<head> |
<meta http-equiv="Content-Language" content="cs"> |
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> |
<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><span lang="en-us">; <font size="2">M. Novot</font></span><font size="2">ný</font><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 <span lang="en-us">v</span>dy 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 kalendáøní mìsíc veèerù/weekendù na |
programování. Nyní s odstupem èasu vidíme, e co se týká objetí cihly, chybìlo |
nám 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 fiktivního èárového kódu 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í tlouka. 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é tlouky. 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é tlouky, 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 pùvodních 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 mení 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 napùl 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 z 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 on/off 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á zajiuje 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 kompasu 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 øeili a poslední weekend pøed soutìí a pøitom vyadoval tak zásadní |
zásah jako rozebrání objektivu kamery, co znamenalo peèlivé èitìní pouzdra a |
è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. Prokluzovala... 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í nedìli 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. </font></p> |
<p align="left"><font face="Times New Roman">Pøi manipulaci s pravou pøevodovkou |
se podaøilo ulomit vývod od IR závory na odometrii. Protoe nela vymìnit (je |
zalepená v pàevodovce)a nechtìli jsme mìnit celou pøevodovku, natavili jsme její |
pouzdro pájkou a drátek pøiletovali na pahýl vývodu.<br> |
<br> |
Po rozebrání bylo nutné pøevodovky nechat znovu zabìhnout, 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! (Pozdìjí analýzou záznamu pouitého dílu bylo zjitìno, e motor è.2 byl pouit spolu s pùvodním podvozkem na výstavì Vzdìlání a Øemeslo v Èeských Budìjovicích, kde byla levotoèivá tra a jeho provozní doba tak vzrostla o desítky hodin proti motoru è.1<span lang="en"> .</span>) |
Po výmìnì motoru jsme vrátili 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 |
jednak regulátorem v software a také koncepcí podvozku, 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ála è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/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/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); |