No changes between revisions
/Designs/ROBOTS/Camerus/Camerus_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/DOC/HTML/Camerus.cs.html
0,0 → 1,766
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> Camerus </title>
<meta name="keywords" content="MLAB čárový robot Camerus">
<meta name="description" content="Čárový robot Camerus">
<!-- AUTOINCLUDE START "Page/Head.cs.ihtml" DO NOT REMOVE -->
<link rel="StyleSheet" href="../../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB základní styl">
<link rel="StyleSheet" href="../../../../../Web/CSS/MLAB_Print.css" type="text/css" media="print">
<link rel="shortcut icon" type="image/x-icon" href="../../../../../Web/PIC/MLAB.ico">
<script type="text/javascript" src="../../../../../Web/JS/MLAB_Menu.js"></script>
<!-- AUTOINCLUDE END -->
<style type="text/css">
p.Obrazek {text-align: center}
</style>
 
</head>
 
<body lang="cs">
 
<!-- AUTOINCLUDE START "Page/Header.cs.ihtml" DO NOT REMOVE -->
<!-- ============== HLAVICKA ============== -->
<div class="Header">
<script type="text/javascript">
<!--
SetRelativePath("../../../../../");
DrawHeader();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
<!-- AUTOINCLUDE START "Page/Menu.cs.ihtml" DO NOT REMOVE -->
<!-- ============== MENU ============== -->
<div class="Menu">
<script type="text/javascript">
<!--
SetRelativePath("../../../../../");
DrawMenu();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) menu je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
<!-- ============== TEXT ============== -->
<div class="Text">
 
<p class="Title">
Robot CAMERUS
</p>
 
<p class="Autor">
<a href="mailto:kaklik@mlab.cz">kaklik@mlab.cz</a>;
<a href="mailto:kakl@i.cz">kakl@i.cz</a>
M. Novotný
</p>
 
<p class="Subtitle">
Jak se dělá robot na IstRobot
</p>
 
 
<p class="Subtitle">
<a href="Pictures/image001.jpg"><img src="Pictures/image001_small.jpg" alt="Obrázek robotu"></a>
</p>
<h1> Úvodem </h1>
<p>
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>).
</p>
<p>
Snažili jsme se technickou dokumentaci pojmout poněkud netradičně.
Kromě popisu finální verze robota zde naleznete chronologický popis
jeho vývoje a popis všech slepých uliček. Doufáme, že takováto forma
dokumentace bude mít pro naše následovníky větší hodnotu než pouhý
návod na zopakování konstrukce.
</p>
 
<h1> První pokusy </h1>
 
<h2> Robot 3Orbis </h2>
 
<p>
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. Použili
jsme tříkolý podvozek, který měl dvě hnaná kola, každé s&nbsp;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 naši 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.
</p>
<p class="Obrazek">
<a href="Pictures/image003.jpg"><img src="Pictures/image003_small.jpg" alt="Pohled na jízdu"></a>
<br>
Obr.1: První pokusy s&nbsp;tříkolým a třímotorovým robotem
</p>
 
