Krokomer s akcelerometrom MMA8491Q: Rozdiel medzi revíziami
Zo stránky SensorWiki
Riadok 261: | Riadok 261: | ||
Viac informácii a príkladov s ''Wire'' knižnicou na [https://www.arduino.cc/en/Reference/Wire Wire Library] | Viac informácii a príkladov s ''Wire'' knižnicou na [https://www.arduino.cc/en/Reference/Wire Wire Library] | ||
=== C# === | |||
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. | 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. |
Verzia z 12:02, 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
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:
- Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
- Product page
- Datasheet
- Data Manipulation and the Basic Settings of Xtrinsic MMA8491Q Accelerometer
- Full-Featured Pedometer Design Realized with 3-Axis Digital Accelerometer
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
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
- 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.
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.
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
C#
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.
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo nahrať už aspoň 10 študentov.
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
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.