Operácie

Krokomer s akcelerometrom MMA8491Q: Rozdiel medzi revíziami

Z SensorWiki

(Princíp funkcionality krokomeru)
(Princíp funkcionality krokomeru)
Riadok 266: Riadok 266:
 
Na nasledovnom obrázku je zobrazená závislosť medzi jednotlivými fázami ľudského kroku a zmenami vertikálneho zrýchlenia a zrýchlenia v smere pohybu.   
 
Na nasledovnom obrázku je zobrazená závislosť medzi jednotlivými fázami ľudského kroku a zmenami vertikálneho zrýchlenia a zrýchlenia v smere pohybu.   
  
[[Súbor:Krok.png]]
+
[[Súbor:Krok.png|center]]
  
 
Tieto zmeny v zrýchlení môžeme vyniesť do grafu.Pre bežiacu osobu bude priebeh jednotlivých zložiek zrýchlenia (x, y a z) vyzerať nasledovne
 
Tieto zmeny v zrýchlení môžeme vyniesť do grafu.Pre bežiacu osobu bude priebeh jednotlivých zložiek zrýchlenia (x, y a z) vyzerať nasledovne
  
[[Súbor:behAkc.png]]
+
[[Súbor:behAkc.png|center]]
  
 
Vidíme, že aspoň v jednej osi má zrýchlenie relatívne veľké a periodické výchylky. Výchylky však nie sú rovnaké a s časom menia, preto je potrebné dynamicky detegovať hraničné hodnoty (max, min) a upravovať rozhodovaciu úroveň algoritmu. Okrem toho je potrebná filtrácia, pretože pri pohybe človeka (tým pádom aj senzora) budú mať príjmané dáta z akcelerometra vysokú šumovú úroveň. Obrázok nižšie znázorňuje filtrované dáta z najaktívnejšej osi akcelerometra pre kráčajúcu osobu.
 
Vidíme, že aspoň v jednej osi má zrýchlenie relatívne veľké a periodické výchylky. Výchylky však nie sú rovnaké a s časom menia, preto je potrebné dynamicky detegovať hraničné hodnoty (max, min) a upravovať rozhodovaciu úroveň algoritmu. Okrem toho je potrebná filtrácia, pretože pri pohybe človeka (tým pádom aj senzora) budú mať príjmané dáta z akcelerometra vysokú šumovú úroveň. Obrázok nižšie znázorňuje filtrované dáta z najaktívnejšej osi akcelerometra pre kráčajúcu osobu.
  
[[Súbor:WalkAkc.png]]
+
[[Súbor:WalkAkc.png|center]]
 
 
Pre zabezpečenie dynamických zmien porovnávacej úrovne musí systém periodicky aktualizovať maximálne a minimálne hodnoty zrýchlenia. Dynamická rozhodovacia úroveň sa potom vypočíta ako (Max + Min)/2. Pre nasledujúcu sadu vzoriek (jednu periódu) bude táto hodnota použitá na určenie či došlo ku kroku. Na vyhodnotenie prítomnosti kroku sa používa lineárny posuvný register s dvomi registrami ''sample_old'' a ''sample_new''. Pri príchode nových dát je hodnota v ''sample_new'' bezpodmienečne posunutá do registra ''sample_old''. Zápis nových dát do registra ''sample_new'' však závisí nastavenej rozlišovacej schopnosti ''precision''. Ak je zmena v zrýchlení (sample_new - nové dáta) väčšia ako ''precision'' potom sú nové dáta zapísané do registra ''sample_new''. V opačnom prípade ostáva register ''sample_new'' bez zmeny. '''Uskutočnenie kroku je potom definované negatívnym sklonom priebehu zrýchlenia (''sample_new'' < ''sample_old'') keď hodnota zrýchlenia klesne pod dynamickú porovnávaciu úroveň.''' 
 
  
 +