<p class="Obrazek">
<a href="Pictures/image005.jpg"><img src="Pictures/image005_small.jpg" alt="Baterie senzorů"></a>
<br>
Obr.2: Baterie senzorů na čáru
</p>
<p>
Přidáním dalších senzorů na čáru jsme se dostali do problémů
s&nbsp;počtem vstupů použitého procesoru (PIC16F88). Tento problém jsme
vyřešili tak, že jsme na zpracování signálů ze senzorů na čáru použili
další samostatný procesor. Toto řešení se však později neukázalo jako
výhodné, protože 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 vždy trvalo určitou dobu, než jsme na to
přišli.
</p>
<p class="Obrazek">
<a href="Pictures/image007.jpg"><img src="Pictures/image007_small.jpg"
alt="Přední náhon"></a>
<br>
Obr.&nbsp;3: Přední náhon; přidáno druhé patro na elektroniku
</p>
<p>
Původní koncepce předpokládala hnaná kola vpředu a zatáčecí kolo vzadu.
Modelářské servo však nedokázalo dostatečně rychle zatáčet, přestože
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&nbsp;zatáčkách dostával do smyku a protože hmotnost čidel byla
nezanedbatelná, docházelo i k&nbsp;jeho naklápění a následně
k&nbsp;falešnému signálu z&nbsp;čidel, protože čidla nebyla držena
v&nbsp;konstantní vzdálenosti od povrchu.
</p>
<p>
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ůvodní kola byla tedy
nahrazena plastovými z&nbsp;dětské hračky. Kola měla menší průměr, což
zlepšilo převodový poměr, který byl pro vyrobené převodovky 5:1. Jako
obutí byly použity ustřižené prsty z&nbsp;latexových rukavic pro
domácnost. Jako obutí zatáčecího kolečka bylo použito pryžové těsnění
12x10x2. Na zatáčecí kolečko bylo obuto tak, že se jelo po hraně
těsnění.
</p>
<p class="Obrazek">
<a href="Pictures/image009.jpg"><img src="Pictures/image009_small.jpg"
alt="Zadní náhon"></a>
<br>
Obr.4: Robot 3Orbis. Zadní náhon a menší kolečka z&nbsp;autobusu od
syna pana Hronka.<br>
Je vidět čidlo na hledání hrany cihly.
</p>
<p>
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 sloužit pro její
objetí. Objetí cihly pomocí IR senzorů jsme však nedokázali odladit.
Objíždění nebylo spolehlivé a tak robot nakonec objížděl cihlu
naslepo.
</p>
<p>
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. Bohužel č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&nbsp;časové tísni správně upravit. Robot tedy nakonec nedojel.
</p>
<p>
Odhadovali jsme, že nám chyběl tak týden na odladění firmware, protože
v&nbsp;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&nbsp;odstupem
času vidíme, že co se týká objetí cihly, chybělo nám mnohem více.
</p>
<h2> Robot Laserus </h2>
 
<p>
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&nbsp;ostrých zatáčkách. Řešením by bylo zvětšení dosahu
čidel na čáru tak, aby mohla být umístěna co nejblíže k&nbsp;ose otáčení
robota. Zároveň by se tím snížila obvodová setrvačná hmotnost robota.
Znovu jsme použili tříkolý podvozek s&nbsp;jedním řízeným zatáčecím
kolečkem, přestože na IstRobotu 2006 byla tato konfigurace diskutována
a autoři druhého robota s&nbsp;podobnou koncepcí se v&nbsp;diskusi
vyjádřili, že to nebyl dobrý nápad, že robot při větších rychlostech má
snahu se rozkmitávat. Řešení tohoto problému jsme viděli ve zjemnění
snímání čáry tak, aby se precizněji nastavovalo zatáčecí kolečko.
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.
</p>
<p class="Obrazek">
<a href="Pictures/image011.jpg"><img src="Pictures/image011_small.jpg"
alt="Robot Laserus"></a>
<br>
Obr.&nbsp;5: Robot Laserus. Na obrázku je vidět červená stopa LASERu.
</p>
<p>
Problémy s&nbsp;touto konstrukcí byly dva. Pokud byl na dráze hrbol,
tak se v&nbsp;důsledku vibrací zmenšil rozkmit laseru, protože 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&nbsp;rezonance. Tento problém by ovšem zřejmě šlo kompenzovat
softwarem, protože se čára četla v&nbsp;obou směrech pohybu zrcátka.
Jednou jsme tedy dostali polohu čáry měřenou z leva a jednou z
prava.
</p>
<p>
Druhý problém byl závažnější. Protože bylo použito 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&nbsp;prudké zatáčce však
dochází k&nbsp;tomu, že čáru vidí snímač šikmo a tak se relativně
zvětšuje její tloušťka. Vnitřní elektronika snímače vyhodnotila tento
stav, jako že se nejedná o čárový kód a čáru vyfiltrovala. To
samozřejmě mělo v&nbsp;ostré zatáčce fatální následky. Dále jsme touto
cestou nepokračovali, přesto, že víme, že v&nbsp;závodě DARPA se často
používají laserové dálkoměry. Na soutěžních vozech je však vidět, že
konstruktéři také mají problémy s&nbsp;odtlumením vibrací.
</p>
 
