Pojďme programovat elektroniku | Arduino | Mobility

Pojďme programovat elektroniku: Jak vlastně funguje akcelerometr a gyroskop nejen ve vašem telefonu

  • Každý současný vybavený mobil má akcelerometr a gyroskop
  • Jenže co každé z těchto čidel vlastně dělá a jak vypadá?
  • Dnes si to vysvětlíme a do hry zapojíme i Airbus A380 a Arduino
Kapitoly článku

Když před dvěma lety poblouznila část geekosféry mobilní hra Pokémon Go, měl jsem smůlu, mému tehdejšímu telefonu totiž chyběl trojosý gyroskop – nezbytná součástka k tomu, abych si mohl zobrazit okolní pokémony v režimu rozšířené reality.

Takže zatímco ostatní kolemjdoucí ve městě jen míjeli kašnu jako každou jinou, hráč s pořádnou výbavou na ni namířil telefon a na displeji uviděl infantilní žlutozelenou obludu.

V dnešním pokračování našeho seriálu o programování elektroniky si ukážeme, jak tato základní čidla fungují, protože dodnes není mnohým jasné, co vlastně gyroskop dělá, v čem se liší od akcelerometru a co je to IMU (Inertial Measurement Unit), která data ze všech podobných senzorů skládá dohromady a je nedílnou součástí každého lepšího dronu a mnoha telefonů.

Akcelerometr měří zrychlení

Ale pěkně popořadě. Nejlevnějším mobilním telefonům sice ještě nedávno chyběl gyroskop, měly ale akcelerometr – maličké pohybové čidlo, které začali výrobci do chytrých telefonů montovat mezi prvními.

Akcelerometr už podle svého názvu měří pohybovou akceleraci – zrychlení (m/s2) a to ideálně ve všech třech osách trojrozměrného světa. Pak mluvíme o tzv. trojosém akcelerometru. Pokud bude akcelerometr namířený osou X vpřed, platí:

  • X – měří zrychlení pohybu dopředu a dozadu
  • Y – měří zrychlení pohybu doleva a doprava
  • Z – měří zrychlení pohybu nahoru a dolů

Takže dejme tomu, že teď napíšu nějakou šýlenou hrubku a vy mi za ni budete chtít dát facku. Když bych vám na ruku namontoval drobný akcelerometr směřující vpřed a vy byste se pořádně rozmáchli a švihli pravačkou doleva směrem k mé tváři, akcelerometr zaznamená ohromné zrychlení v ose Y, které po styku pravačky s Čížkem rychle opadne, neboť energie pohybu se předá lebce, která mi vytrhne tři zuby.

Jak funguje miniaturní elektromechanický akcelerometr třeba ve vašem mobilu

Moderní křemíkové akcelerometry, gyroskopy a další pohybové senzory jsou miniaturní a jejich čipy mají velikost nejvýše několika milimetrů. Jedná se o tzv. MEMS, MikroElektroMechanické Systémy, které změnu fyzikálních veličin zjišťují pomocí elektromagnetických charakteristik maličkých oscilujících a pohybujících se součástek velikosti třeba i tisícin milimetru.

Na schématu níže se tak můžete podívat na jeden z primitivních způsobů, jak může fungovat v podstatě mikroskopický MEMS akcelerometr.

aa35dae1-4770-40b0-8840-e50a0f2f32d40d6701c5-5cb4-433c-9f3a-5876c99094df27ff994a-9924-4c05-b28e-910c0c39919c
Princip mikroskopického MEMS akcelerometru, pohled na jeho skutečnou konstrukci pod elektronovým mikroskopem a konečně modul levného trojosého akcelerometru ADXL335, který zrychlení na osách X, Y a Z vyjadřuje změnou hodnoty napětí na analogových signálních vodičích.

Pokud bychom si chtěli takový akcelerometr postavit doma v dílně, bude nám stačit třeba primitivní pružina s malým závažím na konci. Čím větší silou pak s pružinou švihnete, tím větší bude zrychlení, pružina se více natáhne a ryska na závaží ukáže aktuální hodnotu. Jakmile zrychlení poklesne, pružina vrátí závaží na výchozí pozici.