Pre zabezpečenie dynamických zmien porovnávacej úrovne musí systém periodicky aktualizovať maximálne a minimálne hodnoty zrýchlenia. Dynamická rozhodovacia úroveň sa potom vypočíta ako (Max + Min)/2. Pre nasledujúcu sadu vzoriek (jednu periódu) bude táto hodnota použitá na určenie či došlo ku kroku. Na vyhodnotenie prítomnosti kroku sa používa lineárny posuvný register s dvomi registrami ''sample_old'' a ''sample_new''. Pri príchode nových dát je hodnota v ''sample_new'' bezpodmienečne posunutá do registra ''sample_old''. Zápis nových dát do registra ''sample_new'' však závisí nastavenej rozlišovacej schopnosti ''precision''. Ak je zmena v zrýchlení (sample_new - nové dáta) väčšia ako ''precision'' potom sú nové dáta zapísané do registra ''sample_new''. V opačnom prípade ostáva register ''sample_new'' bez zmeny. '''Uskutočnenie kroku je potom definované negatívnym sklonom priebehu zrýchlenia (''sample_new'' < ''sample_old'') keď hodnota zrýchlenia klesne pod dynamickú porovnávaciu úroveň.'''
  
 
=== Vizualizácia riešenia ===
 
=== Vizualizácia riešenia ===

Verzia zo dňa a času 12:13, 20. máj 2016

Autori: Michal Hlavatý, Michal Stromko
Študijný odbor: Aplikovaná mechatronika a elektromobilita 1. Ing. (2016)


Zadanie

Pomocou akcelerometra, ktorý sa nachádza na doske Xtrinsic Sensors board vytvorte aplikáciu/program, ktorý bude realizovať funkciu jednoduchého krokomeru.

Xtrinsic Sensors board

XtrinsicBoard.jpg

Zoznam senzorov:

  • MPL3115A2: High-precision Pressure Sensor (20 – 110 kPa)
  • MAG3110: Digital 3-axis Magnetometer
  • MMA8491Q 3-axis Low-g Accelerometer

Body zadania:

  • K použitému senzoru nájdite datasheet a preštudujte jeho štruktúru, spôsob pripojenia, komunikácie, a čítania dát.
  • Na základe predošlých vedomostí navrhnite spôsob pripojenia k vhodnej riadiacej jednotke
  • Napíšte program v prostredí Arduino zabezpečujúci:
    • Komunikáciu so snímačom
    • Načítanie a spracovanie potrebných dát
    • Realizácia funkcionality krokomeru
  • V ľubovoľnom programovacom jazyku/prostredí vytvorte aplikáciu na vizualizáciu a demonštráciu predloženého riešenia
  • Dokumentáciu odovzdajte prostredníctvom tejto wiki stránky.


Literatúra:

Analýza

Použitý senzor

Na realizáciu funkcie krokometra využijeme už vyššie spomínaný senzor Xtrinsic MMA8491Q 3-Axis Multifunction Digital Accelerometer. Je to nízko napäťový, 3-osí "low-g" akcelerometer uložený v 3 mm x 3 mm QFN púzdre. Zariadenie poskytuje dve konfigurácie. Prvou z nich je 45° senzor naklonenia a druhou akcelerometer s digitálnym výstupom cez I2C zbernicu. Pre nás je zaujímavá funkcia akcelerometra kedy senzor poskytuje 14-bit ± 8g dáta, ktoré môžu byť prečítané s 1 mg/LSB rozlíšením.

Vlastnosti

  • Extrémne nízka spotreba 400 nA na Hz
  • Ultra rýchly čas prenosu, ~700 μs
  • Napájací rozsah od 1,95 do 3,6 V
  • 3 mm x 3 mm, 0,65 mm stúpanie s vizuálnou inšpekciou spájkovacích spojov
  • ± 8g rozsah
  • 14-bit digitálny výstup, 1 mg/LSB rozlíšenie
  • rýchlosť prenosu výstupných dát (ODR), v závislosti na implementácii od 1 Hz do 800 Hz
  • I2C digitálne rozhranie
  • výstup v troch osiach a 45° natočenie


Popis vývodov

Pins.png