<h1> Robot Camerus </h1>
<p>
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, vždy 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é. 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&nbsp;procesorem na 20MHz stíháme načíst jeden obrazový řádek asi
s&nbsp;polovičním rozlišením. To bylo povzbudivé a zaměřili jsme se
tímto směrem.
</p>
<p>
Druhým problémem bylo, že kamera nesnímá kontrastní obraz. Jak se
vypořádat v&nbsp;jednočipovém počítači s&nbsp;tímto problémem, když
jeho výpočetní výkon stačí sotva na načtení řádku a ještě 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.)
</p>
<p>
Problém jsme vyřešili něčím, čemu jsme pracovně začali říkat „digitální
komparátor“. Jednoduše jsme pomocí logických hradel provedli OR třech
nejvyšších bitů jasového signálu z&nbsp;kamery. Všechno co bylo pod
0x1F bylo tedy černé a všechno nad bylo bílé. Expozici kamery pak bylo
nutné nastavit tak, aby nejsvětlejší černá čára, byla ještě černá. To
se udělalo snadno osciloskopem, ale pro závod bylo nutné vyvinout
nějakou strategii, jak robot provede určení expozice. Řešením byla
rutina „Expozimetr“, která postupně zvyšuje expoziční čas a hledá ve
snímku (samozřejmě, že v&nbsp;našem případě na jedné řádce) čáru
definované tloušťky. Vychází se z&nbsp;toho, že nejdříve při
podexponování je černý celý obrázek, pak se postupně obrázek vyjasňuje,
což je ovšem díky chybě apertury objektivu nerovnoměrné. Dalším
zvyšováním času expozice se nakonec objeví čára správné tloušťky, ta se
pak dále ztenčuje a nakonec je snímek přepálen a čára zmizí. Samozřejmě
se předpokládalo, že na startu robot čáru vidí a ta je před ním
přibližně uprostřed.
</p>
<p>
První pokusy vypadaly velmi optimisticky, robot se držel čáry a vyjel
jenom občas. Zajímavé bylo, že robot dokázal jezdit jenom po dráze, kde
nebyly zatáčky doleva! Protože jsme neměli k&nbsp;dispozici obraz
z&nbsp;kamery, aby bylo možné zkontrolovat co kamera vidí, bylo nutné
tento problém řešit 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, protože kdyby nám někdo
řekl před rokem, že to s&nbsp;kamerou a jednočipovým počítačem jde, a
že je to spolehlivé, asi by jsme mu nevěřili.
</p>
<p>
Po prvotních úspěších jsme zkusili zrychlit jenže to nefungovalo, robot
vždy vypadl z&nbsp;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ž použit lineární stabilizátor s&nbsp;velkým drop-outem. Proto jsme
vyvinuli měnič, který i při poklesu napětí baterií o 2V dokázal udržet
napětí pro řídící elektroniku a zejména kameru stabilní. Po tomto
vylepšení už robot dosahoval poměrně slušné rychlosti a nejzajímavější
bylo, že díky „velké“ rozlišovací schopnosti kamery (procesor dokázal
rozlišit asi 50 bodů) byla jízda v&nbsp;zatáčkách velmi plynulá.
</p>
 
