Bezdrátově řízený model vozidla 2

Pro všechny nadšence RC autíček připravuji nový článek o mé bakalářské práci, která byla na téma bezdrátově řízený model vozidla. Nešlo pouze o řízení vozidla, ale také o realizaci moderních prvků, které jsou v dnešních automobilech jako např. ASR,
ABS a podobně.

 

Každý si rád hraje a já nejsem výjimkou. Podařilo se mi v rámci školy jako bakalářskou práci si vybrat téma, při kterém nejde jen o to, něco vyrobit, ale taky si pohrát. Podívejte se a posuďte sami.

Ačkoliv jsem chtěl udělat autíčko na dálkové ovládání, tak v zadání bylo vytvořit model vozidla, který bude realizovat moderní prvky ve skutečných vozidlech. Jako např. ABS, ASR, detekci překážek a další. Samozřejmě i tomu jsem se v mé práci věnoval, ale víc mě zajímala myšlenka vozidla, které budu řídit bezdrátově počítačem za pomocí herního ovladače.

auto

Obr. 1: Koupený podvozek vozidla.

Ze začátku jsem měl k dispozici ze školy podvozek, který se dá běžně koupit pro RC auta (Obr. 1). Použil jsem i regulátor otáček motoru (obr. 2), který auto mělo a já jen přidal řídicí elektroniku a program.
speed_controller

Obr. 2: Speed controller – regulátor rychlosti pomocí PWM

Ve vozidle je mikrokontrolér Atmel ATmega32, který přijímá příkazy z bluetooth modulu BTM-112 (více informací ve článku o bluetooth). Ten je spárovaný s modulem připojeným k počítači přes USB převodník. S USB (respektive s rs232 portem) komunikuje program v počítači napsaný ještě ve Visual Basicu 6. Blokové schémata celého projektu jsou na obrázcích níže. Na obrázku 3 je blokové schéma modulu ve vozidle a na obrázku 4 je blokové schéma modulu připojeného k PC.
rc_blok_auto

Obr. 3: Blokové schéma modulu ve vozidle.

rc_blok_pc

Obr. 4: Blokové schéma modulu připojeného k PC.

Na vozidle je umístěno i několik senzorů na informování o teplotě, překážkách a dalších jevech. Vše je popsání v jednotlivých blocích schématu.

Popis jednotlivých bloků schématu

Joystick

K ovládání vozidla jsem se rozhodl využít klasický herní joystick s analogovými páčkami (obr. 2.1), který se připojuje k počítači přes USB port. Výhodou použití joysticku je velké množství nastavitelných mezikroků páčky a díky tomu je možné pohodlně ovládat zatáčení kol vozidla v širokém rozsahu a také snadno volit rychlost pohybu vozidla. Oproti tomu na klávesnici, v případě použití šipek, které mají hodnotu pouze sepnuto a rozepnuto, by vozidlo jelo maximální rychlostí nebo stálo respektive zatočilo úplně vlevo, či vpravo. Ale joystick má 65 536 mezistavů na každé ose a vždy v půlce tohoto rozsahu je nulová poloha. Proto k zatáčení stačí pouze přepočítat tyto mezistavy na 100 kroků servomotoru a pro změnu rychlosti stejným způsobem přepočítat na 100 stavů pro speed controller. Přepočet mezi hodnotami joysticku a hodnotami pro servo respektive speed controller řeší program v počítači podle vzorce (1).
joystick

Obr. 2.1: Joystick použitý v mé práci

Joystick disponuje dvěma analogovými páčkami, takže kromě samotného řízení je možné druhou použít např. na ovládání serva, které bude otáčet kamerou, IR senzorem nebo jakoukoliv jinou součástí vozidla.

Dále je možné využít na joysticku klasické tlačítka např. pro spínání světel nebo na dotazování se mikrokontroléru ve vozidle na určité stavy.

Vzorec pro přepočet hodnot joysticku na hodnoty servomotoru respektive hodnoty speed controlleru

Y = |100+(X+655,35)|   (Vzorec 1)

kde X je souřadnice joysticku.

PC

Pro sjednocení veškerého hardwaru jsem využil notebook s operačním systémem Microsoft Windows 7, který disponuje minimálně jedním USB portem a rozhraním bluetooth. Na tomto notebooku je spuštěný software, který jsem naprogramoval pro ovládání vozidla. Tento software zpracovává hodnoty joysticku, přepočítává je a podle toho odesílá datové rámce na virtuální COM port vytvořený spojením bluetooth.