C Pin Funkcia
1 Byp Pripojenie výstupného kondenzátora interného regulátora
2 V_DD Napájacie napätie
3 SDA I2C dátová linka
4 EN Povoľovací pin
5 SCL I2C hodinová linka
6 Gnd Zem
7 Gnd Zem
8 Zout Výstup detekcie naklonenia v osi Z
9 Yout Výstup detekcie naklonenia v osi Y
10 Xout Výstup detekcie naklonenia v osi X
11 NC Nepripojené
12 NC Nepripojené

Popis registrov

Akcelerometer obsahuje 6 dátových a jeden stavový register. Tieto registre budeme používať na čítanie dát o zrýchlení v jednotlivých osiach.

Mapa registrov

Registre.png
  • Obsah registrov je zachovaný ak je EN pin po vzorkovaní nastavený na vysokú úroveň
  • Obsah registrov je vynulovaný keď je EN pin nastavený na nízku úroveň.

Stavový register

Register 0x00 obsahuje real-time stavové informácie o vzorkách X, Y a Z dát. Bity (ZYXDR, ZDR, YDR, XDR) sa nastavia keď sú nové nasnímané dáta pripravené na čítanie.

Pole Popis
ZYXDR ZYXDR signalizuje, že sú pripravené nové vzorky vo všetkých kanáloch. ZYXDR je vymazaný keď sú prečítané registre horných bitov vo všetkých kanáloch (OUT_X_MSB, OUT_Y_MSB, OUT_Z_MSB).

0: Nie je pripravený nový set dát 1: Nový set dát je pripravený

ZDR ZDR je nastavený kedykoľvek je generovaná nová vzorka pre os Z. ZDR je vymazaný keď je prečítaný register OUT_Z_MSB.

0: Nie sú pripravené nové dáta v osi Z 1: Nové dáta v osi Z sú pripravené

YDR YDR je nastavený kedykoľvek je generovaná nová vzorka pre os Y. YDR je vymazaný keď je prečítaný register OUT_Y_MSB.

0: Nie sú pripravené nové dáta v osi Y 1: Nové dáta v osi Y sú pripravené

XDR XDR je nastavený kedykoľvek je generovaná nová vzorka pre os X. XDR je vymazaný keď je prečítaný register OUT_X_MSB.

0: Nie sú pripravené nové dáta v osi X 1: Nové dáta v osi X sú pripravené

Dátové registre

Tieto registre obsahujú 14-bit výstupné dáta akcelerometra pre osi X, Y a Z vyjadrené v dvojkovom doplnku.

  • OUT_X_MSB, OUT_X_LSB, OUT_Y_MSB, OUT_Y_LSB, OUT_Z_MSB, a OUT_Z_LSB sú uložené na adresnom rozsahu 0x01 – 0x06 pre automatickú inkrementáciu.
  • LSB registre môžu byť prečítané len okamžite po prečítaní z korešpondujúceho MSB registra. "Random access" čítanie z LSB registrov nie je možné.
  • Čítanie MSB a LSB registrov v sekvencii zabezpečuje, že obidva bajty patria rovnakej vzorke, dokonca aj vtedy ak medzi čítaním z MSB a LSB prídu nové dáta.
  • Dátové registre by mali byť čítané len po tom ako stavový register potvrdil prítomnosť nových dát vo všetkých osiach.

I2C komunikácia

Hodnoty zrýchlenia v jednotlivých osiach sú dostupné cez I2C rozhranie čím sa senzor stáva vhodným pre priame pripojenie k mikropočítaču. Senzor poskytuje signály prerušenia, ktoré indikujú prítomnosť hodnôt natočenia na X, Y a Z osi. Hodnoty zrýchlenia je možné čítať cez I2C v rovnakom čase keď je dostupný prerušovací signál. I2C rozhranie sa zapína nastavením EN pinu na vysokú úroveň. Ak je EN alebo V_DD nastavené na nízkej úrovni potom dáta čítané z akcelerometra sú nesprávne. Odpojenie napájania z V_DD pinu nemá vplyv na I2C zbernicu.