<p>
Problém s&nbsp;tmou v&nbsp;tunelu byl vyřešen jednoduše tak, že si
robot celou cestu svítil. Na osvětlení dráhy byly použity červené LED.
Nevíme, jaká barva pro osvětlení dráhy je nejlepší, eventuelně, jestli
je lepší svítit bíle. S&nbsp;tím jsme už nestihli před soutěží
experimentovat.
</p>
<p>
Protože použitý 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řešilo
procedurou „jakonásobení“, která kombinací rotací a podmíněného sčítání
provádí rychle potřebný výpočet s&nbsp;uspokojivou přesností.
</p>
<p class="Obrazek">
<a href="Pictures/image013.jpg"><img src="Pictures/image013_small.jpg"
alt="Osvětlení dráhy"></a>
<br>
Obr.&nbsp;6: Měnič v&nbsp;krabičce od čaje a primitivní osvětlení dráhy.
</p>
<p class="Obrazek">
<a href="Pictures/image015.jpg"><img src="Pictures/image015_small.jpg"
alt="Robot přítel člověka"></a>
<br>
Obr.&nbsp;7: Robot, přítel člověka.
</p>
<p>
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 zvyšování
rychlosti začal robot v&nbsp;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&nbsp;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 všimnout, že je zatáčka ostrá, zmizela mu čára ze
zorného pole.
</p>
<p>
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&nbsp;urč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ětlem, pokud přicházelo pouze z&nbsp;jednoho směru.
</p>
<p>
Konstrukční řešení, 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&nbsp;případě, že kamera čáru nevidí. To velmi
zvýšilo spolehlivost sledování čáry. Zároveň jsme tato čidla použili
pro opětovné vyhledání čáry po objetí cihly, protože jsme se báli pro
tento úkol použít kameru, protože 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.
</p>
<p>
Na objíždění cihly byl robot Camerus vybaven odometrií na pravém kole.
Využili jsme otvorů ve větším kole převodovky a IR závory
z&nbsp;tiskárny. Citlivost odometrie nebyla velká (4 impulzy na jednu
otáčku kolečka (12,6mm)).
</p>
 
<h2> Jak jsme jeli „ladit“ do Vídně </h2>
 
<p>
Vše potřebné bylo naprogramováno, robot sledoval čáru. Přerušení
nedělalo problémy, prostě byl výpadek obrazu a robot pokračoval
v&nbsp;původním směru před přerušením. Cihla byla řešena pomocí
odometrie. Takto vybaveni jsme odjeli do Vídně na Robot Challenge 2007.
Řekli jsme si, že to tam odladíme, protože jsou tam jednodušší podmínky
než v&nbsp;Bratislavě (alespoň na první pohled, robot může být větší a
tunel je také větší, takže menší robot nemusí jet tak přesně).
</p>
<p>
Rozhodnutí ladit robota na Robot Challenge se ukázalo jako správné.
Podmínky totiž byly náročné. Bodové osvětlení, dráha složená
z&nbsp;desek s&nbsp;mezerami, styl soutěže play-off.
</p>
<p>
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&nbsp;odometrií, prostě katastrofa! Alespoň, že byl třetí
v&nbsp;paralelním slalomu, to jsme mu ale zavinili my, protože jsme mu
při zkoušení 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.
</p>
<p>
 
<p class="Obrazek">
<a href="Pictures/image017.jpg"><img src="Pictures/image017_small.jpg"
alt="Robot Challenge 2007"></a>
<br>
Obr.&nbsp;8: Robot Challenge 2007, Parallel Slalom.
<br>
Robot Camerus na dráze číslo 1. Na dráze jsou patrné stíny od bodového
osvětlení.
</p>
<p class="Obrazek">
<a href="Pictures/image019.jpg"><img src="Pictures/image019_small.jpg"
alt="Příprava"></a>
<a href="Pictures/P3180028.JPG"><img src="Pictures/P3180028_small.JPG"
alt="Jízda"></a>
<br>
Obr.&nbsp;9: Robot Camerus na Robot Challenge 2007.
<br>
Robot nemá dostatek čidel na bezpečné objetí překážky.
</p>
<p>
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ě.
</p>
<h2> Co s&nbsp;cihlou? </h2>
<p>
Další vývoj jsme věnovali objíždění cihly za pomoci čidel. Jaká čidla
ale použít? Měli jsme špatné zkušenosti s&nbsp;IR čidly z&nbsp;3Orbise
a roboty s&nbsp;ultrazvukem jsme zase na minulých ročnících viděli, že
si spletli tunel s&nbsp;cihlou, případně neviděli cihlu, pokud se
k&nbsp;ní blížili zešikma.
</p>
 