Analogový akcelerometr ADXL335 a Arduino

Jelikož žádnou dílnu po ruce nemám, natož pružinu a závaží, postavíme si experimentální akcelerometr pomocí laciného modulu GY-61, jehož kusová cena se na eBayi pohybuje okolo 60 korun. Srdcem modulu je trojosý akcelerometr ADXL335 s analogovým rozhraním.

e71d50a0-c363-4ea9-881e-fd2493d33308bd151442-dfb3-46b1-aa97-066e8f3f0d9a90336037-7c4b-4405-9c1e-21c7ba301513411ce53b-b0ef-44e9-96d6-1cc1b22b9ebe
Trojosý akcelerometr ADXL335 připojený pomocí nepájivého pole na analogové piny levného klonu prototypovací destičky Pro Micro. Všimněte si, že na modulu akcelerometru jsou pro snadnou orientaci nakreslené směry os X, Y a Z.

Čidlo tedy stačí snadno připojit k libovolné 3,3V/5V prototypovací destičce, která má alespoň tři analogové vstupy. Akcelerometr na nich poté bude nastavovat napětí, které odpovídá aktuálnímu zrychlení na dané ose.

Čip prototypovací desky toto napětí pomocí A/D převodníku interpretuje jako celé číslo, a když budeme tato tři čísla stále za sebou vypisovat do sériové linky, pomocí softwarového plotru, který je součástí vývojového prostředí Arduina, můžeme živě sledovat graf a reakci akcelerometru na nejrůznější pohyby sem a tam.

Primitivní program pro Arduino, který bude do sériové linky vypisovat surová data z čidla ADXL335, může vypadat třeba takto:

// Funkce setup se spusti jen jednou na zacatku programu
void setup() {
  // Nastartuji seriovou linku rychlosti 115 200 b/s
  Serial.begin(115200);
}

// Smycka loop se opakuje stale dokola
void loop() { 
  // Prectu hodnoty z A/D prevodniku na pinech A1, A2 a A3,
  // ke kterym jsem pripojil signalni vodice akcelerometru
  uint16_t x = analogRead(A1);
  uint16_t y = analogRead(A2);
  uint16_t z = analogRead(A3);

  // Vypisu na radek hodnoty os X, Y a Z oddelene mezerou,
  // aby udajum rozumel softwarovy plotr v pocitaci
  Serial.print(x); Serial.print(" ");
  Serial.print(y); Serial.print(" ");
  Serial.println(z);

}

Akcelerometr může měřit otřesy, tedy i kroky

K čemu je vlastně takové měření dobré? Akcelerometr může být součástí třeba bezdrátových herních ovladačů, které změří reálnou sílu švihu a vy jednou ránou do prostoru složíte virtuálního spoluhráče na obrazovce.

Možnosti praktického využití moderních a miniaturních akcelerometrů jsou ale samozřejmě mnohem širší, mohou být totiž extrémně rychlé a citlivé. Když položíte telefon na stůl, do kterého opodál zlehka klepnete, deskou se začnou šířit vibrace, které ji rozkmitají především v ose Z (nahoru a dolů) podobně jako seismické vlny při zemětřesení, a akcelerometr je zachytí.

14ceefb3-1482-46a1-a642-530371d5706f32db7fab-56f3-4621-998b-b6fca49947b1
Plotr v Arduinu a hodnoty z os X (modrá), Y (červená) a Z (zelená) akcelerometru ADXL335 po úderu propisky do stolu. Proč vertikální osa Z v klidovém stavu i při úderu do stolu ukazuje výrazně vyšší hodnoty než osy X a Y? O tom za chvíli!

Akcelerometr skvěle měří jakékoliv otřesy, ze kterých dokáže software rozluštit některé periodické vzory – třeba otřesy, které s relativně konstantní frekvencí vytváří vaše nebohá tělesná schránka při chůzi.