Pri I2C komunikácii sa používajú dva signály "Serial Clock Line (SCL)" a "Serial Data Line (SDA)". SDA je obojsmerná linka používaná na posielanie a príjem dát z/na rozhranie. Pri prenose sa počíta z externými "pull-up" registrami na SDA a SCL linke. Keď je linka voľná obidva signály sú na vysokej úrovni. Slave adresa akcelerometra je 0x55. Viac o I2C prenose je uvedené v dokumentácii.

Postup prenosu jedného bajtu

  • Master vyšle štartovaciu podmienku na adresu MMA8491Q s RW bitom nastaveným na nulu pre zápis, a MMA8491Q odošle potvrdenie.
  • Potom Master vyšle adresu registra, z ktorého chce čítať a MMA8491Q pošle potvrdenie.
  • Master vyšle opakovanú štartovaciu podmienku a potom adresuje MMA8491Q s RW bitom nastaveným na jednotku pre čítanie z predtým vybraného registra.
  • MMA8491Q potom potvrdí a pošle dáta z požadovaného registra.
  • Master nepotvrdzuje príjem, ale vyšle stop podmienku a ukončí prenos dát.

Módy operácie senzora

Senzor pracuje v štyroch základných módoch.

Mody.png

Aktívny mód

Subsystém akcelerometra je zapnutý nábežnou hranou na EN pine a získa jednu vzorku pre každú z troch osí. EN pin by nemal byť nastavený skôr ako V_DD dosiahne 1,95 V. Vzorky sú získané, konvertované a kompenzované na "zero-g" ofset a chyby zosilnenia a potom porovnané z internou hranicou 0,688g a následne uložené. Prečítaním registra 0x00 v tomto móde zistíme či sú dáta pripravené na čítanie.

Standby mód

Zariadenie prejde automaticky do STANDBY módu po nameraní dát v ACTIVE móde. Výstupný systém poskytuje validné dáta, ktoré môžu byť prečítané cez I2C zbernicu. Tieto hodnoty sú podržané kým sa nezmení mód sezora. Pre zníženie spotreby je dobré vynulovať EN pin okamžite po prečítaní dát. Nové dáta je možné získať až keď privedieme senzor naspäť do aktívneho módu nastavením EN ja log. 1.

Riadiaca jednotka

Keďže senzor MMA8491Q vysiela dáta o zrýchlení cez zbernicu I2C ako riadiacu jednotku musíme zvoliť mikropočítač, ktorý podporuje takúto komunikáciu. Arduino Uno poskytuje jednoduchý spôsob pripojenia pre komunikáciu cez I2C zbernicu s Xtrinsic senzorovou doskou a taktiež jej poskytuje potrebné napájanie (3.3 V). Napájanie a komunikácia riadiacej jednotky je zabezpečená z PC cez USB rozhranie.

Uno.png

Viac na Arduino Uno

Programové prostredie

Program pre činnosť mikropočítača budeme vyvíjať vo voľne dostupnom softvérovom prostredí (IDE) vytvorenom pre tento účel spoločnosťou Arduino. ARDUINO Software 1.6.9

Tento softvér priamo obsahuje knižnicu Wire.h pre komunikáciu cez I2C zbernicu pomocou SDA a SCL vývodov. Na doske pre Arduino Uno sú vývody SDA a SCL umiestnené blízko AREF pinu ako môžeme vidieť na obrázku vyššie. Knižnica používa 7-bit adresy zariadení pričom adresy 0-7 sú rezervované. Knižnica poskytuje nasledovné funkcie