<p>
Nevěděli jsme co s&nbsp;tím a tak jsme začali zkoušet. Měřili jsme, co
„vidí“ ultrazvuk a co různá optická čidla. Při měření se ukázaly
všechny 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&nbsp;cihle. Funguje na
principu triangulace. IR vysílací dioda má úzkou hliníkovou trubičkou
zúžen paprsek, aby nedocházelo k&nbsp;jeho integraci na velké vzdálené
ploše. 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&nbsp;prudké zatáčce. Z&nbsp;boku jsou pak ultrazvukový senzor a
on/off dálkoměr s&nbsp;červenou LED. Tyto čidla udržují konstantní
vzdálenost od cihly při jejím objíždění. K&nbsp;tomu ještě již zmíněná
odometrie na pravém kolečku, která zajišťuje prudkou zatáčku doleva
jakmile je cihla detekována a nakonec kompas, který zabraňuje, aby se
robot vracel zpět po trati (to se může stát, protože mezi předním
čidlem a bočními čidly je slepý úhel).
</p>
<p>
Přidání dalších čidel se neobešlo 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&nbsp;naším napájecím napětím 7,2V a to ještě občas, nebylo moc
spokojeno. Byl tady přidán další měnič nahoru na 12V. Byl použit měnič
ze staré síťové karty.
</p>
<p>
Samostatným konstrukčním problémem bylo umístění kompasu. Nakonec musel
být kompas umístěn nad všechny desky s elektronikou a musel být
orientován tak, aby čidla kompasu byla pod úhlem 45° k ose robota. 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.
</p>
 
<h2> Poslední weekend před soutěží </h2>
 
<p>
Přidání kompasu na I2C sběrnici si vyžádalo přeadresaci kamery, protože
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 řešili až
poslední weekend před soutěží a přitom vyžadoval tak zásadní zásah jako
rozebrání objektivu kamery, což znamenalo pečlivé čištění pouzdra a čipu
kamery, protože 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 log_1 a na to kupodivu na plošném spoji
kamery nebylo pamatováno, přesto, že na plošném spoji jsou plošky na
odpory, které umožňují změnu adresy.
</p>
 
<p class="Obrazek">
<a href="Pictures/image021.jpg"><img src="Pictures/image021_small.jpg"
alt="Úprava kamery"></a>
<br>
Obr.&nbsp;10: Propojka na PCB kamery umožňující její přeadresaci.
</p>
 
<p>
Poslední weekend před soutěží nás napadlo ještě jednou projít seznam
problémů, které jsme si poznamenali v&nbsp;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 ložisek a kolečka prokluzovala
dál. Zkusili jsme je přilepit epoxidem. Naneštěstí nám trochu epoxidu
zřejmě nateklo do ložisek a kolečka se zase utrhla. Poslední neděli
před soutěží jsme tedy měli zatuhlé převodovky a kolečka prokluzovala.
Snažili jsme se do hřídelek vyvrtat dírky a dát tam kolík, ale vrták
vůbec nitridovanou ocel z&nbsp;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ž nezkoušeli.
</p>
<p>
Při manipulaci s pravou převodovkou se podařilo ulomit vývod od IR
závory na odometrii. Protože nešla 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.
</p>
<p>
Po rozebrání bylo nutné převodovky nechat znovu zaběhnout, to jsme
dělali přes noc z&nbsp;pondělí na úterý (IstRobot bývá ve středu a my
tam obvykle jedeme v&nbsp;úterý dopoledne). Motory se točily do rána do
poslední chvíle před naložením robota do auta.
</p>
 