Ovládací software je naprogramován v jazyce Visual Basic 6.0 a to především proto, že má snadný přístup k portům a je jednoduchý k programování následující aplikace. Dalším důvodem bylo i to, že s tímto jazykem mám pro práci s hardwarem největší zkušenosti.

Hlavní okno aplikace (obr. 2.2) samo o sobě neobsahuje skoro žádné prvky, jen několik formulářových voleb pro základní nastavení celé aplikace a pole pro výpis informací přijatých z vozidla. Na místo ovládacích prvků je použitý joystick.
bez nzvu

Obr. 2.2: Aplikace naprogramovaná pro testování a ovládání modelu vozidla

Po spuštění programu je nutné nejprve nastavit vhodný port a uskutečnit spojení mezi bluetooth ve vozidle a počítačem. V tu chvíli se také zapne časovač, který se každých 20 ms dotazuje knihovny ve windows na informace o poloze páček joysticku. Knihovna vrátí polohu a pak následuje přepočet na hodnoty pro ovládání serva podle vzorce 1. Poté následuje podmínka, zda-li se hodnota změnila oproti minulé, aby se neodesílalo zbytečně více stejných rámců stále za sebou. Rámec se tedy odešle pouze při změně. Pak už se jen zapíše nová hodnota do proměnné s předcházející hodnotou pro další porovnání. V průběhu ještě navíc dochází k dělení rychlosti, tak aby bylo možné řídit model vozidla i v malých prostorech. Pak tedy maximum na joysticku odpovídá podělené rychlosti, která se dá rovněž nastavit pomocí formulářové volby.

Dále program přijímá informace od vozidla o teplotě, překážkách kolem vozidla a bílé čáře pod vozidlem. Tyto informace jsou graficky zobrazovány v okně programu.

Převodník z USB na USART

Převodník je realizován integrovaným obvodem FT232RL, který vyrábí firma FTDI chip. Schéma převodníku je velice jednoduché, stačí pouze připojit k integrovanému obvodu USB konektor, napájecí napětí (max. 6 V), několik blokovacích kondenzátorů a volitelně dvě LED diody pro indikaci přenosu dat v obou směrech Vše je zobrazeno na obrázku 2.3.
ftdi

Obr. 2.3: Schéma převodníku z USB na USART

BTM-112

Více informací v článku o bluetooth.

Mikrokontrolér

Srdcem celého schématu i vozidla je mikrokontrolér Atmel ATmega32 s externím krystalovým oscilátorem nastaveným na 16 MHz. Jeho výběr byl ovlivněn především velikostí paměti pro programovou část, ale i z důvodu velkého množství integrovaných hardwarových periferií, které je možné snadno používat téměř nezávisle na programu a tím také snížit velikost zdrojového kódu.

Program pro mikrokontrolér je naprogramován v jazyce C pro mikrokontroléry Atmel AVR a byl laděn ve vývojovém prostředí AVR Studio 4 od firmy Atmel, které je volně ke stažení. Programovací jazyk je velice podobný klasickému C, s tím rozdílem, že pro hardwarové periferie se zapisuje přímo do registrů a jsou k dispozici některé funkce navíc.