Funkcia Popis Parametre Návratová hodnota
begin() Inicializuje Wire knižnicu a pripojí I2C zbernicu ako Master alebo Slave. Táto funkcia by mala byť volaná len raz. address(optional): 7-bit adresa slave zariadenia. Ak nie je zadaná Arduino sa pripojí na zbernicu ako master. Žiadne
requestFrom() Funkcia používaná master zariadením na vyžiadanie bajtov od slave zariadenia. Bajty môžu byť potom získané pomocou funkcii available() a read(). address: 7-bit adresa zariadenia, t ktorého požadujeme bajty quantity: počet požadovaných bajtov stop:boolean(Default True): Ak je True master vyšle po žiadosti stop správu čím uvoľní zbernicu. Ak je False spojenie zostane aktívne. byte: počet bajtov vrátených zo slave zariadenia
beginTransmission() Zaháji I2C prenos so slave zariadením s danou adresou. Následne je možné pripraviť dáta na prenos pomocou write() funkcie a odoslať ich volaním endTransmission() funkcie. address: 7-bit adresa cieľového zariadenia Žiadne
endTransmission() Ukončí prenos so slave zariadením a odošle dáta, ktoré boli pripravené pomocou write() funkcie. stop:boolean(Default True) Ak je True odošle sa stop správa čím sa po prenose uvoľní zbernica. Ak je False odošle sa restart správa, ktorá udrží spojenie aktívne. byte: indikácia stavu prenosu 0: úspech. 2: dáta dlhšie ako vysielací buffer. 3: prijatý NACK pri prenose adresy. 4: iná chyba.
write() Odosiela dáta zo slave zariadenia ako odpoveď na žiadosť od mater zariadenia, alebo pripraví dáta na prenos z mater zariadenia n slave zariadenie(pred endTransmission() funkciou). value: dáta, ktoré sa majú odoslať (jeden bajt). string: reťazec dát, ktorý sa má odoslať (alternatíva k value). data: pole dát, ktoré sa má odoslať ako bajty(alternatíva k value/string). length: počet bajtov, ktoré sa majú preniesť. byte: počet prenesených bajtov
available() Vráti počet bajtov pripravených na čítanie pomocou read() funkcie. Funkcia by mala byť volaná na master zariadení po volaní requestFrom() alebo na slave zariadení vnútri onReceive() funkcie. Žiadne Počet bajtov pripravených na prečítanie
read() Prečíta bajt, ktorý bol poslaný zo slave zariadenia na master zariadenie po volaní requestFrom() funkcie alebo bol prenesený z master zariadenia na slave zariadenie. Žiadne Prijatý bajt dát
onReceive() Registruje funkciu, ktorá sa má zavolať keď slave zariadenie príjme prenos dát z mater zariadenia. handler: funkcia, ktorá sa má zavolať keď slave zariadenie príjme dáta. Funkcia by mala byť typu void a ako parameter používať počet prijatých bajtov. Žiadne
onRequest() Registruje funkciu, ktorá sa má zavolať keď master zariadenie žiada dáta z tohto slave zariadenia. handler: funkcia, ktorá sa má zavolať. Mala by byť typu void a bez parametrov. Žiadne

Viac informácii a príkladov s Wire knižnicou na Wire Library

Princíp funkcionality krokomeru

Pri návrhu funkcionality krokomeru budeme vychádzať z článku Full-Featured Pedometer Design Realized with 3-Axis Digital Accelerometer, ktorý publikoval Neil Zhao. Článok popisuje komplexný krokomer pracujúci v troch osiach, ktorý okrem počtu prejdených krokov poskytuje informácie o vzdialenosti, rýchlosti a spálených kalóriách. Pre naše účely budeme uvažovať len zjednodušený model krokomeru pracujúci v jednej osi, ktorej sa zrýchlenie mení najviac. Na nasledovnom obrázku je zobrazená závislosť medzi jednotlivými fázami ľudského kroku a zmenami vertikálneho zrýchlenia a zrýchlenia v smere pohybu.

Krok.png

Tieto zmeny v zrýchlení môžeme vyniesť do grafu.Pre bežiacu osobu bude priebeh jednotlivých zložiek zrýchlenia (x, y a z) vyzerať nasledovne

BehAkc.png

Vidíme, že aspoň v jednej osi má zrýchlenie relatívne veľké a periodické výchylky. Výchylky však nie sú rovnaké a s časom menia, preto je potrebné dynamicky detegovať hraničné hodnoty (max, min) a upravovať rozhodovaciu úroveň algoritmu. Okrem toho je potrebná filtrácia, pretože pri pohybe človeka (tým pádom aj senzora) budú mať príjmané dáta z akcelerometra vysokú šumovú úroveň. Obrázok nižšie znázorňuje filtrované dáta z najaktívnejšej osi akcelerometra pre kráčajúcu osobu.