<h2> Noc před soutěží </h2>
<p>
„Kdyby nebylo poslední noci, tak není žádný projekt dokončen.“
Odpoledne jsme přijeli do Bratislavy na ubytovnu, rozložili dráhy a
začali ladit poslední řádky programu. V&nbsp;našem případě to mělo být
zpracování logu z&nbsp;jízdy.
</p>
<p>
A vůbec to nejezdilo. Robot měl malý výkon v&nbsp;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&nbsp;programu a jakš takš to zase jezdilo. Situace se ale o půlnoci
zase zhoršila 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 použitého dílu bylo zjištěno, že motor č.2 byl použit 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&nbsp;.) Po výměně motoru jsme
vrátili do robota původní H-můstek (asi tak v&nbsp;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 plošném spoji H-můstku a tak
všechen proud tekl přes hřebínkový konektor a pak tam ještě byl zkrat
přes jeden tranzistor H-můstku, takže jeden motor nereverzoval.
Představte si, že tyto závady byly vykompenzovány jednak regulátorem
v&nbsp;software a také koncepcí podvozku, a že s&nbsp;nimi byl Camerus
na Robot Challenge třetí!
</p>
<p>
Pak už jenom stačilo doprogramovat tu logovací proceduru (přepisovala
paměť). A kolem páté hodiny ranní byl robot připraven na soutěž.
</p>
<h2> IstRobot 2007 </h2>
 
<p>
IstRobot 2007 nás skutečně překvapil, byla na něm z&nbsp;našeho pohledu
nejsložitější dráha, jakou jsme kdy viděli. Extrémně dlouhé přerušení,
navíc v&nbsp;inflexním bodě (to nás vůbec nenapadlo, že je možné),
cihla hned za pravoúhlou zatáčkou (sotva robot vyjede ze zatáčky, bác,
a je tu cihla), viz Obrázek 11.
</p>
<p class="Obrazek">
<a href="Pictures/image023.jpg"><img src="Pictures/image023_small.jpg"
alt="IstRobot 2007"></a>
<br>
Obr.&nbsp;11: IstRobot 2007 – tvar dráhy.
</p>
<p>
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.&nbsp;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ě, takže 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 všech čidel při objíždění překážky.
</p>
<p>
Obtížnost trati se ukázala hned v&nbsp;první jízdě, Camerus vypadnul na
přerušení. V&nbsp;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&nbsp;přerušení (to dá rozum, protože kopíroval tvar dráhy před
přerušením), vyhnul se tunelu, znovu našel 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, protože bloudil.
</p>
<p>
Programovali jsme místo oběda a nakonec jsme to přerušení vyřešili.
Prostě jsme zohlednili, že dráha za přerušením může pokračovat i na
druhou stranu. Zní to jednoduše, ale úprava programu nebyla tak
jednoduchá, viz soutěžní verzi
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Designs/ROBOTS/Camerus/sw/#_Designs_ROBOTS_Camerus_sw_"
>firmware</a>.
</p>
<p>
Finálová jízda proběhla bez problémů, robot sice jel na méně jak
polovinu regulačního rozsahu a bez našeho zásahu by se s&nbsp;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řerušením nemůže
vést na druhou stranu. Nakonec se podařilo s&nbsp;robotem s&nbsp;časem
12,5s udělat „rekord trati“ ;-)
</p>
 
<p class="Obrazek">
<a href="Pictures/image025.jpg"><img src="Pictures/image025_small.jpg"
alt="Robot Camerus"></a>
<br>
Obr.&nbsp;12: Robot Camerus - finální verze robota.
</p>
<p class="Obrazek">
<a href="Pictures/index.2.gif"><img src="Pictures/index.1.gif"
alt="Blokové schéma"></a>
<br>
Obr.&nbsp;13: Blokové schéma propojení modulů robota.
</p>
<h1> Podklady </h1>
<p>
Desky plošných spojů a popis jednotlivých modulů robota naleznete na
<a href="http://www.mlab.cz/">http://www.mlab.cz/</a>&nbsp;.
</p>
 
<h2 class="Small"> Deska procesoru </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FModules%2FPIC%2FPIC16F87xSO2801A%2F#_Modules_PIC_PIC16F87xSO2801A_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/PIC/PIC16F87xSO2801A/#_Modules_PIC_PIC16F87xSO2801A_</a>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FModules%2FPIC%2FPIC16F87xDIL2801A%2F#_Modules_PIC_PIC16F87xDIL2801A_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/PIC/PIC16F87xDIL2801A/#_Modules_PIC_PIC16F87xDIL2801A_</a>
</p>
<h2 class="Small"> H-můstky </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FModules%2FH_Bridge%2F#_Modules_H-Bridge_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/H_Bridge/#_Modules_H-Bridge_</a>
</p>
 
