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&#283;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>
&nbsp;</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&#283;ž IstRobot pro kategorii Stopár (<a href="http://www.robotika.sk/contest/">http://www.robotika.sk/contest/</a>).
<br>
<br>
Snažili jsme se technickou dokumentaci pojmout pon&#283;kud netradi&#269;n&#283;. Krom&#283;
popisu finální verze robota zde naleznete chronologický popis jeho vývoje a
popis všech slepých uli&#269;ek. Doufáme, že takováto forma dokumentace bude mít pro
naše následovníky v&#283;tší hodnotu než pouhý návod na zopakování konstrukce.<br>
&nbsp;</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&#269;al p&#345;ed více jak dv&#283;ma roky vývojem
robota 3Orbis. Robot 3Orbis m&#283;l mít novou revolu&#269;ní koncepci podvozku. Použili
jsme t&#345;íkolý podvozek, který m&#283;l dv&#283; hnaná kola, každé s&nbsp;nezávislým motorem a
t&#345;etí kolo, které m&#283;lo &#345;ízené zatá&#269;ení. Jednalo se tedy o nonholonomní podvozek.
Koncepci podvozku jsme nejd&#345;íve ov&#283;&#345;ovali se dv&#283;ma senzory na &#269;áru, jako to m&#283;ly
naši p&#345;edchozí holonomní roboti. To moc nefungovalo a proto jsme p&#345;idali další
senzory, pomocí kterých se diskrétn&#283; nastavoval úhel zatá&#269;ecího kole&#269;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&nbsp;t&#345;íkolým a t&#345;í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&#367; na &#269;áru</font></p>
<p align="left"><font face="Times New Roman"><br>
P&#345;idáním dalších senzor&#367; na &#269;áru jsme se dostali do problém&#367; s&nbsp;po&#269;tem vstup&#367;
použitého procesoru (PIC16F88). Tento problém jsme vy&#345;ešili tak, že jsme na
zpracování signál&#367; ze senzor&#367; na &#269;áru použili další samostatný procesor. Toto
&#345;ešení se však pozd&#283;ji neukázalo jako výhodné, protože ladit distribuovaný kód
bylo &#345;ádov&#283; obtížn&#283;jší a navíc se musela naprogramovat komunikace mezi procesory.
&#268;asto se nám také stávalo, že jsme b&#283;hem vývoje do jednoho procesoru nahráli kód
pro druhý procesor, což kupodivu ob&#269;as trvalo ur&#269;itou dobu, než jsme na to
p&#345;išli.<br>
&nbsp;</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&#345;ední náhon; p&#345;idáno druhé patro na
elektroniku<br>
&nbsp;</font></p>
<p align="left"><font face="Times New Roman">P&#367;vodní koncepce p&#345;edpokládala hnaná kola vp&#345;edu a zatá&#269;ecí kolo vzadu.
Modelá&#345;ské servo však nedokázalo dostate&#269;n&#283; rychle zatá&#269;et, p&#345;estože bylo
zp&#345;evodováno do rychla p&#345;evodem 1:2. Zm&#283;nili jsme proto uspo&#345;ádání na hnanou
nápravu vzadu a zatá&#269;ecí kole&#269;ko vp&#345;edu. To nám umož&#328;ovalo „ost&#345;e &#345;ezat zatá&#269;ky“,
ale objevily se další problémy. Podvozek se v&nbsp;zatá&#269;kách dostával do smyku a
protože hmotnost &#269;idel byla nezanedbatelná, docházelo i k&nbsp;jeho nakláp&#283;ní a
následn&#283; k&nbsp;falešnému signálu z&nbsp;&#269;idel, protože &#269;idla nebyla držena v&nbsp;konstantní
vzdálenosti od povrchu.<br>
<br>
Pro 3Orbise byla vysoustružena duralová kola, pro která bylo plánováno obutí „O“
kroužky. To se pak ukázalo jako nepoužitelné. „O“ kroužky se nedokázaly udržet
v&nbsp;drážkách na kolech. P&#367;vodní kola byla tedy nahrazena plastovými z&nbsp;d&#283;tské
hra&#269;ky. Kola m&#283;la menší pr&#367;m&#283;r, což zlepšilo p&#345;evodový pom&#283;r, který byl pro
vyrobené p&#345;evodovky 5:1. Jako obutí byly použity ust&#345;ižené prsty z&nbsp;latexových
rukavic pro domácnost. Jako obutí zatá&#269;ecího kole&#269;ka bylo použito pryžové
t&#283;sn&#283;ní 12x10x2. Na zatá&#269;ecí kole&#269;ko bylo obuto tak, že se jelo po hran&#283; t&#283;sn&#283;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&#269;ka z&nbsp;autobusu
od syna pana Hronka.<br>
Je vid&#283;t &#269;idlo na hledání hrany cihly.</font></p>
<p align="left"><font face="Times New Roman"><br>
Pro detekci a objížd&#283;ní cihly byly na robotovi namontovány IR senzory. Jeden m&#283;l
detekovat p&#345;ekážku na dráze a zbylé dva m&#283;ly sloužit pro její objetí. Objetí
cihly pomocí IR senzor&#367; jsme však nedokázali odladit. Objížd&#283;ní nebylo
spolehlivé a tak robot nakonec objížd&#283;l cihlu naslepo. <br>
P&#345;i sout&#283;ži se objevil ne&#269;ekaný problém, kv&#367;li kterému robot nakonec nedojel.
Sout&#283;žní dráha je tvo&#345;ena dv&#283;ma deskami. Desky nejsou dokonale slícovány a tak
mezi nimi vzniká tmavá mezera. Tato mezera byla na sout&#283;žní dráze p&#345;elepena
bílou lepicí páskou. Bohužel &#269;idla na &#269;áru, které robot používal, vyhodnocovala
bílou lepicí pásku jako &#269;ernou (&#269;idla pracují blízko ultrafialové oblasti).
Tento problém by šel kompenzovat programov&#283;, ale na sout&#283;ži se nepoda&#345;ilo
program v&nbsp;&#269;asové tísni správn&#283; upravit. Robot tedy nakonec nedojel.<br>
<br>
Odhadovali jsme, že nám chyb&#283;l tak týden na odlad&#283;ní firmware, protože v&nbsp;roce
2006 u nás byla povode&#328; a ztratili jsme tak nejmén&#283; jeden m&#283;síc ve&#269;er&#367; na
programování. Nyní s&nbsp;odstupem &#269;asu vidíme, že co se týká objetí cihly, chyb&#283;lo
mnohem více.<br>
&nbsp;</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&#283;žkᓠ&#269;idla p&#345;edsunutá p&#345;ed robota a tak odstranit p&#345;ekláp&#283;ní v&nbsp;ostrých
zatá&#269;kách. &#344;ešením by bylo zv&#283;tšení dosahu &#269;idel na &#269;áru tak, aby mohla být
umíst&#283;na co nejblíže k&nbsp;ose otá&#269;ení robota. Zárove&#328; by se tím snížila obvodová
setrva&#269;ná hmotnost robota. Znovu jsme použili t&#345;íkolý podvozek s&nbsp;jedním &#345;ízeným
zatá&#269;ecím kole&#269;kem, p&#345;estože na IstRobotu 2006 byla tato konfigurace diskutována
a auto&#345;i druhého robota s&nbsp;podobnou koncepcí se v&nbsp;diskusi vyjád&#345;ili, že to nebyl
dobrý nápad, že robot p&#345;i v&#283;tších rychlostech má snahu se rozkmitávat. &#344;ešení
tohoto problému jsme vid&#283;li ve zjemn&#283;ní snímání &#269;áry tak, aby se precizn&#283;ji
nastavovalo zatá&#269;ecí kole&#269;ko.<span lang="en-us"> </span>Napadlo nás použít laserovou &#269;te&#269;ku &#269;árového kódu a skute&#269;n&#283; jsme postavili
funk&#269;ního robota (viz Obrázek 5), který dokázal, ale pomalu, jezdit po &#269;á&#345;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&#283;t &#269;ervená stopa LASERu.</font></p>
<p align="left"><font face="Times New Roman"> <br>
Problémy s&nbsp;touto konstrukcí byly dva. Pokud byl na dráze hrbol, tak se v&nbsp;d&#367;sledku
vibrací zmenšil rozkmit laseru, protože laser je ve &#269;tecím za&#345;ízení rozmítáván
mechanicky zrcátkem, které vibruje a velké stranové zrychlení p&#345;i p&#345;ejetí hrbolu
zp&#367;sobovalo, že elektromagnetický mechanismus, který pohybuje zrcátkem vypadl z&nbsp;rezonance.
Tento problém by ovšem z&#345;ejm&#283; šlo kompenzovat softwarem, protože se &#269;ára &#269;etla
v&nbsp;obou sm&#283;rech pohybu zrcátka. Jednou jsme tedy dostali polohu &#269;áry m&#283;&#345;enou z
leva a jednou z prava.<br>
<br>
Druhý problém byl závažn&#283;jší. Protože bylo použito za&#345;ízení na &#269;tení &#269;árového
kódu, snímali jsme vlastn&#283; polohu jedné &#269;áry ve scanovaném prostoru. V&nbsp;prudké
zatá&#269;ce však dochází k&nbsp;tomu, že &#269;áru vidí sníma&#269; šikmo a tak se relativn&#283;
zv&#283;tšuje její tlouš&#357;ka. Vnit&#345;ní elektronika sníma&#269;e vyhodnotila tento stav, jako
že se nejedná o &#269;árový kód a &#269;áru vyfiltrovala. To samoz&#345;ejm&#283; m&#283;lo v&nbsp;ostré
zatá&#269;ce fatální následky. Dále jsme touto cestou nepokra&#269;ovali, p&#345;esto, že víme,
že v&nbsp;závod&#283; DARPA se &#269;asto používají laserové dálkom&#283;ry. Na sout&#283;žních vozech je
však vid&#283;t, že konstrukté&#345;i také mají problémy s&nbsp;odtlumením vibrací.<br>
&nbsp;</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&#345;il nápad, použít pro snímání &#269;áry kameru. To už nás napadlo
n&#283;kolikrát, ale když jsme nápad analyzovali, vždy se ukázalo, že jednoduchým
jedno&#269;ipovým mikropo&#269;íta&#269;em nelze zpracovávat obraz kamery. Druhým problémem je,
že b&#283;žn&#283; dostupné kamery mají snímkový kmito&#269;et 50Hz, což se nám zdálo na
snímání &#269;áry pomalé.<span lang="en-us"> </span>P&#345;esto jsme zakoupili jednu kameru a za&#269;ali jsme osciloskopem testovat, co tak
kamera vidí a jak by se to dalo zpracovat. Kupodivu jsme zjistili, že s&nbsp;procesorem
na 20MHz stíháme na&#269;íst jeden obrazový &#345;ádek asi s&nbsp;polovi&#269;ním rozlišením. To
bylo povzbudivé a zam&#283;&#345;ili jsme se tímto sm&#283;rem.<br>
Druhým problémem bylo, že kamera nesnímá kontrastní obraz. Jak se vypo&#345;ádat v&nbsp;jedno&#269;ipovém
po&#269;íta&#269;i s&nbsp;tímto problémem, když jeho výpo&#269;etní výkon sta&#269;í sotva na na&#269;tení
&#345;ádku a ješt&#283; se musí po&#269;ítat regulace pro elektronický diferenciál? (Pro
zvolenou koncepci podvozku je nutné diferencovat otá&#269;ky motor&#367; na hnaných
nápravách.)<br>
<br>
Problém jsme vy&#345;ešili n&#283;&#269;ím, &#269;emu jsme pracovn&#283; za&#269;ali &#345;íkat „digitální
komparátor“. Jednoduše jsme pomocí logických hradel provedli OR t&#345;ech nejvyšších
bit&#367; jasového signálu z&nbsp;kamery. Všechno co bylo pod 0x1F bylo tedy &#269;erné a
všechno nad bylo bílé. Expozici kamery pak bylo nutné nastavit tak, aby
nejsv&#283;tlejší &#269;erná &#269;ára, byla ješt&#283; &#269;erná. To se ud&#283;lalo snadno osciloskopem,
ale pro závod bylo nutné vyvinout n&#283;jakou strategii, jak robot provede ur&#269;ení
expozice. &#344;ešením byla rutina „Expozimetr“, která postupn&#283; zvyšuje expozi&#269;ní &#269;as
a hledá ve snímku (samoz&#345;ejm&#283;, že v&nbsp;našem p&#345;ípad&#283; na jedné &#345;ádce) &#269;áru
definované tlouš&#357;ky. Vychází se z&nbsp;toho, že nejd&#345;íve p&#345;i podexponování je &#269;erný
celý obrázek, pak se postupn&#283; obrázek vyjas&#328;uje, což je ovšem díky chyb&#283;
apertury objektivu nerovnom&#283;rné. Dalším zvyšováním &#269;asu expozice se nakonec
objeví &#269;ára správné tlouš&#357;ky, ta se pak dále zten&#269;uje a nakonec je snímek
p&#345;epálen a &#269;ára zmizí. Samoz&#345;ejm&#283; se p&#345;edpokládalo, že na startu robot &#269;áru vidí
a ta je p&#345;ed ním p&#345;ibližn&#283; uprost&#345;ed. <br>
<br>
První pokusy vypadaly velmi optimisticky, robot se držel &#269;áry a vyjel jenom
ob&#269;as. Zajímavé bylo, že robot dokázal jezdit jenom po dráze, kde nebyly zatá&#269;ky
doleva! Protože jsme nem&#283;li k&nbsp;dispozici obraz z&nbsp;kamery, aby bylo možné
zkontrolovat co kamera vidí, bylo nutné tento problém &#345;ešit pouhou úvahou.
Napadlo nás, že m&#367;že docházet k „vytrhávání obrazu“ na krajích snímku.
Kompenzovalo se to tím, že se zahazovaly okraje &#345;ádku a skute&#269;n&#283; to pomohlo,
robot spolehliv&#283;, i když pomalu, sledoval &#269;áru. To byl velký úsp&#283;ch, protože
kdyby nám n&#283;kdo &#345;ekl p&#345;ed rokem, že to s&nbsp;kamerou a jedno&#269;ipovým po&#269;íta&#269;em jde, a
že je to spolehlivé, asi by jsme mu nev&#283;&#345;ili.<br>
<br>
Po prvotních úsp&#283;ších jsme zkusili zrychlit jenže to nefungovalo, robot vždy
vypadl z&nbsp;dráhy, když se zatá&#269;ecí kole&#269;ko oto&#269;ilo o velký úhel. Napadlo nás, že
to m&#367;že být zp&#367;sobeno proudovými špi&#269;kami, které zp&#367;sobuje motor serva. Pro
stabilizaci napájení pro elektroniku byl totiž použit lineární stabilizátor s&nbsp;velkým
drop-outem. Proto jsme vyvinuli m&#283;ni&#269;, který i p&#345;i poklesu nap&#283;tí baterií o 2V
dokázal udržet nap&#283;tí pro &#345;ídící elektroniku a zejména kameru stabilní. Po tomto
vylepšení už robot dosahoval pom&#283;rn&#283; slušné rychlosti a nejzajímav&#283;jší bylo, že
díky „velké“ rozlišovací schopnosti kamery (procesor dokázal rozlišit asi 50
bod&#367;) byla jízda v&nbsp;zatá&#269;kách velmi plynulá.<br>
<br>
Problém s&nbsp;tmou v&nbsp;tunelu byl vy&#345;ešen jednoduše tak, že si robot celou cestu
svítil. Na osv&#283;tlení dráhy byly použity &#269;ervené LED. Nevíme, jaká barva pro
osv&#283;tlení dráhy je nejlepší, eventueln&#283;, jestli je lepší svítit bíle. S&nbsp;tím jsme
už nestihli p&#345;ed sout&#283;ží experimentovat.<br>
<br>
Protože použitý procesor PIC16F876A neumí násobit a v&#367;bec jeho výpo&#269;etní výkon
není omra&#269;ující (kdybychom ho ale m&#283;li p&#345;ed lety, tak by jsme si ur&#269;it&#283;
nest&#283;žovali), byl celkem problém naprogramovat elektronický diferenciál na
hnanou nápravu. Nakonec se to vy&#345;ešilo procedurou „jakonásobení“, která
kombinací rotací a podmín&#283;ného s&#269;ítání provádí rychle pot&#345;ebný výpo&#269;et s&nbsp;uspokojivou
p&#345;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&#283;ni&#269; v&nbsp;krabi&#269;ce od &#269;aje a primitivní
osv&#283;tlení dráhy.<br>
&nbsp;</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&#345;ítel &#269;lov&#283;ka.</font></p>
<p align="left"><font face="Times New Roman">Za&#269;ali jsme tedy testovat pro sledování &#269;áry asi nejobtížn&#283;jší v&#283;c, dlouhou
rovinku a na konci pravoúhlou zatá&#269;ku. P&#345;i dalším zvyšování rychlosti za&#269;al
robot v&nbsp;takové zatá&#269;ce vypadávat. Ne, že by p&#345;ímo vyjel a nevrátil se na dráhu,
ale polom&#283;r zatá&#269;ení byl menší než polom&#283;r zatá&#269;ky a hrozilo tedy, že v&nbsp;Bratislav&#283;
spadne ze stolu. Ud&#283;lali jsme p&#345;edpoklad, že je to zp&#367;sobeno pomalým snímkovým
kmito&#269;tem kamery, než si robot sta&#269;il všimnout, že je zatá&#269;ka ostrá, zmizela mu
&#269;ára ze zorného pole.<br>
<br>
Dalším problémem bylo, že pokud bylo nerovnom&#283;rné osv&#283;tlení dráhy, vypadával
kame&#345;e obraz. Kamera má sice AGC, ale samoz&#345;ejm&#283;, že je schopna kompenzovat
rozdíly jasu jenom v&nbsp;ur&#269;itých mezích. Kupodivu nebyl problém v&nbsp;tunelu, kde si
robot svítí, ale velký problém byl s&nbsp;denním sv&#283;tlem, pokud p&#345;icházelo pouze z&nbsp;jednoho
sm&#283;ru.<br>
<br>
Konstruk&#269;ní &#345;ešení, které následovalo, bylo dopln&#283;ní dvou modrých &#269;idel po
stranách robota na sledování &#269;áry. &#268;idla byla umíst&#283;na tak, že vid&#283;la &#269;áru, až
když &#269;ára byla mimo zorné pole kamery a uplat&#328;ovala se pouze v&nbsp;p&#345;ípad&#283;, že
kamera &#269;áru nevidí. To velmi zvýšilo spolehlivost sledování &#269;áry. Zárove&#328; jsme
tato &#269;idla použili pro op&#283;tovné vyhledání &#269;áry po objetí cihly, protože jsme se
báli pro tento úkol použít kameru, protože po dobu objížd&#283;ní cihly kamera nevidí
kontrastní obrázek (nevidí &#269;áru) a díky AGC by mohla zaznamenat stín nebo špínu
na trati jako &#269;áru. <br>
<br>
Na objížd&#283;ní cihly byl robot Camerus vybaven odometrií na pravém kole. Využili
jsme otvor&#367; ve v&#283;tším kole p&#345;evodovky a IR závory z&nbsp;tiskárny. Citlivost
o<span lang="en-us">d</span>ometrie nebyla velká (4 impulzy na jednu otá&#269;ku kole&#269;ka (12,6mm)).<br>
&nbsp;</font></p>
<p align="left"><b><font face="Times New Roman" size="4">Jak jsme jeli „ladit“ do Vídn&#283;</font></b></p>
<p align="left"><font face="Times New Roman">Vše pot&#345;ebné bylo naprogramováno, robot sledoval &#269;áru. P&#345;erušení ned&#283;lalo
problémy, prost&#283; byl výpadek obrazu a robot pokra&#269;oval v&nbsp;p&#367;vodním sm&#283;ru p&#345;ed
p&#345;erušením. Cihla byla &#345;ešena pomocí odometrie. Takto vybaveni jsme odjeli do
Vídn&#283; na Robot Challenge 2007. &#344;ekli jsme si, že to tam odladíme, protože jsou
tam jednodušší podmínky než v&nbsp;Bratislav&#283; (alespo&#328; na první pohled, robot m&#367;že
být v&#283;tší a tunel je také v&#283;tší, takže robot nemusí jet tak p&#345;esn&#283;).<br>
<br>
Rozhodnutí ladit robota na Robot Challenge se ukázalo jako správné. Podmínky
totiž byly náro&#269;né. Bodové osv&#283;tlení, dráha složená z&nbsp;desek s&nbsp;mezerami, styl
sout&#283;že play-off.<br>
<br>
Camerus ur&#269;it&#283; jezdil nejrychleji, ale nedokázal objet cihlu! Jednou se stalo,
že uvid&#283;l mezeru mezi deskami, podruhé mu z&#345;ejm&#283; proklouzlo kole&#269;ko s&nbsp;odometrií,
prost&#283; katastrofa! Alespo&#328;, že byl t&#345;etí v&nbsp;paralelním slalomu, to jsme mu ale
zavinili my, protože jsme mu p&#345;i zkoušení objetí cihly stáhli výkon motor&#367; a pak
jsme na to zapomn&#283;li. Za t&#345;etí místo tedy nemohl robot, ale lidský faktor.<br>
<br>
&nbsp;</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 &#269;íslo 1. Na dráze jsou patrné stíny od bodového osv&#283;tlení.<br>
&nbsp;</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 &#269;idel na bezpe&#269;né objetí p&#345;ekážky.<br>
&nbsp;</font></p>
<p align="left"><font face="Times New Roman">Jednozna&#269;n&#283; se ukázalo, že objížd&#283;t p&#345;ekážku „naslepo“ není dobrá strategie a
zejména, pokud je odometrie na hnané náprav&#283;.<br>
&nbsp;</font></p>
<p align="left"><font face="Times New Roman" size="4"><b>Co s&nbsp;cihlou?</b></font></p>
<p align="left"><font face="Times New Roman">Další vývoj jsme v&#283;novali objížd&#283;ní cihly za pomoci &#269;idel. Jaká &#269;idla ale použít?
M&#283;li jsme špatné zkušenosti s&nbsp;IR &#269;idly s&nbsp;3Orbise a roboty s&nbsp;ultrazvukem jsme
zase na minulých ro&#269;nících vid&#283;li, že si spletli tunel s&nbsp;cihlou, p&#345;ípadn&#283;
nevid&#283;li cihlu, pokud se k&nbsp;ní blížili zešikma.<br>
<br>
Nev&#283;d&#283;li jsme co s&nbsp;tím a tak jsme za&#269;ali zkoušet. M&#283;&#345;ili jsme, co „vidí“
ultrazvuk a co r&#367;zná optická &#269;idla. P&#345;i m&#283;&#345;ení se ukázaly všechny p&#345;edpokládané
problémy. Ultrazvuk vidí kde co, jenom ne cihlu, když je šikmo. IR sníma&#269; vidí
cihlu sice spolehliv&#283;, ale stejn&#283; dob&#345;e jako velkou bílou ze&#271; n&#283;kolik metr&#367;
daleko. Nakonec byla pro cihlu zvolena kombinace sedmi senzor&#367;. Skute&#269;n&#283; &#269;tete
dob&#345;e, sedmi! Jeden IR senzor vp&#345;edu na detekci p&#345;iblížení se k&nbsp;cihle. Funguje
na principu triangulace. IR vysílací dioda má úzkou hliníkovou trubi&#269;kou zúžen
paprsek, aby nedocházelo k&nbsp;jeho integraci na velké vzdálené ploše. Další dva
senzory jsou mikrospína&#269;e na mechanickém nárazníku, kdyby se stalo, že
triangula&#269;ní &#269;idlo cihlu p&#345;ehlédne. To se m&#367;že stát v&nbsp;prudké zatá&#269;ce. Z&nbsp;boku
jsou pak ultrazvukový senzor a dálkom&#283;r s&nbsp;&#269;ervenou LED. Tyto &#269;idla udržují
konstantní vzdálenost od cihly p&#345;i jejím objížd&#283;ní. K&nbsp;tomu ješt&#283; již zmín&#283;ná
odometrie na pravém kole&#269;ku, která zajiš&#357;uje prudkou zatá&#269;ku doleva jakmile je
cihla detekována a nakonec kompas, který zabra&#328;uje, aby se robot vracel zp&#283;t po
trati (to se m&#367;že stát, protože mezi p&#345;edním &#269;idlem a bo&#269;ními &#269;idly je slepý
úhel).<br>
<br>
P&#345;idání dalších &#269;idel se neobešlo bez konstruk&#269;ních problém&#367;. Bo&#269;ní LED &#269;idlo se
ukázalo jako málo citlivé a bylo to z&#345;ejm&#283; zp&#367;sobeno tím, že se jedná o
pr&#367;myslové &#269;idlo, které je normáln&#283; napájeno nap&#283;tím 12 až 48V. S&nbsp;naším
napájecím nap&#283;tím 7,2V a to ješt&#283; ob&#269;as, nebylo moc spokojeno. Byl tady p&#345;idán
další m&#283;ni&#269; nahoru na 12V. Byl použit m&#283;ni&#269; ze staré sí&#357;ové karty.</font></p>
<p align="left"><font face="Times New Roman">Samostatným konstruk&#269;ním problémem
bylo umíst&#283;ní kompasu. Nakonec musel být kompas umíst&#283;n nad všechny desky s
elektronikou a musel být orientován tak, aby &#269;idla byla pod úhlem 45<span lang="en">°
k </span>ose robota.<span lang="en"> Pokud byla &#269;idla v ose robota, byl kompas
ovliv&#328;ován zbytkovým magnetickým polem v kovových (zejména železných) &#269;ástech
robota.</span><br>
&nbsp;</font></p>
<p align="left"><font face="Times New Roman" size="4"><b>Poslední weekend p&#345;ed sout&#283;ží</b></font></p>
<p align="left"><font face="Times New Roman">P&#345;idání kompasu na I2C sb&#283;rnici si vyžádalo p&#345;eadresaci kamery, protože kamera a
kompas m&#283;ly na I2C sb&#283;rnici stejnou adresu a adresa kompasu se nedala zm&#283;nit. To
kupodivu byl velký problém, který jsme už &#345;ešili poslední weekend p&#345;ed sout&#283;ží a
vynutil si tak zásadní zásah jako rozebrání objektivu kamery, což znamenalo
pe&#269;livé &#269;išt&#283;ní pouzdra &#269;ipu kamery, protože p&#345;ípadné smítko na pouzd&#345;e &#269;ipu by
m&#283;lo p&#345;i sout&#283;ži fatální následky. &#268;ip kamery sice p&#345;eadresaci umí, ale bylo
nutné p&#345;ipojit vývod MULT (47) na <span lang="en-us">log_1 </span>a na to kupodivu na plošném spoji kamery
nebylo pamatováno, p&#345;esto, že na plošném spoji jsou plošky na odpory, které
umož&#328;ují zm&#283;nu adresy.<br>
&nbsp;</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ž&#328;ující její
p&#345;eadresaci.<br>
&nbsp;</font></p>
<p align="left"><font face="Times New Roman">Poslední weekend p&#345;ed sout&#283;ží nás napadlo ješt&#283; jednou projít seznam problém&#367;,
které jsme si poznamenali v&nbsp;pr&#367;b&#283;hu lo&#328;ské sout&#283;že. Hned na za&#269;átku tam bylo: „Zkontrolovat,
jestli neprokluzují kole&#269;ka na h&#345;ídeli.“ Prokluzovaly. Zkusili jsme je p&#345;ilepit
anaerobním lepidlem. Výsledek byl, že se zalepily h&#345;ídelky do ložisek a kole&#269;ka
prokluzovala dál. Zkusili jsme je p&#345;ilepit epoxidem. Nanešt&#283;stí nám trochu
epoxidu z&#345;ejm&#283; nateklo do ložisek a kole&#269;ka se zase utrhla. Poslední weekend
p&#345;ed sout&#283;ží jsme tedy m&#283;li zatuhlé p&#345;evodovky a kole&#269;ka prokluzovala. Snažili
jsme se do h&#345;ídelek vyvrtat dírky a dát tam kolík, ale vrták v&#367;bec nitridovanou
ocel z&nbsp;CD mechanik nebral. Nakonec jsme do h&#345;ídelek pouze vypilovali drážky a
op&#283;t jsme je zalili epoxidem. Jestli neprokluzují, jsme pro jistotu už
nezkoušeli.<br>
<br>
Ješt&#283; bylo nutné znovu zab&#283;hnout p&#345;evodovky, to jsme d&#283;lali p&#345;es noc z&nbsp;pond&#283;lí
na úterý (IstRobot bývá ve st&#345;edu a my tam obvykle jedeme v&nbsp;úterý dopoledne).
Motory se to&#269;ily do rána do poslední chvíle p&#345;ed naložením robota do auta.<br>
&nbsp;</font></p>
<p align="left"><font face="Times New Roman" size="4"><b>Noc p&#345;ed sout&#283;ží</b></font></p>
<p align="left"><font face="Times New Roman">„Kdyby nebylo poslední noci, tak není žádný projekt dokon&#269;en.“ Odpoledne jsme
p&#345;ijeli do Bratislavy na ubytovnu, rozložili dráhy a za&#269;ali ladit poslední &#345;ádky
programu. V&nbsp;našem p&#345;ípad&#283; to m&#283;lo být zpracování logu z&nbsp;jízdy.<br>
<br>
A v&#367;bec to nejezdilo. Robot m&#283;l malý výkon v&nbsp;levoto&#269;ivé zatá&#269;ce, p&#345;i objížd&#283;ní
cihly se dokonce ob&#269;as zastavil. No jasn&#283;, &#345;ekli jsme si, jsou stále zatuhlé
p&#345;evodovky, zm&#283;nili jsme pár konstant v&nbsp;programu a jakš takš to zase jezdilo.
Situace se ale o p&#367;lnoci zase zhoršila a za&#269;al smrd&#283;t H-m&#367;stek. Vym&#283;nili jsme
tedy H-m&#367;stek a nepomohlo to. Vym&#283;nili jsme tedy motor a pomohlo to! Prost&#283; jsme
neustálým lad&#283;ním programu a zkoušením zni&#269;ili jeden motor! Vrátili jsme tedy do
robota p&#367;vodní H-m&#367;stek (asi tak v&nbsp;jednu hodinu ráno) a zase to nejelo. M&#283;&#345;ením
jsme pak zjistili dv&#283; v&#283;ci, jednak byly p&#345;es pájecí lak odizolovány zemnící
šrouby na plošném spoji H-m&#367;stku a tak všechen proud tekl p&#345;es h&#345;ebínkový
konektor a pak tam ješt&#283; byl zkrat p&#345;es jeden tranzistor H-m&#367;stku, takže jeden
motor nereverzoval. P&#345;edstavte si, že tyto závady byly vykompenzovány
regulátorem v&nbsp;software a že s&nbsp;nimi byl Camerus na Robot Challenge t&#345;etí!<br>
<br>
Pak už jenom sta&#269;ilo doprogramovat tu logovací proceduru (p&#345;episovala pam&#283;&#357;). A
kolem páté hodiny ranní byl robot p&#345;ipraven na sout&#283;ž.<br>
&nbsp;</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&#269;n&#283; p&#345;ekvapil, byla na n&#283;m z&nbsp;našeho pohledu nejsložit&#283;jší
dráha, jakou jsme kdy vid&#283;li. Extrémn&#283; dlouhé p&#345;erušení, navíc v&nbsp;inflexním bod&#283;
(to nás v&#367;bec nenapadlo, že je možné), cihla hned za pravoúhlou zatá&#269;kou (sotva
robot vyjede ze zatá&#269;ky, bác, a je tu cihla), viz Obrázek 11. </font></p>
<p align="left">&nbsp;</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 &#269;idla &#269;asomíry. Magnetické pole nad dráhou
bylo díky nim zna&#269;n&#283; nehomogenní (stojánek na Obr. 11 vlevo dole a dva stojánky
na startu). Robot využíval kompas pouze u cihly, a z&#345;ejm&#283; byl stojánek
dostate&#269;n&#283; daleko/blízko, že nakonec nevadil. Údaje z kompasu se zpracovávaly
diferen&#269;n&#283;, takže nevadilo, že byla díky stojánk&#367;m odchylka v celkové orientaci
magnetického pole Zem&#283;, podstatné bylo, aby nedocházelo k velkým zak&#345;ivením pole
v oblasti cihly. K &#269;emuž, jak jsme zm&#283;&#345;ili, &#269;áste&#269;n&#283; docházelo, ale software se
s tím vypo&#345;ádal, když vážil údaje ze všech &#269;idel p&#345;i objížd&#283;ní p&#345;ekážky.</font></p>
<p align="left"><font face="Times New Roman">Obtížnost trati se
ukázala hned v&nbsp;první jízd&#283;, Camerus vypadnul na p&#345;erušení. V&nbsp;druhé jízd&#283; jsme
snížili výkon motor&#367;, zde ale zase hrozilo, že se robot nerozjede, pokud n&#283;kde (nap&#345;íklad
p&#345;i objížd&#283;ní cihly) výrazn&#283; zpomalí. Robot jel plynuleji, p&#345;esto vyjel v&nbsp;p&#345;erušení
(to dá rozum, protože kopíroval tvar dráhy p&#345;ed p&#345;erušením), vyhnul se tunelu,
znovu našel dráhu (to fungovalo dob&#345;e) a na podruhé projel. Byl to úsp&#283;ch, ale
velká &#269;asová ztráta a navíc si robot špatn&#283; zapamatoval dráhu pro další jízdu,
protože bloudil.</font></p>
<p align="left"><font face="Times New Roman">Programovali jsme místo ob&#283;da a nakonec jsme to p&#345;erušení vy&#345;ešili. Prost&#283; jsme
zohlednili, že dráha za p&#345;erušením m&#367;že pokra&#269;ovat i na druhou stranu. Zní to
jednoduše, ale úprava programu nebyla tak jednoduchá, viz sout&#283;ž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&#283;hla bez
problém&#367;, robot sice jel na mén&#283; jak polovinu regula&#269;ního rozsahu a bez našeho
zásahu by se s&nbsp;dráhou dob&#345;e nevypo&#345;ádal, ale jsme rádi, že dojel a nakonec
stejn&#283; za to nemohl robot, ale my, že jsme mu naprogramovali, že dráha za
p&#345;erušením nem&#367;že vést na druhou stranu. Nakonec se poda&#345;ilo s&nbsp;robotem s&nbsp;&#269;asem
12,5s ud&#283;lat „rekord trati“ <span lang="en-us">;-)</span><br>
&nbsp;</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>
&nbsp;</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&#367; robota.<br>
&nbsp;</font></p>
<p align="left"><font face="Arial">Desky plošných spoj&#367; a popis jednotlivých modul&#367; robota naleznete na
<a href="http://www.mlab.cz/">http://www.mlab.cz/</a>
.<br>
&nbsp;</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&amp;path=%2FModules%2FPIC16F87x%2F#_Modules_PIC16F87x_</a>
<br>
&nbsp;</font></p>
<p align="left"><font face="Arial">H-m&#367;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&amp;path=%2FModules%2FHBRIDGE%2F#_Modules_HBRIDGE_</a>
<br>
&nbsp;</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&amp;path=%2FModules%2FLEDbar%2F#_Modules_LEDbar_</a><br>
&nbsp;</font></p>
<p align="left"><font face="Arial">M&#283;ni&#269;<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&amp;path=%2FModules%2FPowerSupply%2FBATPOWER02A%2F#_Modules_PowerSupply_BATPOWER02A_</a><br>
&nbsp;</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&amp;path=%2FModules%2FTXIR%2F#_Modules_TXIR_</a><br>
&nbsp;</font></p>
<p align="left"><font face="Arial">Osv&#283;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&amp;path=%2FDesigns%2FROBOTS%2FCamerus%2FLEDpanel%2F#_Designs_ROBOTS_Camerus_LEDpanel_</a></font><br>
&nbsp;</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&amp;path=%2FModules%2FUNI%2FUNIDIL1601A%2F#_Modules_UNI_UNIDIL1601A_</a><br>
&nbsp;</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&amp;path=%2FModules%2FTRIMQUAD01A%2F#_Modules_TRIMQUAD01A_</a><br>
&nbsp;</font></p>
<p align="left"><font face="Arial">Dokumentace k&nbsp;použitému kamerovému &#269;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>
&nbsp;</font></p>
<p align="left"><font face="Arial">Dokumentace k&nbsp;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>
&nbsp;</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>
&nbsp;</font></p>
<p align="left"><font face="Arial">Dokumentace k&nbsp;robotu 3Orbis, ze kterého Camerus vyšel, 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&amp;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&#345;i sout&#283;ž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
+óIššrÐJÒ˹Zj»ç—³°è$g–H›KƒjÒPC>g¥DÝÖM*¦m¸vaŒ¸ÎAwj2QéЈŠÓ`Ë'Ã%K­cöNò“iXÎÊÄêâ­[JÍ"M4CC¤vsaÙ
+­(Ÿ~¯±Ú±¯­hÿ\Èã&õ*ÃïêW)†½¢¢cºJÓU[Þ9]¥\Û«¾"㦹ÛtUGãÅ骎MϜ`
+Z·ÞHòþœpßÆ
+ SMʘj
+Z&½³¢ºî†NS@“t§[æ°é%ͽ2Ê$±YNÑKÂTSpšnt>Ïwb1ס'7égQ¯æÁ)
+Z&íòlwýp»ÉGÞ1]5øŸØïöjziÁÍÆIWâ y­lüô èkƒÔ6ønoÔF¥»†mM'CûVÕ7
+Ö'ñ½…Û%‰>ºÎAö^«®²äáÄN9yo1úÜᵅÓ
+óhLÍ9h™TÞ@ôdØþ³™oåá)]IŠ3~ªÆ`ydhå¥üL%‡8Í¢o‚tIÞÍ,X™  {³ôf2³Pz`ðkf1'÷×S‚ƒÌ,xÁ6:›úfyJW’šYƒå™f̓s͂=®Z[&ΒÑsÁ؆Œ¹M©-<UµEyú8õ çV“Jº¨-$>)¼´ššsÐ2)¾d¾
+O]½¾†çá)]I*¥¼ëɎ›Ö/åg*qP2‹Ö–Y·ø¼©zU£¶ð㥇Y´¶8™Y(c ¶Ž0‹}Þ™YP[è¶{š´¶8­$5³ Ë3Í,šç ®9îðDm©ðáóS¾ŸpíÖ^¨%N•¾ÁDzštTÓ5¼¶Tx9hjÎAˤ§¬Z[˜kKpÐJRÑ{jmÑrÞ³sµÔ8(™EûF˜ÂOÁ»™Ežº.ö0 kKp™…ÒQM×ðÚÂBkjÎAf©-4K?Íý ³<¥+IÍ,ˆÁrN3‹-"ñ%â ¢l[ê==Ñi=Ï
+eÛ¢Ì3HŒƒpfŠµ8e·žˆ¤½€ñ•8h™½ÇØõlW¤ §¿:-—²É=­'byD——ò3•8(™ÅF†[ôDäÝ̂¶…Åô0‹¶-ÎAfJwë‰HG˜Åú=ã 3 {.áš„<éri˜m Ë3Í,šç ݔ‰9“›2ñmI¯cò][
+<B¤Ž¨3j‹1Vúœƒ°rš§šÝµE‰>Îð±ÔŒƒ–IOñ³.‡zëYÂÃóð”®$½}·ÜÙº¿¢”Ÿ©ÄAÉ,¬- ²Ý¥àÝÌ"uD÷Žö0 kKp™…R| ïfÛẑšq™EÚš¥Ÿf€~†YžÒ•¤fÆ@y¦™Åò`Ä&'$`vM&U_ÿþ?(=&ûϤç™>÷°ï@Ïç9‰Ÿ¡Ò'ᬜ}™2O'5’Óv†KqbܘFzè«“ÎAˤS4`]ç‚"…óˆ<<¤+Iq¨­o²<Ðe¥üL%â‚UÛÜ,\$±Å¢MÍÒë©fárÍbÌE 㠙°:\:Ô,J\°âacLÍ9h™tŠ†CÍ¢)À,ÁA+IEï©fÑòˆ./åg*qmœ·d
+–¢Lì>M³(Ÿ1Ӎ™l#L隱pú t‘t¦ÛøJ´\
+f¦@³8-—r· òŽùm–í|E)?S‰ƒôCúõºX©¶Áé˜%-VZe²XzJ„Ž•ÞÆÖãLƒy¦|ùÍ ×þ#ô›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㠕¼fDsñM|É÷ýGþ¸ØúÕý—îá{ýÊï7ûëv»ð&Îoù–Þò¿â“üó_ÿv„¬“¾ï[Ä·_Å7ë𼮪Å|Éßÿ¿ñßx…ÿÞçûw)'Ÿöú$õè¯Z£›mm6¯úªšéÏ~×cÿ#!ðþÎøHg¼ÿè,ƒ;©¡s–äð[}¿:Ïáq"Ήðg`'Jä3'ò9é¬
+>Ò ï?:cáãëqí¥P<\u¾"œñKwH”2ð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=®_ûáß??,.»Íjƒ4Bws'}ð®õÂ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ί¼™ÞG›1øuÊZ²ˆa„ƒÓ,b1‘G9|XÞ8c ÌCkŒƒ–Ieƀeî§ë+YçȔkè“Y[Ra#¼:7€u_™kzëáÂ2Ç$sZ< õNIIæ´ð¥bsZXsÖ9­Éù-Ì$9-½P]¥xw7'-Ãd®—¬ïdÑÇ=ðCâcŽj3ªxŽÎAœ­Û“>î>¼säëf”êl/MbþÌ#筗™ë¥*Ê÷ÓùF»ý3Ÿ{ü’s·ÎAË¥’é,9á12¨×“{@ª¤åb\Ýn©I*8ИÒnéّ!Z3ô-DÍБ¥ŒåyºŽ™gˆqvïàî.XÍÝ]*—·úd¾[ ³8ÎA뻾’ôΐ-“îÐR9ÐT}œ»wb»thli—°³f×sA+ùAºÁþ£vÿ%6å/ çòïƧ`d֛ÚÚ1¾Úà·)öqã|Ó¿¦™ré#íöËà ÎKìQƲGU.ñåœT 0w=¯Ç/1•ÊT°×¤Û×=×tî>ù4)V—ó?ӌ>ÒåAëRqEF:Ԃõ
+͟ÊeßH†Ù–>|ìsnðn<xÄ?ݑ¥x؛×CҌ+øИ\©±+Zòý ¤‡Ùèw)Ÿ\E¼œeljÑr)ö™l\›lzŒÝÁü”¯R®RÏi+œ\±å
+gȹ¶+š°oÏ9(y®š'ð|é>@÷émêㆵK;²þ«êíªûã.çݽYéíK¦×–qPÜ%
+Ö3iÀ§{잮K}‡ëWéJÒÈ%bìÔk¤©)­$uBæRIFÍ0™Mÿü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ÍWŒ›s¯9Ç¥å_œ_醻ks¢®©èæÒ5ï_ÝTã:ù},„ÜýÍ¡C¬Ñré®oaU·×áµö)]IŽ±ö¾P©û›ÃtV’^ÎíeºŠ§VRŠ¿9ÏöæPj¥R~ÆÉ`î{¤sð‚õ³-éÁ<üP·’ÌÃÏ3Qö`Ô ³p—WyÙÙ¹Î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÷V­žZMyЋ©÷¯1 ­»´¹.ïÀa–ìð÷áJMÃÄ1kgº5÷‹kjº‡÷Ãï:¦Cæ8¼ÃTNeÞè¹À‡“ÞelÓJÒËî¢óIê8:½ót‡Òïî¤í7'ÿüvæænž*ížZOùí)gÝóÞSÞ»—³{Ù÷ÜyªßhödfìîmtºÚÚ¼Ku3]–ýÅû’û/´6ßHÌ*¥ëÅ¿úIÆ5æú.¸¥wQÁAË¥»¾9¸¡¦[œƒV’†gæpÿÉÝ©û›£éΔîL9ÓÏtO­¤<sž1ìÍQis]ށûIÆîZӃáò[SGϑÌÃÒx‰TrtôCxÉ– ÍñoÄ¿¹ÆaÑÝÝùðÆ3·»ßµ¿º°øC/ã[oÐûê°·ó=ÒòÝ~–7wU‹EJåþ²ßVwZÓN»5jÁAáÖVÝ%­;å[
+|K¾láÁÖ^׏ï>nÚªKuö¨ëŒúÀkË»Ÿ!÷FŠ;Rܑb,—žÚôÜ̔ß,]ÉNh˳›9¹éWÅ7W´6‡M, wÃﹸòtŸºC奮EáĄïubÂç–ËëNW¤î¤NLÊA+I/çênPrSبAùJmÅ¥›.“*¥{Ö,µÍó³¥ülž÷âåÑR~¦éiÇÉ+êü­xš’zEÑ÷É8hýxxPa5n:áLç+q{cѧk¨ÔÏK½¿Ž¯Ò•¤×ð{Й4œ)îi©á¢Ã ͯqÐJÒËyZj‹|ªq16áMÏæšFãâ[VËÌÉLïÆT¶:^•’«Ü=+Njv©3Ň ”ºIÙU´Ù™É\Ÿ4Džcí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÷ ›7ŽrÜ 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—œÝ6UŠE >øñè|9¯ï4SܙâÎc¹ô´ÔXöAòü>¤+ىšêÁÂ]2%j™sÐrŸH­–)ѤD-sZ.•¼Åj™¦p¼Ü«ç!]IÞ9‡î¦®µÌ9h%éåÜÝ'—’µìáÊà qõëèáZc: ¡ søWî‡Þöäî1{j2Z÷)ÈÖz|¯(Ë&ñn.2ꘂ¯#ç+qmrW©}i)é†óøsZ.ÝÝefx
+#å!KW’^?,ï£Û—–—ò3•8H¯Ç3™e{ù×ÑëÆ}s’ýcºí©ÔÃŒûº Û¶ÜS%MuÒçD}bÜÿDC| `þ ꍢò›tÑÆærZþ«‘4`¨;0Ÿ$¼H0ÓõÍÏ3]¸WW¥º<p“/o_Îûë;w¤¸#ÅX.=<µé¹™)¿Yº’Ø‰?ªÍt¼æòpqW}k’»‡¹„Äûd!=æK›mu¶ßVw ©^—uvÖ9(œFª;ôä>b–ÜJ|–Ôx˜û…̲j
+GÊC–®$½¼ÜÇËÊ3^QÊÏTâ }Ÿš/®š‡
+I¹¶X)DKZ¹¶yùwŠ•r@‹z¬”k>¥!-B,–†ŒÐf±4dF,–†D­òX)DKZs­b<µ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±4dŒGIG²ÛxԃÃû’›÷üL3êΑú’¾Í–B܍ç›RÛ|ØïœÖ*‹¥!3j•ÅÊ!´µÅJÚ´VY¬”ƒ‘´y­B~Ô+•t¤\»EQnÕf±4dX¬’-jÛDyê-B
+¶ XIÕcõXÒRÈñÐVBÛö°5ZrÚºäqU§?¶ÚÚbåÚú|ؚý–BFÎÁHÚÌÖÌÏØ#f–a¤\=[‡Ú<C`+æÀcådÑf!5Z>L…ÝjÔQ¥!-ìVs-Õ¿A#–†·›ÇJ!Z‹•´!^ŽwJh3çú葃£ä’{äú°ò´‘BÒ7Æ3äi±…Ýú÷}
++*µyžÒ•¤R
+1M—•ò3•8ˆ‹}¸Ynv³o|Q<¶u4Kð•8HZÆý4é~˜®ÝÍ|%Z.ÅKg›l˜×ٜƒV’"g»Ç˜¦kÌȃq+SÁõ=l‘ËQ½T–Kø†îb[Çciƒ¯ÄAh›K‹ë*Þ:_‰ƒ–KçKuÉAbLáØ"éJRè=-Ë3_QÊÏTâ m‘q碶ÈÅãMZ;}êlëX[‚¯ÄAh›K‹ë*Ñ_‰ƒ–KÇKu‰Ó S@m ZI
+MAÍâ´’93³hÙú+Jù™J¤fÙ£É=öhrÉÒL»5¹G&×ùJ´ÔA^¥Öä’Òݜ–šqÐr)n÷´&—)°ÉuZIŠRX“«eë¯(åg*q¾D%õD%õDÅ{¢â=іz¢-õDÛüC*óæ=Ñæ=іz¢-õD›÷D[ê‰6ï‰6Ômó«t%)Já=Qñž¨¤ž¨xOTf¸{‚=шiDcqðßu²€÷œjOä|%W¬ƒRÚL‰7©_‰ƒ–I¥÷ ®iw­jOä´’¥(Ã&@£”Ÿ©ÄAÙ,ì‰FL#3‹_ÿª=‘ó•8ÈÍBi3]¤3Ì¢©¹Yj5³È³f
+쉜ƒV’ºYÃ&@£”Ÿ©ÄA4Kókkók•ï{…ï— ây£6ÿÁWâ %ÒêÒÍuù¤eð•8h¹t©®»Nk
+qº®3ò`”Í‚—HƒŽf‘ƒ·©ú¨–8^¢à+q›Ò9M×ôIËà+q›å®øªkºágz4éJR7 cœ®ëŒ<qÇüÙäGÈFPù«CZgÓYà~Æ&7øJd—PJ¿–Óhêå##R3Z.Ýõòi:54¹ÁA+I‘³î1Óe¥üL%JfÑæõ”Æ0‹tªT--d|%2³PZ‡éaKÍ8h¹Ô̂Cå™ÂfyJW’šY4Æaº¬”Ÿ©ÄAz½ÍQ½mñ©o,× m:Ë»·-ÎWâ ¹\ÀÖ® Ïö ®Íßkç+qÐ2©´Ã֒5¶-ÎA+I¡wZ ›¤ˆR~¦e³°m11d¼›YŽj‰ÓÎÎWâ 7 ¥›ëÚü½v¾¹Y¤=¶ó@S˜éÑ<¤+IÝ,ˆaSZQÊÏT⠚¥uÿ&ºÙ¿‰Œåΐ®c‘¢·¡Â,ÎWâ ¹=¤í.m¦«ù7Qð•8h™TŠB]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);