WalkAkc.png

Pre zabezpečenie dynamických zmien porovnávacej úrovne musí systém periodicky aktualizovať maximálne a minimálne hodnoty zrýchlenia. Dynamická rozhodovacia úroveň sa potom vypočíta ako (Max + Min)/2. Pre nasledujúcu sadu vzoriek (jednu periódu) bude táto hodnota použitá na určenie či došlo ku kroku. Na vyhodnotenie prítomnosti kroku sa používa lineárny posuvný register s dvomi registrami sample_old a sample_new. Pri príchode nových dát je hodnota v sample_new bezpodmienečne posunutá do registra sample_old. Zápis nových dát do registra sample_new však závisí nastavenej rozlišovacej schopnosti precision. Ak je zmena v zrýchlení (sample_new - nové dáta) väčšia ako precision potom sú nové dáta zapísané do registra sample_new. V opačnom prípade ostáva register sample_new bez zmeny. Uskutočnenie kroku je potom definované negatívnym sklonom priebehu zrýchlenia (sample_new < sample_old) keď hodnota zrýchlenia klesne pod dynamickú porovnávaciu úroveň.

Vizualizácia riešenia

Dalej v tejto časti popíšeme programovacie prostredie C#. Rozhodli sme sa ho použiť pre jeho dostupnosť a jednoduchosť. Pri použití javy sa k COM portom pristupuje zložitejšie celkový návrh vizualizácie je zložitejší, kým v C# sa jedná vo veľkej časti o drag & drop metódu.

C# je orientovaný hlavne na objektovo orientované programovanie. Jeho syntax je veľmi podobná ostatným C jazykom (C,C++), ale aj Jave. Podobnosť je napríklad v tom že príkazy ukončujeme bodkočiarkou, pre porovnanie použijeme dve rovná sa za sebou, kým na priradenie použieme jediné a pod.

Na vytvorenie GUI (graphical user interface) sme vytvorili takzvanú Form aplikáciu. Windows form obsahuje komponenty ako dialógové okná, menu, tlačítka a rôzne iné, ktoré sú potrebné na vytvorenie štandartného užívateľského rozhrania. Po vytvorení takéhoto komponentu sa vytvorí trieda z .NET Framework class library. Nástrojom DESIGNER umožnuje prezerať si navrhnuté rozhranie, prispôsobovať veľkosti a celkový design aplikácie bez nutnosti použitia kódu (v Jave je treba zadávať presné súradnice a veľkosti pomocou zdrojového kódu). Stará sa o to IDE (Integrated development enviroment - integrované vývojové prostredie) ktoré požadovaný zdrojový kód vytvára samé a tak upravuje triedu daného objektu.

Jednoduchý návod na vytváranie Form aplikácí v C# nájdete tu: https://msdn.microsoft.com/en-us/library/360kwx3z(v=vs.90).aspx

V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje, ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:

  • popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
  • obrázok zapojenia vývodov použitej súčiastky
  • odkaz na katalógový list
  • priebehy dôležitých signálov
  • este jedna polozka

Popis riešenia

Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru (nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.

Schéma zapojenia snímača Zapojenie.png

Súbor:Example.jpg

Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo nahrať už aspoň 10 študentov.

MojObrazok.jpg

Algoritmus a program

Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili. Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu. Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.


Vizualizáciu sme sa rozhodli spraviť v prostredí C#. Naše GUI pozostáva z troch častí. Prvou sú nastavenia baudrateu a výber portov. Druhou časťou je indikátor počtu vykonaných krokov a treťou časťou je vizuálne zobrazenie topánky ktorá vykoná pohyb keď program zaregistruje krok.



Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:

/* A nezabudnite zdroják hojne komentovať  */

int main(void) {
    
    printf("Hello, World!\n");  
    return(0);  
}

Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!

Zdrojový kód: serial.h a main.c

program.c

Overenie

Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.