<h2 class="Small"> LEDbar </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FModules%2FHumanInterfaces%2FLEDbar%2F#_Modules_LEDbar_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/HumanInterfaces/LEDbar/#_Modules_LEDbar_</a>
</p>
<h2 class="Small"> Měnič </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FModules%2FPowerSupply%2FBATPOWER02A%2F#_Modules_PowerSupply_BATPOWER02A_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/PowerSupply/BATPOWER02A/#_Modules_PowerSupply_BATPOWER02A_</a>
</p>
<h2 class="Small"> IR modulátor </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FModules%2FCommIR%2FTXIR%2F#_Modules_CommIR_TXIR_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/CommIR/TXIR/#_Modules_CommIR_TXIR_</a>
</p>
<h2 class="Small"> Osvětlení dráhy </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FDesigns%2FROBOTS%2FCamerus%2FLEDpanel%2F#_Designs_ROBOTS_Camerus_LEDpanel_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Designs/ROBOTS/Camerus/LEDpanel/#_Designs_ROBOTS_Camerus_LEDpanel_</a>
</p>
 
<h2 class="Small"> Univerzálka pro 7432 </h2>
 
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/Universal/UNIDIL1601A/">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/Universal/UNIDIL1601A/</a>
</p>
<h2 class="Small"> Modul trimrů </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FModules%2FHumanInterfaces%2FTRIMQUAD01A%2F#_Modules_TRIMQUAD01A_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/HumanInterfaces/TRIMQUAD01A/#_Modules_TRIMQUAD01A_</a>
</p>
<h2 class="Small"> Dokumentace k&nbsp;použitému kamerovému čipu </h2>
 
<p>
<a href="http://www.cmucam.org/attachment/wiki/Documentation/OV6620.PDF">
http://www.cmucam.org/attachment/wiki/Documentation/OV6620.PDF</a>
</p>
<h2 class="Small"> Dokumentace k&nbsp;US senzoru </h2>
 
<p>
<a href="http://www.robot-electronics.co.uk/htm/srf08tech.shtml">
http://www.robot-electronics.co.uk/htm/srf08tech.shtml</a>
</p>
<h2 class="Small"> Dokumentace ke kompasu </h2>
<p>
<a href="http://www.robot-electronics.co.uk/htm/cmps3doc.shtml">
http://www.robot-electronics.co.uk/htm/cmps3doc.shtml</a>
</p>
<h2 class="Small"> Dokumentace k&nbsp;robotu 3Orbis </h2>
<p>
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=%2FDesigns%2FROBOTS%2F3Orbis%2F#_Designs_ROBOTS_3Orbis_">
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Designs/ROBOTS/3Orbis/#_Designs_ROBOTS_3Orbis_</a>
</p>
<h2 class="Small"> Video </h2>
<p>
Videozáznam, jak Camerus jezdil při soutěži IstRobot 2007:
<br>
<a href="../video/1.wmv">1.&nbsp;jízda</a>,
<a href="../video/2.wmv">2.&nbsp;jízda</a>,
<a href="../video/3.wmv">3.&nbsp;jízda</a>.
</p>
</div>
 
<!-- AUTOINCLUDE START "Page/Footer.cs.ihtml" DO NOT REMOVE -->
<!-- ============== PATIČKA ============== -->
<div class="Footer">
<script type="text/javascript">
<!--
SetRelativePath("../../../../../");
DrawFooter();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
</body>
</html>
/Designs/ROBOTS/Camerus/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/HTML/Pictures/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/DOC/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/DOC/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/DOC/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/PrjInfo.txt
0,0 → 1,19
//
// Toto je popisný soubor pro popis obsahu adresáře (příklad)
//
 
[InfoShortDescription.en]
Robot Camerus
 
[InfoShortDescription.cs]
Robot Camerus
[InfoLongDescription.en]
Line following robot with many sensors. For line detection
uses CMOS camera.
 
[InfoLongDescription.cs]
Čárový robot se spoustou čidel. Pro sledování čáry používá
i CMOS kameru.
 
[End]
/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);