Jinými slovy, z otřesů lze odhadnout charakter vašeho pohybu i kroky, a proto je akcelerometr nedílnou součástí prakticky všech současných sportovních náramků a dalších doplňků.

ADXL355 a periodický vertikální pohyb, který se nejvíce projeví na ose Z:

Akcelerometrem lze měřit i úhel náklonu, proto si jej občas pleteme s gyroskopem

Takže si to shrňme. Akcelerometr umí počítat facky, kroky, otřesy, prostě pohyb ve třech osách s určitým zrychlením. Jenže pozor, akcelerometr dokáže do jisté míry měřit i úhly naklonění. Právě proto si jeho funkci občas lidé pletou s gyroskopem, který naopak nedělá nic jiného.

Když nakloníte mobil o 90 stupňů, obraz se otočí také. Banalita, kterou umí chytré telefony už dlouhé roky. A přesně toto dokáže změřit i akcelerometr. Vedle zrychlení, které vytvoříte nějakým náhlým pohybem, totiž senzor pochopitelně ovlivňuje i zemská gravitace. Jednoduše řečeno, v klidovém stavu se akcelerometr aktuální vertikální osy (nahoru/dolů) vždy vychýlí.

a6bd5585-48c2-4899-b0e3-54a4b9528fb0
Akcelerometr v klidu leží na stole, na vertikální ose Z (zelená) přesto měří mnohem vyšší zrychlení než v případě horizontálních os X (modrá) a Y (červená). Jak je to možné? Čidlo osy Z vychyluje gravitace!

Podle toho, která z os je takto i v naprostém klidu právě vychýlená, lze snadno zjistit orientaci telefonu. Tedy jestli leží na zádech, displejem dolů, jestli je postavený na výšku, na šířku… Ale stejně tak lze zjistit i přesný úhel, když totiž budete ležící telefon pomalu naklánět k sobě, gravitační vychýlení jednotlivých os se bude analogicky měnit a vy podle známého maxima a minima vychýlení tuto hodnotu primitivně přepočítáte na úhel -90° až 90°.

Jednoduchý kód pro Arduino, který podle předem známého minima a maxima přepočítá analogové hodnoty na úhly v rozsahu -90° až 90°:

int8_t x_uhel = map(constrain(analogRead(A1), 284, 426), 284, 426, -90, 90);
int8_t y_uhel = map(constrain(analogRead(A2), 284, 426), 284, 426, -90, 90);

Stručně si ten kód okomentujeme. Než jsem jej začal psát, zjistil jsem maximální a minimální hodnoty, které získávám z čidla. Provedl jsem tedy jednoduchou kalibraci, kdy jsem s čidlem pomalu otáčel sem a tam a sledoval hodnoty z A/D převodníku. Na 5V prototypovací desce Pro Micro s čipem ATmega32u4 je 10bitový převodník, takže napětí v rozsahu 0 V až 5 V vyjádří celým číslem z rozsahu 0 až 1 023.

ad577dbf-7a71-428d-a2e1-8daf80180756
Princip analog/digital převodníku. Spojité a nekonečně dělitelné napětí převede na celé číslo, digitální informaci. Převodník s desetibitovým rozlišením vyjádří napětí číslem 0 až 1 023. K dispozici má tedy 1 024 hodnot (zubů). Čím menší rozlišení převodníku, tím méně přesná interpretace původního analogového signálu.

A/D převodník vyjádřil nejnižší hodnotu z akcelerometru číslem 284 a nejvyšší pak číslem 426. V kódu výše tedy vždy přečtu hodnotu z každé os, ořežu ji pro jistotu pomocí funkce constrain na tento rozsah 284 až 426, kdyby se přeci jen objevila nějaká anomálie, a ten pomocí další skvělé vestavěné funkce Arduina jménem map přepočítám na nový rozsah -90° až 90°.

Akcelerometr leží ve vodorovné poloze:

Nové hodnoty opět začnu vypisovat do sériové linky (a plotru), přičemž tentokrát už jen osy X a Y:

c4e985fd-93ee-4583-9773-1c0aafb9bd3cca2b172e-0a2f-4599-b959-ac3385a4f7a3
Přepočítal jsem hodnoty z akcelerometru na úhly a nechal vypisovat do plotru jen osy X (modře) a Y (červeně). Akcelerometr nyní leží zhruba ve vodorovné poloze na stole, X a Y tedy ukazují úhel blízký 0°. Patrný šum bych mohl vyhladit třeba pomocí knihovny AnalogSmooth.

Naklonil jsem akcelerometr o 90° doprava:

Když nyní nepájivé pole s připojeným akcelerometrem, začnu naklánět doprava podle osy X, z osy Y se pomalu začne stávat vertikální osa (kterou byla v klidovém stavu osa Z), a začne na ni tedy více působit gravitace, akcelerometr změří vyšší zrychlení a náš program jej přeloží na úhel vzhledem k základní rovině.

ccb2934d-5b6f-4a1d-85a2-aae06d46e66ed76bb6a1-c98e-43ed-a455-304f690dae1a
Naklonil jsem akcelerometr o 90° doprava, na osu Y (červeně) začala nejsilněji působit gravitace, kterou náš program správně vyjádřil jako náklon pod úhlem 90°

Naklonil jsem akcelerometr o 90° dolů:

Do třetice, abychom si demonstrovali i naklonění v druhé ose, pootočím nepájivé pole dolů, aby směřovalo osou X zcela k zemi. Nyní tedy bude naopak gravitace nejsilněji působit na akcelerometr této osy, což se v plotru projeví úhlem -90°.

dfd7b986-1087-4893-9eef-f52b28ec5cd9ee697177-2acf-4eb7-a50e-5c74f0b97165
A ještě ukázka, že měření naklonění funguje i pro akcelerometr osy X (modře), která v plotru nyní ukazuje úhel -90°, zatímco osa Y (červeně) je rovna 0°

Ovládám Airbus A380 akcelerometrem v ruce

Pokud se nyní vrátím k úvodu, nabízí se tedy otázka, proč Pokémon Go a drtivá většina moderních her a aplikací pro přesnou virtuální a rozšířenou realitu vyžadují gyroskop, tedy trojrozměrný úhloměr, když tyto úhly mohu změřit díky gravitaci i akcelerometrem?

Protože to bude fungovat jen v relativním klidu a zároveň nám chybí data k určení horizontálního otočení. K tomu bychom potřebovali třeba kompas.

71e1e353-5889-4856-860a-5199b13ada29e95c2c4b-37d4-4557-9b93-83f1e0b267fa9e448673-fc30-4824-825d-8e26dd448627
7822d22a-5e7d-4d1c-b1d2-6b1b3039bbdae1be9901-66ba-436a-a628-8f4fe8ae4d44
Pomocí prostředí Processing a jeho 3D knihovny jsem si napsal jednoduché simulační prostředí s modelem Airbusu A380. Namísto plotru Arduina nyní tedy mohu pro lepší představu nakláněním akcelerometru naklánět i obří letoun na obloze a akcelerometrem tedy částečně napodobovat mnohem vhodnější gyroskop.

Když bychom chtěli měřit úhly náklonu a natočení mobilu třeba při chůzi, na akcelerometr v ten okamžik už vedle gravitace působí i samotný pohyb a výsledkem bude ohromný šum, který nedokáže takto přesně rozlišit ani Dr. Sheldon Cooper.

Bude to sice stačit na odhad základní orientace (naležato × na výšku), ale ne k pokročilejším AR hrám, které potřebují přesnější a stabilnější údaje o aktuálním natočení telefonu ve všech osách X, Y a Z.

Podívejte se na naklánějící se letoun na videu:

Zde už tedy na scénu konečně nastupuje trojosý gyroskop, kterému se budeme věnovat v následující kapitole.

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,