Na začátku programu se inicializují všechny sběrnice, hardwarové periferie a povolí se přerušení, které je hlavním stavebním prvkem programu. Jedná se především o přerušení ze sběrnice USART, které se provede pouze tehdy, když jsou na sběrnici data k příjmu. V přerušení se provádí v cyklu načítání jednotlivých znaků postupně do proměnné, která je jako pole znaků o délce 100 (dále nazývané jako řetězec). Poté je v nekonečném cyklu zjišťována přítomnost znaku hash (#) v načteném řetězci funkcí strstr(text,”#”), která vrací hodnotu NULL v případě, že se znak nevyskytuje v řetězci. V opačném případě vrací hodnotu ukazatele na první výskyt tohoto znaku a tím je podmínka splněna. Poté se provádí rozdělení řetězce podle znaku dolar ($) pomocí funkce znaky[i]=strtok(text,delims), kde text je načtený řetězec a delims je řetězec obsahující znaky dolaru. Jednotlivé části řetězce jsou postupně vráceny v cyklu do pole řetězců znaky a nakonec se ještě provede vyprázdnění řetězce text, aby byl připraven pro další načtení znaků z USART.

Další částí nekonečného cyklu jsou podmínky porovnávající první řetězec v poli znaky funkcí strcmp(znaky[1],”S”), která porovnává dva řetězce a vrací hodnotu 0, když jsou řetězce shodné. Tyto podmínky zpracovávají znak v první části datového rámce podle obrázku 3.1, podle kterého se následně rozhoduje, jaký příkaz se vykoná. Jakmile je některá z těchto podmínek splněna, pak je uvnitř podmínky buď zápis do proměnné pro PWM nebo volání jiných funkcí ke splnění příkazu. Jako např. funkce pro čtení hodnot A/D převodníku, komunikaci se sběrnicí I2C nebo zápis hodnot do registru příslušného portu k sepnutí výstupu.

Snímání polohy akcelerometrem

K mikrokontroléru je přes sběrnici I2C připojený akcelerometr, který snímá zrychlení vozidla. Akcelerometr obsahuje ke každé souřadnici dva registry a může nám informaci o zrychlení posílat v 12ti nebo 16ti bitovém výsledku. Na to, aby jsme dostali z výsledného zrychlení rychlost vozidla případně ujetou dráhu, je potřeba tento výsledek zintegrovat.

Mikrokontrolér bohužel integrály nezná, proto je potřeba načítat zrychlení z akcelerometru ve stejných intervalech a počítat integrál např. obdélníkovou metodou, kterou jsem zvolil já. Samozřejmě tím se snižuje přesnost výsledku. Proto je potřeba mít vzorkovací interval co nejkratší a to vyřeší přerušení čítače/časovače v mikrokontroléru, které se spouští vždy ve stejný čas a načte další hodnotu zrychlení. Tím je mikrokontrolér schopný načtené hodnoty zpracovat a vypočítat z nich okamžitou rychlost, průměrnou rychlost a ujetou dráhu vozidla. Tyto hodnoty pak uchovává v dočasné paměti a software v PC si je může vyžádat příkazem z tabulky 1.

Měření teploty

Kromě akcelerometru jsou na sběrnici I2C připojeny ještě teplotní senzory TC74, které jsou rovněž popsány již v článku o TC74, který se zabývá teoretickými údaji těchto senzorů. Senzory jsou určeny pro měření teploty motoru, akumulátoru a okolního prostředí. Výhodná je konstrukce těchto senzorů, protože s jejich pouzdrem se snadno pracuje a mají kovovou plochu na přichycení přímo k měřené součásti. Další výhodou je digitální výstup. Protože veškeré měření teploty a její zpracování se děje přímo v senzoru a přes sběrnici I2C už se čte pouze hodnota registru, ve kterém je uložena informace o teplotě. Mikrokontrolér tedy nemusí vůbec řešit žádný převod, protože dostane přímo konkrétní hodnotu teploty a tu posílá počítači na vyžádání příkazem z tabulky 1.

Servomotor řízení

Nyní se dostáváme k bloku, který je představován přímo konkrétním servomotorem s označením HS-645MG a ve vozidle je použitý k zatáčení přední nápravy. Jakým způsobem se servo ovládá je detailně popsáno v článku o servomotorech. V podstatě se jedná o jednoduchou PWM, která je realizována v mikrokontroléru čítačem/časovačem a ovlivňována přijatými datovými rámci z počítače. Tyto rámce odpovídají struktuře na obrázku 3.1 a tabulce 1.

Měření vzdálenosti objektů

Blok pro měření vzdálenosti od objektů je realizován modulem zakoupeným ve firmě Snail Instruments (obr. 2.4). Tento modul s označením GP2Y0A41 měří vzdálenost objektů na principu infračervených vln, které modul vyšle, ony se odrazí a vrací zpět do přijímače. Modul mezitím počítá čas mezi odrazem a příjmem. Z toho vypočítá vzdálenost, která je reprezentována napětím na výstupu a to je úměrné vzdálenosti podle vzorce (3). Vzorec pro výpočet vzdálenosti objektu podle výstupního napětí modulu

L = (2914 / (ADV+5)) – 1 (vzorec 3)

kde L je vzdálenost a ADV je naměřená hodnota 10bitovým A/D převodníkem.

ir

Obr. 2.4: Fotografie IR detektoru vzdálenosti GP2Y0A41

Komparátor

Blok analogového komparátoru jsem vložil do mého výsledného řešení až na poslední chvíli, protože jsem chtěl využít dva IR detektory překážek a měl jsem na desce vyvedený pouze jeden vstup A/D převodníku.

Použil jsem velice jednoduché a ověřené zapojení komparátoru s operačním zesilovačem LM338 (schéma na obrázku 2.5), který je výhodný především proto, že nepotřebuje symetrické napájení.

Vstup je označen na schématu jako IR1 (resp. IR2) a připojuje se k němu analogový výstup IR detektoru. Hodnota na vstupu je porovnávána komparátorem s hodnotou nastavenou pomocí děliče, který je možné regulovat trimrem R1 (resp. R2). Tím se tedy reguluje reakce na vzdálenost od překážky. Na výstupu komparátoru je logická hodnota, kterou zpracovává mikrokontrolér.

komparator

Obr. 2.5: Schéma analogového komparátoru

Měření a porovnávání otáček kol

Pro realizaci některých prvků ve vozidle je potřeba snímat počet otáček každého kola zvlášť. Proto bylo nutné zvážit, jaké senzory použít tak, aby jejich montáž do modelu nebyla náročná a přitom byly dostatečně rychlé a přesné. Existuje několik variant, např. optická závora, mechanický spínač, magnetický spínač a mnohé další. Z nich jsem si zvolil magnetický jazýčkový spínač (obr. 2.6), protože stačí připevnit permanentní magnet na kolo a magnetický spínač dává impulsy podle otočení kola. V případě využití více permanentních magnetů na kole se dá dosáhnout rychlejších reakcí, ale to pouze za předpokladu, že magnetický spínač bude dostatečně rychlý. Kladem takového řešení je i jeho cena, protože permanentní magnety nejsou nijak drahé a magnetický spínač také ne. Místo magnetického spínače je možné využít Hallovu sondu, kterou je možné snímat vyšší otáčky.

hall

Obr. 2.6: Fotografie použitého magnetického spínače

Speed controller a motor

Nedílnou součástí vozidla je pohon. V mém případě se jedná o klasický elektromotor na napětí 7,2 V, který je spínán budičem speed controller ESC300 (obr. 2.7). Tento budič se vyrábí přímo pro modely vozidel a byl zvolen především proto, že jeho ovládání je snadné a díky němu je možné měnit rychlost otáček motoru. Řízení tohoto budiče se děje pomocí PWM stejně tak, jako u servomotoru. Šířkou impulsu se nastavuje rychlost otáček.
speed_controller

Obr. 2.7: Fotografie použitého speed controlleru ESC300

Senzor bílé čáry

Moderní automobily dokáží udržovat vozidlo v pruhu podle bílých čar na vozovce a případně řidiče upozornit při nechtěném vybočení z pruhu. Nejčastěji se využívá kamera kamera, která snímá prostor před vozidlem a patřičný software vyhodnocuje jestli je vozidlo v pruhu.

Já jsem pro tuto nadstandardní funkci mého vozidla využil dva senzory s označením OPB770TZ (obr. 2.8). Jeden senzor se skládá ze dvou prvků. Jedním je IR dioda a druhým je fototranzistor. Schéma zapojení jednoho senzoru je na obrázku 2.10. Podle schématu je zřejmé, že IR dioda je stále pod napětím a stále osvětluje plochu před sebou. Jestliže se světelný paprsek odrazí od plochy, pak se jedná o bílou barvu, protože od černé se infračervené světlo neodráží, ale je pohlceno. V případě bílé barvy je tedy na výstupu log. 0, protože je fototranzistor v sepnutém stavu. U černé barvy je tomu opačně. Fototranzistor je rozepnutý a na výstupu je log. 1.

ir_senzor

Obr. 2.8: Senzor QRD1114 pro detekci bílé čáry

Senzory jsem využil dva proto, aby bylo možné detekovat i směr vybočení vozidla. Na obrázku 2.9 je výsledný modul, který jsem umístil pod vozidlo. Je nutné, aby vzdálenost mezi senzorem a vozovkou byla méně než 1 cm. To je nevýhodou celého řešení detekce bílé čáry, protože na silnicích jsou různé výmoly a tak by detekce nebyla přesná. Proto se tento způsob v praxi nepoužívá.

ir2

Obr. 2.9: Fotografie vytvořeného senzoru na detekci bílé čáry

V hlavním okně aplikace se vybočení znázorňuje zčervenáním patřičné čáry vedle obrázku vozidla.

ir_sch

Obr. 2.10: Schéma zapojení jednoho senzoru

Celková komunikace

Nyní, když jsem vysvětlil všechny bloky mého řešení, se dostávám k podstatné části a tou je přenos dat, jejich vyhodnocení, zpracování a popř. poslání správné odpovědi. Proto tedy začnu ze strany PC. Joystick připojený do USB počítače s ovládacím programem posílá informace o poloze analogových páček softwaru v PC. Poté se ovládací program dotazuje v pravidelných dosti krátkých intervalech knihovny implementované ve Windows, která slouží na komunikaci se vstupně/výstupními zařízeními, na hodnoty v podobě dvou celých čísel v rozsahu 0 – 65 536. Tyto čísla představují polohu páčky v osách x a y, kdy neutrální tedy středová poloha nastává tehdy, když program dostane přesně poloviční číslo 32 768. Menší čísla jsou pak záporné hodnoty na osách a větší představují kladnou část osy. Dále se program může ptát na hodnoty tlačítek na joysticku a tím zjišťovat zda-li je tlačítko v danou chvíli stisknuté či nikoliv. Podle toho program dále vyhodnocuje jestli se změnila poloha páčky oproti minulému cyklu a jestliže ano, pak pošle na virtuální sériový port příslušný rámec dat.

Příklad použitého rámce je zobrazen na obrázku 3.1. Jedná se o znakově orientované rámce, kdy každý rámec začíná znakem dolar ($), po něm se posílá příkaz pro vykonání a jeho hodnota. Za příkazem i hodnotou je znovu obsažený znak ($), aby bylo možné rozdělit tento rámec a vytáhnout z něj příslušná data. Konec rámce je vždy označen znakem hash (#).

ramec

Obr. 3.1: Datový rámec, který přenáší informace mezi PC a vozidlem

Knihovna pro práci s porty rozloží každý znak na jednotlivé bity podle nastaveného USART přenosu. V mém případě se jedná o 8 bitů, jeden stop bit a jeden paritní bit, který kontroluje lichou paritu. Pak se celá zpráva přenese rychlostí 115 200 bit/s do integrovaného bluetooth modulu v notebooku, který ji vzduchem přenese do modulu BTM-112 a ten ji předá mikrokontroléru ve vozidle také přes USART. Mikrokontrolér musí mít stejné nastavení USART jako BTM-112 a jako počítač, který vysílá data.

Příjem dat v mikrokontroléru probíhá jako přerušení na vstupu USART a přijímá se v cyklu znak po znaku. Jakmile se v přijímaném řetězci objeví hash (#), pak je řetězec rozdělen na dvě části podle znaku dolar ($). Tyto dvě části jdou k porovnání. První část je porovnávána jako první a určuje příkaz, který se má vykonat. Všechny příkazy, které je možné použít jsou popsány v tabulce 1. Jakmile se přijatý příkaz shoduje s některým v tabulce, pak se zpracovává druhá část řetězce, která určuje hodnotu.

Jestliže se jedná o příkaz U nebo S, pak se přečtená hodnota ukládá do proměnné, která nastavuje šířku impulsů u PWM a podle ní se otáčí servomotor řízení nebo nastavuje speed controller pro ovládání rychlosti jízdy. Jakmile je přijatý příkaz I nebo P, jedná se pak o čtení hodnoty A/D převodníku a její přepočet na požadovaný tvar. Tím je myšleno, že se přepočítá hodnota z registru na napětí podle zvoleného referenčního napětí podle vzorce (2). Dalším případem je příkaz L, který pouze nastaví na příslušném portu log. 1, pro sepnutí relé, tranzistoru nebo rozsvícení přímo LED diody. Příkaz T, aktivuje I2C linku, pošle adresu příslušnému teplotnímu čidlu 45a vyžádá od něj hodnotu z registru TEMP, který obsahuje aktuální teplotu.

Pro přepočet hodnoty registru A/D převodníku na napětí se používá následující vzorec

U = (CISLO * 2,56) / 1024 (vzorec 2)

kde CISLO je hodnota uložená v registru a U je měřené napětí v rozsahu 0 až 2,56 V. Vzorec je pro referenční napětí 2,56 V.

Tabulka 1: Přehled dostupných příkazů pro model vozidla

Příkaz Hodnoty Popis
U 100 – 200 Příkaz nastavuje jízdu vozidla.
S 100 – 200 Příkazem se zatáčí.
T 1 – 3 Příkaz se dotazuje teplotního senzoru přes I2C na aktuální teplotu.
V 0 – 999 Dotaz na počet impulsů z předního kola. Podle toho se pak počítá ujetá vzdálenost.
I D1, U1, 0 Vozidlo posílá informaci o překážkách.
P 0 – 1 Aktivace/deaktivace detektorů překážek.
C R1, L1, LR0 Vozidlo posílá informaci o bílé čáře.
A DL, DR, 0 Vozidlo posílá informaci o ASR.

Poděkování

Děkuji vedoucímu bakalářské práce Doc. Ing. Pavlovi Šteffanovi, Ph. D. za metodickou pomoc, připomínky, cenné rady při zpracování práce, zapůjčení modelu vozidla a zakoupení potřebných modulů a panu Ing. Ladislavu Macháňovi za příkladnou pomoc v laboratoři.

Dále děkuji firmě SOS electronic za pomoc při výběru součástek a finanční podporu.

Fotografie

Video

Komentovat

Vaše e-mailová adresa nebude zveřejněna. Povinná pole jsou označena *

*

*