Arduino Nano a akcelerometr

Začněme troškou teorie. Akcelerometr je součástka, která měří zrychlení a převádí jeho hodnotu na elektrické napětí. Při použití akcelerometru rozlišujeme dva druhy zrychlení - dynamické, které vznikne změnou rychlosti pohybu a statické, které je následkem tíhového působení země. V praxi to znamená, že dynamické zrychlení akcelerometru udělíme například tak, že s ním budeme ve vzduchu mávat sem a tam. Naopak statické zrychlení na jednotlivých osách akcelerometru je závislé na jeho orientaci vůči zemi. Aniž si to uvědomujete, nejspíše jste se již s tímto principem setkali například ve vašem mobilním telefonu, ten automaticky přetáčí displej, když ho držíte naležato. Určování orientace (náklonu) vůči zemi pomocí akcelerometru bych se rád věnoval v tomto článku, nikoliv tedy studiu zrychleného pochybu.

modul akcelerometru

Modul tříosého akcelerometru, který jsem zakoupil se už bohužel neprodává, ale neměl by být problém nahradit ho některým z novějších ekvivalentů. Základem modulu je akcelerometr od firmy Freescale MMA7260, který umí měřit jak dynamické, tak statické zrychlení ve všech třech osách (XYZ). Výstupním signálem je analogové napětí od 0 do 3,3V, které budeme měřit analogově-digitálním převodníkem (dále jen A/D převodník) Arduina Nano. Obrázek modulu jsem přejal z www.pololu.com:

Pomocí jumperů lze u akcelerometru nastavit 4 rozsahy měření: 1,5g (800mV/g), 2g (600mV/g), 4g (300mV/g), 6g (200mV/g). Pro určování orientace (náklonu) je ideální nejmenší rozsah a tedy nejvyšší citlivost 800mV/g. Podle datashetu odpovídá v tomto rozsahu kladnému tíhovému zrychlení* napětí na výstupu 2,45V, nulovému zrychlení 1,65V a zápornému tíhovému zrychlení (akcelerometr vzhůru nohama) 0,85V. Pochopitelně na to nelze 100% spoléhat, při pokusech totiž vždy naměříme určité odchylky a liší se i jednotlivé osy. Ideální je zapsat si rovnou hodnoty z A/D převodníku Arduina pro příslušné krajní polohy a s těmi dále pracovat. Vzhledem k tomu, že A/D převodník pracuje s napětím 0 až 5V a výstupy akcelerometru nepřekročí 3,3V využijeme bohužel jen část rozsahu převodníku a naše měření bude méně přesné.

* Tíhové zrychlení g je důsledkem tíhové síly a jeho hodnota závisí na zeměpisné šířce. Mezinárodně dohodnutá standardní velikost je 9,80665 m.s-2

Jak jsem se již zmiňoval výše, statické zrychlení, které naměříme na jednotlivých osách závisí na orientaci akcelerometru vůči zemi. Pokud se bude nacházet vodorovně, na ose Z naměříme přibližně 1g, když ho obrátíme vzhůru nohama tak -1g. Na osách X a Y bude zrychlení nulové. Pokud akcelerometr překlopíme na bok, na ose Z bude zrychlení nulové a na ose X 1g nebo -1g, podle toho, zda bude na levém nebo pravém boku. Analogicky k tomu, převrácením k sobě nebo od sebe do polohy kolmo k zemi dosáhneme zrychlení 1g nebo -1g na ose Y.

Osy akcelerometru

A teď přejdeme k praxi. Pro pohodlnější manipulaci jsem modul akcelerometru umístil do malé krabičky, doplnil dvěma tlačítky a propojil s Arduinem dlouhým plochým kabelem. Okamžité zobrazení hodnot zajistí LCD displej. Vytvořil jsem také schéma zapojení a na pokusy s určováním náklonu jsem postavil z Lega testovací stojan se servem, které akcelerometrem otáčí v rozsahu necelých 180°. Dopředu jsem umístil úhloměr, na kterém lze orientačně odečíst aktuální úhel natočení.

Na testovacím stojanu jsem provedl jednoduchý experiment, jehož cílem bylo zaznamenat průběh výstupních hodnot v závislosti na náklonu akcelerometru. Naprogramoval jsem Arduino tak, aby pomalu otáčelo servem, a tím i akcelerometrem v rozsahu -90° až +90° a odesílalo do PC naměřené hodnoty všech tří os. Skeč v programovacím jazyce Processing pak z přijatých dat vytváří graf, jednotlivé osy jsou v něm barevně odlišeny - červená X, zelená Y, modrá Z. Z grafu můžeme jasně vyčíst sinusový průběh hodnot. Měření a záznam se provádí opakovaně, proto se křivky na monitoru periodicky opakují. Popisky v angličtině jsem zvolil proto, že video s experimentem jsem umístil na youtube, tak aby dávalo alespoň trošku smysl i zahraničním návštěvníkům.

graf výstupních hodnot akcelerometru

Nabízím ke stažení skeč pro Arduino i pro PC, jsou ale naprogramovány na míru mému notebooku. Takže pro další použití bude třeba minimálně změnit COM port, na kterém je Arduino připojeno a problém by mohl nastat i s rozlišením obrazovky, protože je napevno nastavené na 1280x800. Na monitoru s větším rozlišením bude vše ok, ale pro menší monitor si musí každý můj skeč přizpůsobit. A nyní slíbené video s průběhem experimentu:

Nyní potřebujeme z hodnot, které nám Arduino naměřilo a odeslalo do PC zjistit, o jaký úhel φ je tedy akcelerometr vůči zemi nakloněn. Pro jeho výpočet platí vztah, který vidíte pod tímto odstavcem. Musíme se ale smířit s tím, že výsledky budou vykazovat velkou chybu, pokud se hodnoty náklonu přiblíží 90°, což je způsobeno průběhem funkce sinus. Navíc například u mého akcelerometru byl pro osu Y rozdíl hodnot 0g a 1g roven 175, kdežto rozdíl 0g a -1g jen 155. Tento fakt přesnost výpočtu snižuje opravdu výrazně, proto je lepší polohy pro kladné a záporné zrychlení počítat zvlášť.

Předchozích znalostí jsem využil v projektu, který má za úkol z přijatých dat vypočítat a zobrazit polohu akcelerometru. Využívá se zatím pouze dat z os X a Y, takže nelze například detekovat, kdy je akcelerometr vzhůru nohama. Ale i tak je výsledek docela zajímavý. Jako malý bonus lze stisknutím tlačítka změnit barvu plošiny.

Opět si můžete stáhnout skeč pro Arduino i pro PC. Doufám, že tento článek případného čtenáře alespoň trochu zaujme a třeba i vzbudí zájem o experimenty s akcelerometrem. Jedná se rozhodně o užitečný senzor, se kterým lze vymyslet spoustu zajímavých aplikací.

- Stránka vytvořena 10. února 2011 -