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 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 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 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. 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 zatáčkách dostával do smyku a protože hmotnost čidel byla |
nezanedbatelná, docházelo i k jeho naklápění a následně |
k falešnému signálu z čidel, protože čidla nebyla držena |
v 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 drážkách na kolech. Původní kola byla tedy |
nahrazena plastovými z dětské hračky. Kola měla menší průměr, což |
zlepšilo převodový poměr, který byl pro vyrobené převodovky 5:1. Jako |
obutí byly použity ustřižené prsty z 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 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 č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 roce 2006 u nás byla povodeň a ztratili jsme tak nejméně jeden |
kalendářní měsíc večerů/weekendů na programování. Nyní s odstupem |
času vidíme, že co se týká objetí cihly, chybělo nám mnohem více. |
</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 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 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 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 podobnou koncepcí se v diskusi |
vyjádřili, že to nebyl dobrý nápad, že robot při větších rychlostech má |
snahu se rozkmitávat. Ř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. 5: Robot Laserus. Na obrázku je vidět červená stopa LASERu. |
</p> |
<p> |
Problémy s touto konstrukcí byly dva. Pokud byl na dráze hrbol, |
tak se v 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 rezonance. Tento problém by ovšem zřejmě šlo kompenzovat |
softwarem, protože se čára četla v 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 prudké zatáčce však |
dochází k 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 ostré zatáčce fatální následky. Dále jsme touto |
cestou nepokračovali, přesto, že víme, že v závodě DARPA se často |
používají laserové dálkoměry. Na soutěžních vozech je však vidět, že |
konstruktéři také mají problémy s 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 procesorem na 20MHz stíháme načíst jeden obrazový řádek asi |
s 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 jednočipovém počítači s tímto problémem, když |
jeho výpočetní výkon stačí sotva na načtení řádku a 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 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 našem případě na jedné řádce) čáru |
definované tloušťky. Vychází se z toho, že nejdříve při |
podexponování je černý celý obrázek, pak se postupně obrázek vyjasňuje, |
což je 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 dispozici obraz |
z 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 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 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 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 zatáčkách velmi plynulá. |
</p> |
<p> |
Problém s tmou v 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 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 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. 6: Měnič v 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. 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 takové zatáčce vypadávat. Ne, že by přímo |
vyjel a nevrátil se na dráhu, ale poloměr zatáčení byl menší než poloměr |
zatáčky a hrozilo tedy, že v Bratislavě spadne ze stolu. Udělali |
jsme předpoklad, že je to způsobeno pomalým snímkovým kmitočtem kamery, |
než si robot stačil 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 určitých mezích. Kupodivu |
nebyl problém v tunelu, kde si robot svítí, ale velký problém byl |
s denním světlem, pokud přicházelo pouze z jednoho směru. |
</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 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 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 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 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 desek s 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 odometrií, prostě katastrofa! Alespoň, že byl třetí |
v 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. 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. 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 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 IR čidly z 3Orbise |
a roboty s ultrazvukem jsme zase na minulých ročnících viděli, že |
si spletli tunel s cihlou, případně neviděli cihlu, pokud se |
k ní blížili zešikma. |
</p> |
<p> |
Nevěděli jsme co s 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 cihle. Funguje na |
principu triangulace. IR vysílací dioda má úzkou hliníkovou trubičkou |
zúžen paprsek, aby nedocházelo k jeho integraci na velké vzdálené |
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 prudké zatáčce. Z boku jsou pak ultrazvukový senzor a |
on/off dálkoměr s červenou LED. Tyto čidla udržují konstantní |
vzdálenost od cihly při jejím objíždění. K 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 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. 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 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 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 pondělí na úterý (IstRobot bývá ve středu a my |
tam obvykle jedeme v úterý dopoledne). Motory se točily do rána do |
poslední chvíle před 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 našem případě to mělo být |
zpracování logu z jízdy. |
</p> |
<p> |
A vůbec to nejezdilo. Robot měl malý výkon v levotočivé zatáčce, |
při objíždění cihly se dokonce občas zastavil. No jasně, řekli jsme si, |
jsou stále zatuhlé převodovky, změnili jsme pár konstant |
v programu a jakš takš to zase jezdilo. Situace se ale o půlnoci |
zase 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 .) Po výměně motoru jsme |
vrátili do robota původní H-můstek (asi tak v jednu hodinu ráno) |
a zase to nejelo. Měřením jsme pak zjistili dvě věci, jednak byly přes |
pájecí lak odizolovány zemnící šrouby na 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 software a také koncepcí podvozku, a že s 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 našeho pohledu |
nejsložitější dráha, jakou jsme kdy viděli. Extrémně dlouhé přerušení, |
navíc v 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. 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. 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 první jízdě, Camerus vypadnul na |
přerušení. V druhé jízdě jsme snížili výkon motorů, zde ale zase |
hrozilo, že se robot nerozjede, pokud někde (například při objíždění |
cihly) výrazně zpomalí. Robot jel plynuleji, přesto vyjel |
v př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&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 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 robotem s č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. 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. 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> . |
</p> |
<h2 class="Small"> Deska procesoru </h2> |
<p> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FPIC%2FPIC16F87xSO2801A%2F#_Modules_PIC_PIC16F87xSO2801A_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/PIC/PIC16F87xSO2801A/#_Modules_PIC_PIC16F87xSO2801A_</a> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FPIC%2FPIC16F87xDIL2801A%2F#_Modules_PIC_PIC16F87xDIL2801A_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&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&path=%2FModules%2FH_Bridge%2F#_Modules_H-Bridge_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&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&path=%2FModules%2FHumanInterfaces%2FLEDbar%2F#_Modules_LEDbar_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&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&path=%2FModules%2FPowerSupply%2FBATPOWER02A%2F#_Modules_PowerSupply_BATPOWER02A_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&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&path=%2FModules%2FCommIR%2FTXIR%2F#_Modules_CommIR_TXIR_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&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&path=%2FDesigns%2FROBOTS%2FCamerus%2FLEDpanel%2F#_Designs_ROBOTS_Camerus_LEDpanel_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&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&path=/Modules/Universal/UNIDIL1601A/"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/Universal/UNIDIL1601A/</a> |
</p> |
<h2 class="Small"> Modul trimrů </h2> |
<p> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FHumanInterfaces%2FTRIMQUAD01A%2F#_Modules_TRIMQUAD01A_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=/Modules/HumanInterfaces/TRIMQUAD01A/#_Modules_TRIMQUAD01A_</a> |
</p> |
<h2 class="Small"> Dokumentace k 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 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 robotu 3Orbis </h2> |
<p> |
<a href="http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FDesigns%2FROBOTS%2F3Orbis%2F#_Designs_ROBOTS_3Orbis_"> |
http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&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. jízda</a>, |
<a href="../video/2.wmv">2. jízda</a>, |
<a href="../video/3.wmv">3. 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 |
+óIrÐJÒ˹Zj»ç³°è$gïHKjÒPC>g¥DÝÖM*¦m¸va¸ÎAwj2QéÐÓ`Ë'Ã%KcöNòiXÎÊÄêâ[JÍ"M4CC¤vsaÙ |
+(~¯±Ú±¯hÿ\Èã&õ*ÃïêW)½¢¢cºJÓU[Þ9]¥\Û«¾"㦹ÛtUGãÅéªMÏ` |
+Z·ÞHòþpßÆ |
+ SMʘj |
+Z&½³¢ºîNS@t§[æ°é%ͽ2Ê$±YNÑKÂTSpnt>Ïwb1ס'7égQ¯æÁ) |
+Z&íòlwýp»ÉGÞ1]5øŸØïöjziÁÍÆIWâ ylüô èkÔ6ønoÔF¥»mM'CûVÕ7 |
+Ö'ñ½ Û%>ºÎAö^«®²äáÄN9yo1úÜáµ Ó |
+óhLÍ9hTÞ@ôdØþ³oåá)]I3~ªÆ`ydhå¥üL%Â8Í¢otIÞÍ,X {³ôf2³Pz`ðkf1'÷ÃSÌ,xÁ6:úfyJWYåfÍsÍ=®Z[&ÎÑsÁعM©-<UµEyú8õ çVJº¨-$>)¼´sÐ2)¾d¾ |
+O]½¾çá)]I*¥¼ëÉÖ/åg*qP2ÖY·ø¼©zU£¶ðã¥Y´¶8Y(c ¶0}ÞYP[è¶{´¶8$5³ Ë3Í,ç ®9îðDm©ðáóS¾píÖ^¨%N¾ÁDztTÓ5¼¶Tx9hjÎAˤ§¬Z[kKpÐJRÑ{jmÑrÞ³sµÔ8(EûFÂOÁ»Eº.ö0kKp ÒQM×ðÚÂBkjÎAf©-4K?Í ý³<¥+IÍ,ÁrN3-"ñ%â ¢l[ê==Ñi=Ï |
+eÛ¢Ì3Hpfµ8e·¤½ñ8h½ÇØõlW¤ §¿:-²É='byDò38(ÅF[ôDäÝ̶ Åô0¶-ÎAfJwëHGÅú=ã 3{.á<érimË3Í,ç Ý92ñmI¯cò][ |
+<B¤¨3j1Vú°r§ÝµE>Îð ±ÔIOñ³.zëYÂÃóð®$½}·ÜÙº¿¢©ÄAÉ,¬-²Ý¥àÝÌ"uD÷ö0kKp R| ïfÛáºqEÚ¥f~YÒ¤fÆ@y¦Åò`Ä&'$`vM&U_ÿþ?(=&ûϤç>÷°ï@Ïç9¡Ò'á¬}2O'5ÓvKqbÜFzè«ÎAˤS4`]ç" ó<<¤+Iq¨o²<Ðe¥üL%âUÛÜ,\$±Å¢MÍÒë©fárÍbÌEã °:\:Ô,J\°âacLÍ9htCÍ¢)À,ÁA+IEï©fÑò./åg*qm·d |
+¢Lì>M³(1Ól#Lé±pú tt¦ÛøJ´\ |
+f ¦@³8-r· òùmí|E)?SôCúõºX©¶Áé%-VZe²XzJÞÆÃãLy¦|ùÍ ×þ#ôg:§ÊÍí[Þª®]hÆúÇÂodúeÞxúV!ôVhbçñ±X9Ö±XÎd'^¢Ó1U/çgÜóoç+qÐÒó#(ÅÓh×s ¯ÄAˤ²;§p.)O+§t%é¥g ËVê+JùJgÙ¹£÷ûpôþp't¸ÙÿOrNÿHîòï?rÿù/96¤cC%M©¦øúÛ+É4¾ðþøHG¼ÿè¨/÷æÇvý»íá ÞqXoÔç^xï?òÂ2à>þÒýú®_yû%ÏÀä-8_ºê#yC¾¿zCâãª'¸zCú×`ñ/Góu¬¯ðdüüO=òIyÄ0Rïwõ7¶Õ©ØsÖÍlv<Å_ó-ýí/ëË<XuC·y¸ZilÓÞýör?Xã ¼fDsñM|É÷ýGþ¸ØúÕýîá{ýÊï7ûëv»ð&ÎoùÞò¿âüó_ÿv¬¾ï[Ä·_Å7ë𼮪Å|Éßÿ¿ñßx ÿÞçûw)'öú$õè¯Z£mm6¯úªéÏ~×cÿ#!ðþÎøHg¼ÿè,;©¡säï©ð[}¿:Ïáq"Îðg`'Jä3'ò9é¬ |
+>Òï?:cáãëqí¥P<\u¾"ñKwH2ðbVÎEµ77Äö |
+1Gç"ÎZÌ¥.úÆAx7ç¦_XócJ̹ZÈÌ%Û²æ¤ië!¿lýeWE*÷¹¤·W8§þçô£t×ö+ËÝõüwåÃ¥ã/ä|¤+ß:áú49óÅjs_ׯÜþý»ãç>ÿ¼ÄA×ÇñÓÞoGðãISsJWÙÿÆ1éà÷?pðÃJAKþõ(~÷Ët¸Esê${W¿ñáxÿÑ!~¼.ñc=®_ûáß??,.»Íj4Bws'}ð®õÂh{åLìXóqÀÉ2Cóß80å#áòþpùHGɼÿè(8@ïþþö6?×ÇãÒ!::JýÙ<?;°ç§c n}Ðz4Ñ_<xèWÇ |
+Iäõé£wºÜìú¯?+Ñì¢4|»Övð |
+µwºdíúÅ kËÙº_ØÖíbµv\§¾îÎ9-ÚµoÏKæ>qõÜǸ´s»_U/³~ÁÝôKéô:¼þ |
+wîîKQõ@|·×Ì(ñóù§£-váûI÷6oί¼ÞG1øuÊZ²aÓ,b1G9|XÞ8c ÌCkIeÆeî§ë+YçÈkèY[Ra#¼:7u_kzëáÂ2Ç$sZ< õNIIæ´ð¥bsZXsÖ9Éù-Ì$9-½P]¥xw7'-Ãd®¬ïdÑÇ=ðCâcj3ªxÎAÛ>î>¼säëfêl/MbþÌ#çë¥*Ê÷ÓùF»ý3{üs·ÎAË¥é,9á12¨×{@ª¤åb\Ýn©I*8ÐÒnéÙ!Z3ô-DÍÐÂ¥åyºgqvïàî.XÍÝ]*·úd¾[ ³8ÎA뻾ôÎ-îÐR9ÐT}»wb»thli°³f×sA+ùAºÁþ£vÿ%6å/çòïƧ`dÖÚÚ1¾Úà·)öqã|Ó¿¦ré#íöËà ÎKìQƲGU.ñåT0w=¯Ç/1ÊT°×¤Û×=×tî>ù4)Vó?Ó>ÒåAëRqEF:Ôõ |
+ÍÊeßHÙ>|ìsnðn<xÄ?Ý¥xØ×CÒ+øÐ\©±+Zòý¤Ùèw)\E¼eÇÑr)öl\lzÝÁü¯R®RÏi+\±å |
+gȹ¶+°oÏ9(y®'ð|é>@÷émêãµK;²þ«êíªûã.çݽYéíK¦×qPÜ% |
+Ö3iÀ§{ì®K}ëWéJÒÈ%bìÔk¤©)$uBæRIFÍ0Mÿür¸¿ø$¹]Í íºlu÷EºÇl(¨ó8È{)=L¹ù~»(S9h¹´ùÝÝ{äá!]IN<£UÓe¥üL%¢)¹Î ¯ÜÑ/~Åéпe§yÓ÷Vï@=M^ô¬Ã'Ä$½áë[8Bø×o¾µuO÷ºþË¥-ÅÈ7îç}±k8"ÆWâ åÒÃ¥óöáå£ú¿13m´\*ÉàùöÃõjÜí«t%i\®kNxz¹®n*Ëu÷$]Iê®ÞtiÖ¥aK¡¦<è»Û×(ÅiR+}RÍý£ã`ñ ëdºMø'sºøÃ樂)wêiW%±Êî;:ôNiå ¤3¼uÛÔoW9Rë¯ïÞ¼í7Xÿüìæ^¶nV¿_ã+qÐréáÒù |
+Kñ1¨Ûnv$¶£ùw_PÍWs¯9Ç¥å__é»ks¢®©èæÒ5ï_ÝTã:ù},ÜýÍ¡C¬Ñré®oaU·×áµö)]I±ö¾P©ûÃtV^Îíeº§VR¿9ÏöæPj¥R~ÆÉ`î{¤sðõ³-éÁ<üP·ÌÃÏ3Qö`Ô³pWyÙÙ¹ÎAËýRE:uåÉ{¿¯ÄAË¥Ø3¶ñ+ÙR@Óç´ôòºßKuõÈqÐJÒ˹'Õ(å'O |
+ç|3åW÷иëòÃïåEÜÊ»<¹}UYåU¤=ô¾På ¤3\6ÇÔysXóNß]:y'²ñÏn@mL¹¹´zj5å·¦UÏ{My¯^Îêeo©yªÿ5ÏÎé]TpÐr).~íìÍST¯Ý¿JWÆ%²æ¦º¼ã |
+ZIz9w÷VZMyЩ÷¯1 »´¹.ïÀaìð÷áJMÃÄ1kgº5÷kjº÷Ãï:¦Cæ8¼ÃTNeÞè¹ÀÞelÓJÒËî¢óIê8:½ótÒïî¤í7'ÿüvææn*íZOùí)gÝóÞSÞ»³{Ù÷ÜyªßhödfìîmtºÚÚ¼Ku3]ýÅûû/´6ßHÌ*¥ëÅ¿úIÆ5æú.¸¥wQÁAË¥»¾9¸¡¦[VgæpÿÉÝ©û£éÎîL9ÓÏtO¤<s1ìÍQis]ÞûIÆîZÓáò[SGÏÌÃÒxTrtôCxÉ ÍñoÄ¿¹ÆaÑÝÝùðÆ3·»ßµ¿º°øC/ã[oÐûê°·ó=ÒòÝ~7wUEJåþ²ßVwZÓN»5jÁAáÖVÝ%;å[ |
+|K¾láÁÖ^×ï>nÚªKuö¨ëúÀkË»!÷F;RÜb,ÚôÜÌß,]ÉNh˳9¹éWÅ7W´6M,wÃﹸòtºC奮EáÄïubÂçËëNW¤î¤NLÊA+I/çênPrSبAùJmÅ¥.*¥{Ö,µÍó³¥ül÷âåÑR~¦éiÇÉ+êüxzEÑ÷É8hýxxPa5n:áLç+q{cѧk¨ÔÏK½¿¯Ò¤×ð{Ð4)îi©á¢Ã ͯqÐJÒËyZj|ªq16áMÏæFãâ[VËÌÉLïÆT¶:^«Ü=+Njv©3źIÙU´ÙÉ\4DcíM¼Ø6¹¹KCj±FÑ\wôVØæhFÕA >V^ÎpjOR§!>g¢¹}þ¾~|w1jîâCi±GJÌo9#gÆAË¥KQö<}n>CÙÉL:|оIùêäOéË{Âû *òÔ=VóÜI÷7rÜmÞ1æcÃÓ{ÔêÃþÕÅr}Eo>4Ç9fë§W÷G³O·:ÉN<ÞéxÇð1£ó8h¹(?Ýgå3ù¯¯^-§ÅÅtã ¤sOÞ)QJ[¹Qr`n%6º<»xÕqÐJÒËùpWßv¹ó"Dã+qÐrÝ6UE>øñè|9¯ï4SÜâÎc¹ô´ÔXöAòü>¤+ÙêÁÂ]2%jsÐrH)ѤD-sZ.¼Åj¦p¼Ü«ç!]IÞ9µÌ9h%éåÜÝ'µìáÊÃqõëèáZc:¡søWîÞöäî1{j2Z÷)ÈÖz|¯(Ë&ñn.2ê¯#ç+qmrW©}i)éóøsZ.ÝÝefx |
+#å!KW^?,ï£Ûò38H¯Ç3e{ù×ÑëÆ}sýcºí©ÔÃûº Û¶ÜS%MuÒçD}bÜÿDC| `þ ê¢òtÑÆærZþ«4`¨;0Â$¼H0ÓõÍÏ3]¸WW¥º<p/o_Îûë;w¤¸#ÅX.=<µé¹)¿YºØ ?ªÍt¼æòpqW}k»¹Äûd!=æKmu¶ßVw ©^uvÖ9(Fª;ôä>bï¥ÜJ|Ôxû ̲j |
+GÊC®$½¼ÜÇËÊ3^QÊÏTâ }/® |
+I¹¶X)DKZ¹¶yùwr@z¬k>¥!-B,Ðf±4dF,DòX)DKZsb<µNÍ5ºÍ¢3[Ç,ÿN±²ïQà¹Æ± ;ÓÙ÷G{`ÊciÞÁC¨Íb%mGM!®Ey,ìQ¥!g |
+ÙsÚSíµXR#û£öîé]°X9d2$¿8êÅÜ|XtFÞxªán;þ·ýKûR!8÷On?ß3Dc±bÓðxôô3îyíKÿ·×íÌ|¤ý73Þú#þ³´Â*·±=C6ÿÍ(Ùn#YgdëtÌÉ3DÙC·ÊsòôE¿KCf |
+y¤kÚæ#¤R÷;ÅÒØ·1¤æ0d¼Þ)VÒ6¶2rFÒ6¶ë±GFË%)×cÏÖQmKC=¥!µ+°µ¶ÏZ,pÚö- /ÍÅÒå±Xÿ¨ \Jj±4dGIG²ÛxÔÃû÷üL3êÎú¾ÍBάçRÛ|Ø ïÖ*¥!3jÅÊ!´µÅJÚ´VY¬´yB~Ô+t¤\»EQnÕf±4dX¬-jÛDyê-B |
+¶XIÕcõXÒRÈñÐVBÛö°5ZrÚºäqU§?¶ÚÚbåÚú|ØýÂBFÎÁHÚÌÖÌÏØ#fa¤\=[Ú<C`+æÀcådÑf!5Z>L ÝjÔQ¥!-ìVs-Õ¿A#·ÇJ!Z´!^wJh3çúè£ä{äú°ò´BÒ7Æ3äi± Ýú÷} |
++*µyÒ¤R |
+1Mò38}¸Ynv³o|Q<¶u4Kð8HZÆý4é~®ÝÍ|%Z.ÅKgl×ÙV"g»Ç¦kÌÈq+SÁõ=lËQ½TKøîb[Çci¯ÄAhKë*Þ:_KçKuÉAbLáØ"éJRè=-Ë3_QÊÏTâ mq碶ÈÅãMZ;}êlëX[¯ÄAhKë*Ñ_KÇKuÓ S@m ZI |
+MAÍâ´93³hÙú+JùJ¤fÙ£É=öhrÉÒL»5¹G&×ùJ´ÔA^¥ÖäÒÝqÐr)n÷´&)°ÉuZIRX«eë¯(åg*q¾D%õD%õDÅ{¢â=Ñz¢-õDÛüC*óæ=Ñæ=Ñz¢-õD÷D[ê6ï6ï¶Ômó«t%)Já=Qñ¨¤¨xOTf¸{=ÑiDcqðßu²÷jOä|%W¬RÚL7©_I¥÷ ®iwjOä´¥(Ã&@£©ÄAÙ,ìFL#3_ÿª=ó8ÈÍBi3]¤3Ì¢©¹Yj5³È³f |
+ìVºYÃ&@£©ÄA4Kókkókï{ ïây£6ÿÁWâ %ÒêÒÍuù¤eð8h¹t©®»Nk |
+qº®3ò`ÍHf·©ú¨8^¢à+qÒ9M×ôIËà+qå®øªkºágz4éJR7c®ë<qÇüÙäGÈFPù«CZgÓYà~Æ&7øJdPJ¿Óhêå##R3Z.Ýõòi:54¹ÁA+I³î1Óe¥üL%JfÑæõÆ0tªT--d|%2³PZéaKÍ8h¹ÔÌCåÂfyJWY4Æaº¬©ÄAz½ÍQ½mñ©o,×m:Ë»·-ÎWâ ¹\ÀÖ®Ïö ®Íßkç+qÐ2©´ÃÖ5¶-ÎA+I¡wZ¤R~¦e³°m11d¼YjÓÎÎWâ 7¥ëÚü½v¾¹Y¤=¶ó@SéÑ<¤+IÝ,aSZQÊÏTâ ¥uÿ&ºÙ¿åήc¢·¡Â,ÎWâ ¹=¤í.m¦«ù7Qð8hTB]R<¦@³8$E)ÅèÝtõy0ÊfáKÄ ½ÊNÄSÕÅ/)K|Ü,6ÓÕü(øJäf©ÕÌ"/SàKä´Ôͽ®Þ#ÆA0ËÿñãÿZÛS=endstream |
+endobj |
+6 0 obj |
+17999 |
+endobj |
+4 0 obj |
+<</Type/Page/MediaBox [0 0 612 792] |
+/Rotate 0/Parent 3 0 R |
+/Resources<</ProcSet[/PDF] |
+/ExtGState 8 0 R |
+>> |
+/Contents 5 0 R |
+>> |
+endobj |
+3 0 obj |
+<< /Type /Pages /Kids [ |
+4 0 R |
+] /Count 1 |
+/Rotate 0>> |
+endobj |
+1 0 obj |
+<</Type /Catalog /Pages 3 0 R |
+>> |
+endobj |
+7 0 obj |
+<</Type/ExtGState |
+/OPM 1>>endobj |
+8 0 obj |
+<</R7 |
+7 0 R>> |
+endobj |
+2 0 obj |
+<</Producer(GPL Ghostscript 8.15) |
+/CreationDate(D:20070312220102) |
+/ModDate(D:20070312220102) |
+/Title(BOARD.bin) |
+/Creator(PScript5.dll Version 5.2) |
+/Author(Jakub)>>endobj |
+xref |
+0 9 |
+0000000000 65535 f |
+0000018313 00000 n |
+0000018431 00000 n |
+0000018245 00000 n |
+0000018105 00000 n |
+0000000015 00000 n |
+0000018084 00000 n |
+0000018361 00000 n |
+0000018402 00000 n |
+trailer |
+<< /Size 9 /Root 1 0 R /Info 2 0 R |
+/ID [(ý*i@kìïǼþ)(ý*i@kìïǼþ)] |
+>> |
+startxref |
+18608 |
+%%EOF |
/Designs/ROBOTS/Camerus/LEDpanel/PCB/LEDpanel.pcb |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/ROBOTS/Camerus/sw/camerus.PJT |
---|
0,0 → 1,57 |
[PROJECT] |
Target=camerus.HEX |
Development_Mode= |
Processor=0x876A |
ToolSuite=CCS |
[Directories] |
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\Dr |
Library= |
LinkerScript= |
[Target Data] |
FileList=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.c |
BuildTool=C-COMPILER |
OptionString=+FM |
AdditionalOptionString= |
BuildRequired=1 |
[camerus.c] |
Type=4 |
Path= |
FileList= |
BuildTool= |
OptionString= |
AdditionalOptionString= |
[mru-list] |
1=camerus.c |
[Windows] |
0=0000 camerus.c 0 0 796 451 3 0 |
[Opened Files] |
1=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.c |
2=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.h |
3=C:\Program Files\PICC\devices\16F876A.h |
4=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\objizdka_L.c |
5=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\diag.c |
6= |
[debugperif] |
selected=Analog/Digital Conv |
[debugram] |
autoread=1 |
[debugeedata] |
autoread=1 |
[debugbreak] |
count=0 |
[pcwdebug] |
watchcol0=75 |
[debugwatch] |
count=0 |
[debugexpr] |
expr= |
sideeffects=0 |
[Units] |
Count=1 |
1=C:\dokumenty\svn\Kaklik\roboti\istrobot\camerus\SW\876\camerus.c (main) |
/Designs/ROBOTS/Camerus/sw/camerus.c |
---|
0,0 → 1,661 |
//********* Robot Camerus pro IstRobot 2007 ************ |
//"$Id: camerus.c 253 2007-04-24 09:26:46Z kakl $" |
//***************************************************** |
#include ".\camerus.h" |
#USE FAST_IO (C) // Brana C je ve FAST_IO modu, aby slo rychle cist z kamery |
// Rychlostni konstanty |
#define RR_CIHLA 50 // Rozumna rychlost pro objizdeni cihly |
#define RR_PRERUSENI 50 // Rozumna rychlost pro priblizeni se k preruseni |
#define BRZDNA_DRAHA 0x15 // Jak daleko pred problemem se zacne brzdit |
#define TUHOS 100 // Jak dlouho se bude couvat po narazu na naraznik |
#define ODODO_PROBLEM1 0xFFF |
#define ODODO_PROBLEM2 0xFFF |
#define ODODO_PROBLEM3 0xFFF |
// Adresy IIC periferii |
#define COMPAS_ADR 0xC0 |
#define CAMERA_ADR 0xDC |
#define SONAR_ADR 0xE0 |
// A/D vstupy |
#define RMAX 4 // AN4/RA5 - leve cidlo na vyjeti z cary |
#define LMAX 3 // AN3/RA3 - prave cidlo na vyjeti z cary |
#define CERVENA 2 // AN2/RA2 - cervene kroutitko |
#define ZELENA 1 // AN1/RA0 - zelene kroutitko |
#define MODRA 0 // AN0/RA1 - modre kroutitko |
// I/O |
#define HREF PIN_C5 // Signal HREF z kamery (v H po celou dobu radku) |
#define PIX PIN_C6 // Vstup pro body z kamery (za trivstupim hradlem OR (dig. komparator)) |
#define SERVO PIN_B4 // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem)) |
#define MOT_L PIN_B5 // Smer otaceni leveho motoru; druhy pol je RC2 |
#define MOT_R PIN_B6 // Smer otaceni praveho motoru; druhy pol je RC1 |
#define MOT_1 PIN_C1 // PWM vystpy motoru |
#define MOT_2 PIN_C2 // |
#define DATA PIN_B2 // K modulu LEDbar data |
#define CP PIN_B1 // K modulu LEDbar hodiny |
//#define ODO PIN_C0 // Ze snimace z odometrie z praveho kola na TIMER1 |
// Jeden impuls je 31,25mm |
#define IRRX !input(PIN_B0) // Vstup INT, generuje preruseni pri prekazce |
#define IRTX PIN_B3 // Modulovani vysilaci IR LED na detekci prekazky |
#define PROXIMITY PIN_C7 // Cidlo kratkeho dosahu na cihlu |
#define BUMPER !input(PIN_A4) // Naraznik |
#define CASMIN 6 // Rozsah radku snimace |
#define CASMAX 192 |
#define CASAVR ((CASMAX+CASMIN) / 2) |
#define EEMAX 255 // Konec EEPROM |
#define MAXLOG 0x10 // Maximalni pocet zaznamu v logu |
#if MAXLOG>(EEMAX/3) |
#error Prekrocena velikost EEPROM |
#endif |
#define OFFSETO 0x9F //0x9F // Vystredeni serva pro objeti prekazky |
#define THR 90 // Threshold pro UV cidla na caru |
#byte INTCON = 0x0B // Interrupt configuration register |
#bit GIE = INTCON.7 |
#bit PEIE = INTCON.6 |
#bit TMR0IE = INTCON.5 |
#bit INT0IE = INTCON.4 |
#bit RBIE = INTCON.3 |
#bit TMR0IF = INTCON.2 |
#bit INT0IF = INTCON.1 |
#bit RBIF = INTCON.0 |
enum stavy {start,rozjezd,jizda,cihla,pocihle,cil}; |
stavy stav; // Kde jsme na trati |
int8 cas; // Cas hrany bila/cerna v radce |
int8 stred; // Vystredeni kolecka |
int16 odocounter; // Zaznamenani aktualniho stavu pocitadla odometrie |
int16 last_log_odo; // Posledni stav odometrie poznamenany do logu |
int16 last_log; // Cislo posledniho zaznamu v logu v EEPROM |
int8 bb_h[MAXLOG]; // Cerna skrinka MSB |
int8 bb_l[MAXLOG]; // Cerna skrinka LSB |
int8 bb_f[MAXLOG]; // Cerna skrinka priznak (typ zaznamu) |
int8 log; // Pocitadlo pro cernou skrinku |
int8 rr; // Promenna na ulozeni Rozumne rychlost |
int8 rrold; |
int16 odo_preruseni, odo_cihla, odo_tunel; // Problemy na trati |
int16 odo_problem1, odo_problem2, odo_problem3; // Problemy na trati |
// Zobrazeni jednoho byte na modulu LEDbar |
inline void disp(int8 x) |
{ |
int n; |
for(n=0;n<=7;n++) |
{ |
if (bit_test(x,0)) output_low(DATA); else output_high(DATA); |
output_high(CP); |
x>>=1; |
output_low(CP); |
} |
} |
// Blikani LEDbarem ve stilu Night Rider |
void NightRider(int8 x) |
{ |
int n,i,j; |
for(j=0;j<x;j++) |
{ |
i=0x01; |
for(n=0;n<7;n++) |
{ |
disp(i); |
rotate_left(&i, 1); |
delay_ms(40); |
} |
for(n=0;n<7;n++) |
{ |
disp(i); |
rotate_right(&i, 1); |
delay_ms(40); |
} |
} |
disp(i); |
delay_ms(40); |
i=0; |
disp(i); |
} |
// Zaznam LOGu do EEPROM |
void SaveLog() |
{ |
int8 n,i,xlog; |
i=0; |
for(n=0;n<=(log*3);n+=3) // Ulozeni Black Boxu do EEPROM |
{ |
write_eeprom(n,bb_f[i]); |
write_eeprom(n+1,bb_h[i]); |
write_eeprom(n+2,bb_l[i]); |
i++; |
}; |
if(log>0) {xlog=log-1;} else {xlog=0;}; |
write_eeprom(EEMAX,xlog); // Zapis poctu zaznamu na konec EEPROM |
} |
// Zaznam do Logu do RAM |
void LogLog(int8 reason, int16 log_delay) |
{ |
int16 timer_pom; |
timer_pom=get_timer1(); // Timer se musi vycist atomicky |
bb_l[log]=make8(timer_pom,0); // Zaznam |
bb_h[log]=make8(timer_pom,1); |
bb_f[log]=reason; // Typ zaznamu |
if(log<(MAXLOG-1)) log++; // Ukazatel na dalsi zaznam |
last_log_odo=timer_pom+log_delay; // Dalsi mereni nejdrive po ujeti def. vzdalenosti |
rr=rrold; // Problem skoncil, znovu jed Rozumnou Rychlosti |
} |
void ReadBlackBox() |
{ |
last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano? |
{ |
int8 n,i; |
i=0; |
for(n=0;n<=last_log;n++) |
{ |
if(read_eeprom(i)==0) odo_tunel=MAKE16(read_eeprom(i+2),read_eeprom(i+1)); |
if(read_eeprom(i)==0xFF) odo_cihla=MAKE16(read_eeprom(i+2),read_eeprom(i+1)); |
if((read_eeprom(i)>0) && (read_eeprom(i)<0xFF)) odo_preruseni=MAKE16(read_eeprom(i+2),read_eeprom(i+1)); |
} |
} |
} |
// Brzdeni motorama stridou 1:1 |
void brzda() |
{ |
int8 n,i; |
set_pwm1_duty(0); // vypni PWM |
set_pwm2_duty(0); |
setup_ccp1(CCP_OFF); |
setup_ccp2(CCP_OFF); |
for (n=0;n<200;n++) |
{ |
output_low(MOT_L); |
output_low(MOT_R); |
output_high(MOT_1); |
output_high(MOT_2); |
delay_us(200); |
output_high(MOT_L); |
output_high(MOT_R); |
output_low(MOT_1); |
output_low(MOT_2); |
delay_us(200); |
} |
output_low(MOT_L); // smer vpred |
output_low(MOT_R); |
setup_ccp1(CCP_PWM); // RC1 // Zapni PWM pro motory |
setup_ccp2(CCP_PWM); // RC2 |
} |
void SetServo(int8 angle) |
{ |
int8 n; |
for(n=0; n<10; n++) |
{ |
output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servo |
delay_us(1000); |
delay_us(stred); |
delay_us(stred); |
delay_us(stred); |
delay_us(angle); |
delay_us(angle); |
output_low(SERVO); |
delay_ms(18); |
} |
} |
inline void SetServoQ(int8 angle) |
{ |
output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servo |
delay_us(1000); |
delay_us(stred); |
delay_us(stred); |
delay_us(stred); |
delay_us(angle); |
delay_us(angle); |
output_low(SERVO); |
} |
// Couvni po narazu na naraznik |
inline void bum() |
{ |
set_pwm1_duty(0); // couvni, rovne dozadu |
set_pwm2_duty(0); |
output_high(MOT_L); |
output_high(MOT_R); |
disp(0xA5); |
SetServo(CASAVR-CASMIN); |
} |
#include ".\diag.c" |
//---------------------------- INT -------------------------------- |
#int_EXT |
EXT_isr() // Preruseni od prekazky |
{ |
unsigned int8 bearing, bearing_offset, delta_bearing; |
set_pwm1_duty(0); // zabrzdi levym kolem, prave vypni |
set_pwm2_duty(0); |
output_high(MOT_L); |
output_low(MOT_R); |
// Ujistime se, ze prijaty signal je z naseho IR vysilace |
output_high(IRTX); // Vypni LED na detekci prekazky |
delay_ms(2); |
if (IRRX) // stale nas signal? |
{ |
output_low(MOT_L); // je odraz -> vpred |
output_low(MOT_R); |
return; |
}; |
output_low(IRTX); // Zapni LED na detekci prekazky |
i2c_start(); // Cteni kompasu |
i2c_write(COMPAS_ADR); |
i2c_write(0x1); // 0-255 (odpovida 0-359) |
i2c_stop(); |
i2c_start(); |
i2c_write(COMPAS_ADR+1); |
bearing_offset=i2c_read(0); // Poznamenej hodnotu pred cihlou |
i2c_stop(); |
delay_ms(9); |
if (!IRRX) // stale nas signal? |
{ |
output_low(MOT_L); // neni odraz -> vpred |
output_low(MOT_R); |
return; |
}; |
rr=rrold; // Po cihle se pojede opet Rozumnou Rychlosti |
if(stav!=cihla) |
{ |
LogLog(0xFF,3); // Cihla |
}; |
//!!! if(stav==cihla) while(true); // Zastav na furt, konec drahy |
// if(stav==cihla) return; // Po druhe nic neobjizdej |
// Pozor na rozjezd |
if((stav==jizda)||(stav==cihla)) // Objed cihlu |
{ |
#include ".\objizdka_L.c" |
}; |
last_log_odo=get_timer1()+16; // Pul metru po cihle nezaznamenavej do LOGu |
} |
//---------------------------------- MAIN -------------------------------------- |
void main() |
{ |
int8 offset; // Promena pro ulozeni offsetu |
int8 r1; // Rychlost motoru 1 |
int8 r2; // Rychlost motoru 2 |
int16 ble; |
setup_adc_ports(ALL_ANALOG); // Zapnuti A/D prevodniku pro cteni kroutitek |
setup_adc(ADC_CLOCK_INTERNAL); |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Casovac pro mereni casu hrany W/B v radce |
setup_timer_1(T1_EXTERNAL); // Cita pulzy z odometrie z praveho kola |
setup_timer_2(T2_DIV_BY_16,255,1); // Casovac PWM motoru |
//!!! setup_timer_2(T2_DIV_BY_4,255,1); // Casovac PWM motoru |
setup_ccp1(CCP_PWM); // RC1 // PWM pro motory |
setup_ccp2(CCP_PWM); // RC2 |
setup_comparator(NC_NC_NC_NC); |
setup_vref(FALSE); |
set_tris_c(0b11111001); // Nastaveni vstup/vystup pro branu C, protoze se to nedela automaticky |
set_pwm1_duty(0); // Zastav motory |
set_pwm2_duty(0); |
output_low(MOT_L); // Nastav smer vpred |
output_low(MOT_R); |
disp(0); // Zhasni LEDbar |
if(BUMPER) // Kdyz nekdo na zacatku drzi naraznik, vymaz log a spust diagnostiku |
{ |
diag(); |
} |
output_low(IRTX); // Zapni LED na detekci prekazky |
NightRider(1); // Zablikej, aby se poznalo, ze byl RESET |
// Zaroven se musi pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy |
//... Nastaveni sonaru ... |
i2c_start(); |
i2c_write(SONAR_ADR); |
i2c_write(0x02); // dosah |
i2c_write(0x03); // n*43mm |
i2c_stop(); |
i2c_start(); |
i2c_write(SONAR_ADR); |
i2c_write(0x01); // zesileni |
i2c_write(0x01); // male, pro eliminaci echa z minuleho mereni |
i2c_stop(); |
//... Nastaveni kamery ... |
i2c_start(); // Soft RESET kamery |
i2c_write(CAMERA_ADR); // Adresa kamery |
i2c_write(0x12); // Adresa registru COMH |
i2c_write(0x80 | 0x24); // Zapis ridiciho slova |
i2c_stop(); |
i2c_start(); // BW |
i2c_write(CAMERA_ADR); |
i2c_write(0x28); |
i2c_write(0b01000001); |
i2c_stop(); |
/* |
i2c_start(); // Contrast (nema podstatny vliv na obraz) |
i2c_write(CAMERA_ADR); |
i2c_write(0x05); |
i2c_write(0xA0); // 48h |
i2c_stop(); |
i2c_start(); // Band Filter (pokud by byl problem se zarivkama 50Hz) |
i2c_write(CAMERA_ADR); |
i2c_write(0x2D); |
i2c_write(0x04 | 0x03); |
i2c_stop(); |
*/ |
i2c_start(); // Fame Rate |
i2c_write(CAMERA_ADR); |
i2c_write(0x2B); |
i2c_write(0x00); // cca 17ms (puvodni hodnota 5Eh = 20ms) |
i2c_stop(); |
i2c_start(); // VSTRT |
i2c_write(CAMERA_ADR); |
i2c_write(0x19); |
i2c_write(118); // prostredni radka |
i2c_stop(); |
i2c_start(); // VEND |
i2c_write(CAMERA_ADR); |
i2c_write(0x1A); |
i2c_write(118); |
i2c_stop(); |
NightRider(1); // Musi se dat cas kamere na AGC a AEC |
{ // Mereni expozice |
int8 t1,t2; |
i2c_start(); // Brightness, zacni od uplne tmy |
i2c_write(CAMERA_ADR); |
i2c_write(0x06); |
i2c_write(0); // 80h default |
i2c_stop(); |
delay_ms(50); |
for(offset=0x04;offset<(255-0x04);offset+=0x04) // Zacni od jasu 10h |
{ |
i2c_start(); // Brightness |
i2c_write(CAMERA_ADR); |
i2c_write(0x06); |
i2c_write(offset); // 80h default |
i2c_stop(); |
disp(offset); |
delay_ms(50); |
t1=0; |
t2=0; |
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky |
delay_ms(5); |
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky |
set_timer0(0); // Vynuluj pocitadlo casu |
if(!input(PIX)) continue; |
while(input(PIX)); |
t1=get_timer0(); // Precti cas z citace casu hrany |
set_timer0(0); // Vynuluj pocitadlo casu |
while(!input(PIX)); |
t2=get_timer0(); |
if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break; // Vidis, co mas? |
delay_ms(2); // Preskoc druhou radku z kamery |
}; |
delay_ms(1000); // Nech chvili na displayi zmerenou hodnotu |
} |
set_adc_channel(CERVENA); // --- Kroutitko pro jas --- |
delay_ms(1); |
offset=read_adc(); |
offset &= 0b11111100; // Dva nejnizsi bity ignoruj |
// offset += 0x70; // Jas nebude nikdy nizsi |
disp(offset); |
i2c_start(); // Brightness |
i2c_write(CAMERA_adr); |
i2c_write(0x06); |
i2c_write(offset); // 80h default |
i2c_stop(); |
delay_ms(1000); // Nech hodnotu chvili na displayi |
set_adc_channel(ZELENA); // --- Kroutitko pro vykon motoru --- |
delay_ms(1); |
rr=read_adc()>>2; // 0-63 // Pokud by se zvetsil rozsah, tak zkontrolovat jakonasobeni! |
rr+=27; // 27-90 |
//!!! rr=read_adc()>>1; // 0-128 // Pokud by se zvetsil rozsah, tak zkontrolovat jakonasobeni! |
rrold=rr; |
cas=CASAVR-CASMIN; // Inicializace promenych, aby neslo servo za roh |
// a aby se to rozjelo jeste dneska |
stav=start; // Jsme na startu |
set_timer1(0); // Vynuluj citac odometrie |
log=0; // Zacatek logu v cerne skrince |
last_log_odo=0; // Posledni zaznam odometrie do logu |
ReadBlackBox(); // Vycteni zaznamu z Black Boxu |
odo_problem1=ODODO_PROBLEM1-BRZDNA_DRAHA; |
odo_problem2=ODODO_PROBLEM2-BRZDNA_DRAHA; |
odo_problem3=ODODO_PROBLEM3-BRZDNA_DRAHA; |
// ........................... Hlavni smycka ................................ |
while(true) |
{ |
int8 pom; |
int8 n; |
int8 gap; |
int16 ododo; |
gap=0; // Vynuluj pocitadlo preruseni |
next_snap: |
pom=0; |
disable_interrupts(GLOBAL); //----------------------- Critical Section |
while(input(HREF)); // Preskoc 1. radku |
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z 2. radky |
set_timer0(0); // Vynuluj pocitadlo casu |
while(input(HREF)) // Po dobu vysilani radky cekej na hranu W/B |
{ |
// !!!!Dodelat rozpoznani cerne cary napric pro zastaveni ? |
if(!input(PIX)) // Pokud se X-krat za sebou precetla CERNA |
if(!input(PIX)) |
// if(!input(PIX)) |
{ |
pom=get_timer0(); // Precti cas z citace casu hrany |
break; |
}; |
}; |
while(input(HREF)); // Pockej na shozeni signalu HREF |
if((pom<CASMAX) && (pom>CASMIN)) cas=pom; // Orizni konce radku |
// Na konci obrazovaho radku to blbne. Jednak chyba od apertury |
// a vubec to nejak na kraji nefunguje. |
output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servo |
delay_us(1000); |
delay_us(stred); |
delay_us(stred); |
delay_us(stred); |
delay_us(cas); |
delay_us(cas); |
output_low(SERVO); |
// Elektronicky diferencial 1. cast |
if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace |
if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;}; // pro rizeni rychlosti motoru |
if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92 |
enable_interrupts(GLOBAL); //----------------------- End Critical Section |
if(pom==0) // Kamera nevidi caru |
{ |
if((cas>(CASMIN+15))&&(cas<(CASMAX-15))) // Nebyla minule cara moc u kraje? |
{ |
gap++; |
if(gap>=3) // Trva preruseni cary alespon 2 snimky? |
{ |
cas=CASAVR-CASMIN; |
// disp(0xAA); |
} |
} |
} |
else |
{ |
gap=0; |
}; |
/* |
if(pom==0) // Kamera nevidi caru, poznamenej to do logu |
{ |
if((cas>(CASMIN+30))&&(cas<(CASMAX-30))) // Nebyla minule cara moc u kraje? |
if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu |
{ |
gap++; |
} |
} |
else |
{ |
if(gap>=4) // Trva preruseni cary alespon 2 snimky? |
{ |
LogLog(gap,8); // Dalsi mereni nejdrive po ujeti 24 cm |
rr=rrold; // Preruseni cary skoncilo, znovu jed Rozumnou Rychlosti |
cas=CASAVR-CASMIN; |
disp(0xAA); |
} |
gap=0; |
}; |
if(!input(PROXIMITY) && ((stav==jizda)||(stav==cihla))) // Tunel |
{ |
if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu |
{ |
LogLog(0xDD,16); // Priznak tunelu; dalsi mereni nejdrive po ujeti 48 cm |
rr=rrold; // Vjeli jsme do tunelu, znovu jed rychle |
} |
}; |
*/ |
//ODODO |
ododo=get_timer1(); |
if((ododo>odo_preruseni)&&(ododo<(odo_preruseni+8))) rr=RR_PRERUSENI; |
if((ododo>odo_cihla)&&(ododo<(odo_cihla+8))) rr=RR_PRERUSENI; |
if((ododo>odo_tunel)&&(ododo<(odo_tunel+8))) rr=RR_PRERUSENI; |
if((ododo>odo_problem1)&&(ododo<(odo_problem1+8))) rr=RR_PRERUSENI; |
if((ododo>odo_problem2)&&(ododo<(odo_problem2+8))) rr=RR_PRERUSENI; |
if((ododo>odo_problem3)&&(ododo<(odo_problem3+8))) rr=RR_PRERUSENI; |
// Elektronicky diferencial 2. cast |
if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN); // Neco jako nasobeni |
if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN); // rozsah 1 az 92 pro rr=0 // rozsah 1 az 154 pro rr=63 |
//!!! pro zatuhle prevodovky |
// r1<<=1; // Rychlost je dvojnasobna |
// r2<<=1; // Rozsah 2 az 184 pro rr=0 |
if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle)) // Jizda |
{ |
set_pwm1_duty(r1); |
set_pwm2_duty(r2); |
} |
else |
{ |
set_pwm1_duty(0); // Zastaveni |
set_pwm2_duty(0); |
}; |
if((stav==rozjezd)&&(get_timer1()>10)) // musi ujet alespon 31cm |
{ |
ext_int_edge(H_TO_L); // Nastav podminky preruseni od cihly |
INT0IF=0; // Zruseni predesle udalosti od startera |
enable_interrupts(INT_EXT); |
enable_interrupts(GLOBAL); |
stav=jizda; |
}; |
if(stav==start) // Snimkuje, toci servem a ceka na start |
{ |
set_adc_channel(MODRA); // Kroutitko na vystredeni predniho kolecka |
Delay_ms(1); |
stred=read_adc(); |
if(!input(PROXIMITY)) |
{ |
disp(0x80); |
while(input(PROXIMITY)); // Cekej, dokud starter neda ruku pryc |
set_timer1(0); // Vynuluj citac odometrie |
set_pwm1_duty(255); // Rychly rozjezd !!! Zkontrolovat na oscyloskopu |
set_pwm2_duty(255); |
disp(0x01); |
while(get_timer1()<=4) // Ujed alespon 12cm |
{ |
set_adc_channel(LMAX); // Levy UV sensor |
delay_us(40); |
if(read_adc()<THR) {cas=CASMIN; break;}; // Prejeli jsme caru vlevo |
set_adc_channel(RMAX); // Pravy UV sensor |
delay_us(40); |
if(read_adc()<THR) {cas=CASMAX; break;}; // Prejeli jsme caru vpravo |
cas=CASAVR-CASMIN; // Cara je rovne |
}; |
stav=rozjezd; |
}; |
} |
pom=0x80; // Zobrazeni pozice cary na displayi |
for(n=CASMAX/8; n<cas; n+=CASMAX/8) pom>>=1; |
disp(pom); |
while(true) // Ve zbytku casu snimku cti krajni UV senzory a naraznik |
{ |
if(BUMPER) // Sakra, do neceho jsme narazili a nevideli jsme to! |
{ |
bum(); |
SaveLog(); // Zapis Black Boxu do EEPROM |
delay_ms(TUHOS); //!!! Zatuhle prevodovky |
set_pwm1_duty(200); // pomalu vpred |
set_pwm2_duty(200); |
output_low(MOT_L); |
output_low(MOT_R); |
cas=CASAVR-CASMIN; |
}; |
set_adc_channel(LMAX); // Levy UV sensor |
for(n=0;n<20;n++) if(input(HREF)) goto next_snap; |
if(read_adc()<THR) cas=CASMIN; |
set_adc_channel(RMAX); // Pravy UV sensor |
for(n=0;n<20;n++) if(input(HREF)) goto next_snap; |
if(read_adc()<THR) cas=CASMAX; |
}; |
} |
} |
/Designs/ROBOTS/Camerus/sw/camerus.h |
---|
0,0 → 1,16 |
#include <16F876A.h> |
#device adc=8 |
#FUSES NOWDT //No Watch Dog Timer |
#FUSES HS //High speed Osc (> 4mhz) |
#FUSES NOPUT //No Power Up Timer |
#FUSES NOPROTECT //Code not protected from reading |
#FUSES NODEBUG //No Debug mode for ICD |
#FUSES NOBROWNOUT //No brownout reset |
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O |
#FUSES NOCPD //No EE protection |
#FUSES NOWRT //Program memory not write protected |
#use delay(clock=20000000) |
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3,force_hw) |
/Designs/ROBOTS/Camerus/sw/diag.c |
---|
0,0 → 1,68 |
//--- Diagnostika cidel a vymazani EEPROM --- |
void diag() |
{ |
int8 n; |
// Vymaz Black Box v EEPROM |
for(n=0;n<255;n++) write_eeprom(n,0); |
bb_l[0]=0; // Zapis na pozici 0 vzdalenost 0 |
bb_h[0]=0; |
bb_f[0]=0; |
write_eeprom(EEMAX,0); // Zapis do EEPROM pocet zaznamu 0, tedy jeden zaznam |
for(n=0;n<=4;n++) |
{ |
disp(0x55); // Blikni pro potvrzeni |
delay_ms(200); |
disp(0xAA); |
delay_ms(200); |
}; |
while(true) |
{ |
if(!IRRX) |
{ |
int8 ble; |
i2c_start(); // Cteni kompasu |
i2c_write(COMPAS_ADR); |
i2c_write(0x1); |
i2c_stop(); |
i2c_start(); |
i2c_write(COMPAS_ADR+1); |
ble=i2c_read(0); |
i2c_stop(); |
disp(ble); |
delay_ms(200); |
} |
else |
{ |
i2c_start(); // Diagnostika sonaru |
i2c_write(SONAR_ADR); |
i2c_write(0x02); // dosah |
i2c_write(0x03); // n*43mm |
i2c_stop(); |
i2c_start(); |
i2c_write(SONAR_ADR); |
i2c_write(0x01); // zesileni |
i2c_write(0x01); // male, pro eliminaci echa z minuleho mereni |
i2c_stop(); |
i2c_start(); // Sonar Ping |
i2c_write(0xE0); |
i2c_write(0x0); |
i2c_write(0x51); // 50 mereni v palcich, 51 mereni v cm, 52 v us |
i2c_stop(); |
delay_ms(100); |
i2c_start(); // Odraz ze sonaru |
i2c_write(0xE0); |
i2c_write(0x3); |
i2c_stop(); |
i2c_start(); |
i2c_write(0xE1); |
n=i2c_read(0); |
i2c_stop(); |
disp(n); // Zobrazeni hodnoty ze sonaru a zaroven diagnostika predniho IR cidla |
delay_ms(200); |
} |
} |
} |
/Designs/ROBOTS/Camerus/sw/objizdka_L.c |
---|
0,0 → 1,183 |
// **** Objeti cihly vlevo **** LLLL |
#define L_TOUCH 1 // Cara vlevo |
#define R_TOUCH 2 // Cata vpravo |
#define B_TOUCH 3 // Both |
int8 n; |
int8 r1,r2,rr; |
int8 touch; |
enum okolo_cihly {pred_carou,na_care,po_care}; |
okolo_cihly ridic; // V jakem jsme stavu objizdeni cihly |
int8 vzdalenost; |
int8 visualisation; |
stav=cihla; // Dalsi prekazku uz nezaznamenavej (je to s velkou pravdepodobnosti cil) |
odocounter=get_timer1(); |
cihla: |
rr=RR_CIHLA; //!!! Rozumna rychlost pro objizdeni cihly (bylo by lepsi rychlost zvysovat) a pri detekci pohybu zase snizit |
disp(0x99); |
set_pwm1_duty(0); // zabrzdi levym kolem, prave vpred |
set_pwm2_duty(255); |
output_high(MOT_L); |
output_low(MOT_R); |
while(true) // Na zacatku se vyhni cihle, zatoc co muzes |
{ |
cas=CASMIN-5; // jeste vic nez hodne do leva |
if(BUMPER) // Narazili jsme do cihly, musime couvnout! |
{ |
bum(); |
SaveLog(); // Zapis Black Boxu do EEPROM |
delay_ms(TUHOS); //!!! Zatuhle prevodovky |
brzda(); |
goto cihla; // Znovu zacni cihlu objizdet |
}; |
set_pwm1_duty(0); |
set_pwm2_duty(255); // !!! mozna prilis maly vykon pro rozjezd pro zatuhlou prevodovku |
output_high(MOT_L); // leve kolo reverz |
output_low(MOT_R); // prave kolo vpred |
if(get_timer1()>(odocounter+5)) // konec zatacky? |
{ |
disp(0x66); |
break; |
} |
SetServoQ(cas); |
delay_ms(18); |
}; |
//------ Objeti cihly v konstantni vzdalenosti ------ |
touch=0; // Indikator detekce cary pri objizdeni |
ridic=pred_carou; |
cas=CASAVR-CASMIN; // rovne |
output_low(MOT_L); // vpred |
output_low(MOT_R); |
visualisation=0; |
while(true) |
{ |
if(BUMPER) // Narazili jsme do cihly, musime couvnout! |
{ |
bum(); |
SaveLog(); // Zapis Black Boxu do EEPROM |
delay_ms(TUHOS); //!!! Zatuhle prevodovky |
set_pwm1_duty(160); // vpred |
set_pwm2_duty(160); |
output_low(MOT_L); |
output_low(MOT_R); |
cas=CASMIN; |
}; |
delta_bearing=bearing-bearing_offset; |
visualisation=(delta_bearing & 0xF0) | (visualisation & 0x0F); |
if(IRRX) // hrozi celni srazka s cihlou v prubehu objizdeni |
{ |
cas=CASMIN; |
} |
else |
{ |
if((vzdalenost!=0)||!input(PROXIMITY)||((delta_bearing>60)&&(delta_bearing<128))) // Udrzovani konstantni vzdalenosti od cihly |
{ |
if(cas>(CASMIN+30)) cas-=30; |
} |
else |
{ |
if(cas<(CASMAX-30)) cas+=30; |
}; |
}; |
// Elektronicky diferencial |
if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace |
if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;}; // pro rizeni rychlosti motoru |
if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92 |
if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN); // Neco jako nasobeni |
if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN); |
//!!! pro zatuhle prevodovky |
// r1<<=1; // Rychlost je dvojnasobna |
// r2<<=1; // Rozsah 2 az 184 pro rr=0 |
set_pwm1_duty(r1); // Nastav rychlost motoru |
set_pwm2_duty(r2); |
SetServoQ(cas); |
i2c_start(); // Sonar Ping |
i2c_write(SONAR_ADR); |
i2c_write(0x0); |
i2c_write(0x52); // mereni v us |
i2c_stop(); |
for(n=1;n<=90;n++) // 18ms testovani cary do dalsi korekce serva |
{ |
set_adc_channel(LMAX); |
delay_us(100); |
if(read_adc()<THR) touch|=L_TOUCH; |
set_adc_channel(RMAX); |
delay_us(100); |
if(read_adc()<THR) touch|=R_TOUCH; |
}; |
i2c_start(); // Odraz ze sonaru |
i2c_write(SONAR_ADR); |
i2c_write(0x3); |
i2c_stop(); |
i2c_start(); |
i2c_write(SONAR_ADR+1); |
vzdalenost=i2c_read(0); |
i2c_stop(); |
i2c_start(); // Cteni kompasu |
i2c_write(COMPAS_ADR); |
i2c_write(0x1); // uhel 0-255 |
i2c_stop(); |
i2c_start(); |
i2c_write(COMPAS_ADR+1); |
bearing=i2c_read(0); |
i2c_stop(); |
if(touch==L_TOUCH) visualisation|=0x2; |
if(touch==R_TOUCH) visualisation|=0x1; |
if((touch==B_TOUCH)&&(ridic==pred_carou)) ridic=na_care; |
if((ridic==na_care)&&(touch==0)) break; |
if(ridic==na_care) touch=0; |
disp(visualisation); |
}; |
disp(0xC3); |
set_pwm1_duty(0); //!!! pred zatuhlejma prevodovkama tam bylo 20 a 200 |
set_pwm2_duty(255); |
output_high(MOT_L); |
output_low(MOT_R); |
delay_us(40); |
odocounter=get_timer1(); // Poznamenej aktualni stav odometrie |
while (true) // Znovu se musime dotknout cary |
{ |
for(n=1;n<=90;n++) // 18ms testovani cary do dalsi korekce serva |
{ |
set_adc_channel(LMAX); // Levy UV sensor |
delay_us(100); |
if(read_adc()<THR) // Dotkli jsme se levym senzorem |
{ |
disp(0xE0); |
cas=CASAVR-CASMIN; // nastavime, ze cara je rovne |
goto cara; |
}; |
set_adc_channel(RMAX); // Pravy UV sensor |
delay_us(100); |
if((get_timer1()>=(odocounter+2)) && (read_adc()<THR)) // Pravym senzorem nesmime caru prejet! |
{ |
disp(0x07); |
cas=CASMAX; // kdyz prejedem, tak nastavime, ze cara je vpravo |
goto cara; |
}; |
} |
SetServoQ(CASMIN-5); // max. max. doleva L |
} |
cara: |
output_low(MOT_L); // oba motory vpred |
output_low(MOT_R); |