Operácie

MEMS 3D akcelerometer: Rozdiel medzi revíziami

Z SensorWiki

(Overenie)
 
(44 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených)
Riadok 22: Riadok 22:
  
  
'''MEMS Inertial Nucleo'''
 
  
    [[Image:300px-NucleoBoard.jpg|250px]]
+
[[Image:300px-NucleoBoard.jpg|250px]]
 +
 
 +
'''Obr. č. 1 MEMS Inertial Nucleo'''
 +
 
  
 
Zoznam senzorov, ktoré sa nachádzajú na doske:
 
Zoznam senzorov, ktoré sa nachádzajú na doske:
Riadok 31: Riadok 33:
 
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer
 
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer
 
* HTS221: capacitive digital relative humidity and temperature
 
* HTS221: capacitive digital relative humidity and temperature
                                                            [[Image:senzor.png|300px]]
+
 
 +
 
 +
[[Image:senzor.png|300px]]
 +
 
 +
'''Obr. č. 2 MEMS Inertial Nucleo - rozdelenie senzorov'''
  
  
Riadok 49: Riadok 55:
 
LSM6DS0 je integrovaný obvod, ktorý zahŕňa 3D digitálny akcelerometer a 3D digitálny gyroskop. Jednotlivé snímače sú vyrábané pomocou špeciálnej techniky tzv. ''micromachining'', zatiaľ čo rozhranie IC využíva CMOS technológiu. LSM6DS0 má dva režimy použitia. Prvý režim predstavuje aktiváciu akcelerometera a gyroskopu naraz na rovnakom ODR. Druhý režim predstavuje aktiváciu akcelerometera a deaktiváciu gyroskopu.
 
LSM6DS0 je integrovaný obvod, ktorý zahŕňa 3D digitálny akcelerometer a 3D digitálny gyroskop. Jednotlivé snímače sú vyrábané pomocou špeciálnej techniky tzv. ''micromachining'', zatiaľ čo rozhranie IC využíva CMOS technológiu. LSM6DS0 má dva režimy použitia. Prvý režim predstavuje aktiváciu akcelerometera a gyroskopu naraz na rovnakom ODR. Druhý režim predstavuje aktiváciu akcelerometera a deaktiváciu gyroskopu.
  
                                                           [[Image:JednotliveMody.jpg|500px]]
+
                                                            
  
 
LSM6DS0 je uložený v 3 mm x 3mm x 0.86 mm LGA púzdre.
 
LSM6DS0 je uložený v 3 mm x 3mm x 0.86 mm LGA púzdre.
Riadok 68: Riadok 74:
 
==== Vývody ====
 
==== Vývody ====
  
                                                        [[Image:pinLSM6DS0.png]]
+
[[Image:pinLSM6DS0.png]]
 +
 
 
Popis jednotlivých pinov a ich funkcia:
 
Popis jednotlivých pinov a ich funkcia:
  
                                                        [[Image:PinOpis.jpg|600px]]
+
[[Image:PinOpis.jpg|600px]]
  
 
==== Registre ====
 
==== Registre ====
  
TODOOOOOOO
+
LSM6DS0 má dve operačné módy: iba akcelerometer je zapnutý a gyroskop je vypnutý (register CTRL_REG6_XL (20h)) alebo akcelerometer a gyropskop sú zapnuté na rovnakom ODR (register CTRL_REG1_G (10h)).
 +
 
 +
[[Image:JednotliveMody.jpg|500px]]
 +
 
 +
'''Obr. č. 3 Módy senzora LSM6DS0'''
 +
 
 +
'''CTRL_REG6_XL (20h)'''
 +
Register ovládajúci senzor lineárneho zrýchlenia. Predstavuje register na zápis údajov.
 +
 
 +
[[Image:reg1.jpg|500px]]
 +
 
 +
'''Obr. č. 4 CTRL_REG6_XL register'''
 +
 
 +
Kde jednotlivé bity predstavujú
 +
{|
 +
|ODR_XL [2:0]
 +
|Output data rate and power mode slection. Defaultne je nastavená hodnota 000
 +
|----
 +
|FS_XL [1:0]
 +
|Výber maximálneho rozhrania. Defaultne je nastavená hodnota 00, (00: ±2g; 01: ±16g; 10: ±4g; 11: ±8g)
 +
|----
 +
|BW_SCAL_ODR
 +
|Bandwidth selection. Defaultne je nastavená hodnota 0
 +
|----
 +
|BW_XL [1:0]
 +
|Anti-aliasing filter. Defaultne je nastavená hodnota 00 (00: 408 Hz; 01: 211 Hz; 10: 105 Hz; 11: 50 Hz)
 +
|----
 +
|}
 +
 
 +
Ďalej sme využili nasledovné registra ako ''Output'':
 +
 
 +
'''OUT_X_XL (28h - 29h)'''
 +
Výstupný register pre meranie lineárneho zrýchlenia v smere osi X. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.
 +
 
 +
'''OUT_Y_XL (2Ah - 2Bh)'''
 +
Výstupný register pre meranie lineárneho zrýchlenia v smere osi Y. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.
 +
 
 +
'''OUT_Z_XL (2Ch - 2Dh)'''
 +
Výstupný register pre meranie lineárneho zrýchlenia v smere osi Z. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.
 +
 
  
 
=== Sériové rozhrania  ===
 
=== Sériové rozhrania  ===
Riadok 88: Riadok 134:
  
 
{|
 
{|
|'''Pojem'''
 
|'''Opis'''
 
 
|----
 
|----
|Master
+
*Master - začína a končí dátový prenos generovaním štart bitu a stop bitu - generuje hodinový signál - vysiela adresu podriadeného IO, pre ktorý budú dáta určené - určuje smer prenosu dát
| začína a končí dátový prenos generovaním štart bitu a stop bitu - generuje hodinový signál - vysiela adresu podriadeného IO, pre ktorý budú dáta určené - určuje smer prenosu dát
 
 
|----
 
|----
|Slave
+
*Slave - odpovedá iba v prípade, že rozpoznal svoju adresu - časovanie prenosu je riadené hodinovým signálom
|odpovedá iba v prípade, že rozpoznal svoju adresu - časovanie prenosu je riadené hodinovým signálom
 
 
|----
 
|----
 
|}
 
|}
 +
 +
 +
                                                  [[Image:PrenosBitu.jpg|400px]]
 +
                                                 
 +
                                                    '''Obr. č. 5 Prenos bitu''' 
 +
 +
*Štart bit a Stop bit - začiatok alebo koniec prenosu je definovaný dátovej linky z vysokej na úroveň. Prenos prechodom nízku (štart bit) alebo z nízkej na vysokú úroveň (stop bit) kým hodinový signál je na vysokej úrovni - po štart bite považujú všetky zariadenia zbernicu za zaneprázdnenú - po príchode stop bitu čakajú zariadenia istý čas a potom považujú zbernicu za voľnú Štart bit a stop bit
 +
 +
 +
                                                      [[Image:I2Cadr.jpg|400px]]
 +
 +
                                                  '''Obr. č. 6 I2C - Adresovanie'''
 +
 +
'''Opis'''
  
 
Existujú dva signály spojené s I2C zbernicou: Serial Clock Line (SCL - slúži pre prenos hodinového signálu) a Serial Data Line (SDA - slúži pre prenos sériových dát). SDA je obojsmerná linka, ktorá slúži na odosielanie a prijímanie dát do / z rozhrania. Obe linky musia byť pripojené k Vdd_IO prostredníctvom externého pull-up rezistorov.  
 
Existujú dva signály spojené s I2C zbernicou: Serial Clock Line (SCL - slúži pre prenos hodinového signálu) a Serial Data Line (SDA - slúži pre prenos sériových dát). SDA je obojsmerná linka, ktorá slúži na odosielanie a prijímanie dát do / z rozhrania. Obe linky musia byť pripojené k Vdd_IO prostredníctvom externého pull-up rezistorov.  
Riadok 105: Riadok 161:
 
Slave adresa (SAD) pridružená k LSM6DS0 je 110101xb. Ak je SDO/SA0 pin pripojený k zdroju napätia, LSB je '1' (adresa 1101011b), inak ak je SDO/SA0 pin pripojený k zemi, LSB hodnota "0" (adresa 1101010b). Toto riešenie umožňuje pripojiť sa a riešiť dve rôzne zotrvačné moduly na rovnakej zbernici I2C.  
 
Slave adresa (SAD) pridružená k LSM6DS0 je 110101xb. Ak je SDO/SA0 pin pripojený k zdroju napätia, LSB je '1' (adresa 1101011b), inak ak je SDO/SA0 pin pripojený k zemi, LSB hodnota "0" (adresa 1101010b). Toto riešenie umožňuje pripojiť sa a riešiť dve rôzne zotrvačné moduly na rovnakej zbernici I2C.  
  
[[Image:ReadWrite.jpg|450px]]
 
  
Prenos dát potvrdením je povinný. Vysielač musí uvoľniť SDA linku počas potvrdzovací impulzu. Prijímač musí potom ťahať dátovej linky nízko, takže zostáva stabilný nízka aj na vysokú dobu impulzu potvrdí hodiny. Prijímač ktorá bola určená, povinnosť vygeneruje uznať za každý bajt prijatých dát. I2C vložený vnútri LSM6DS0 chová ako slave a nasledujúce protokol musia byť dodržané. Po počiatočnom stave (ST) otrokom adresa je odoslaná, akonáhle otrok potvrdenie (SAK) bola vrátená, sa prenáša 8-bitová sub-adresa (SUB). Prírastok adresy je nakonfigurovaný CTRL_REG8 (22h) (IF_ADD_INC). Otrok adresa je doplnená / zápis trochu čítanie. V prípade, že bol trochu '1' (Read), opakované START (SR) podmienka musí byť vydané po dvoch sub-adresy bajtov. Ak je bit je "0" (Write) veliteľ bude vysielať na slave s nezmeneným smerom. Tabuľka 15 vysvetľuje, ako je SAD + Read / Write-bitový vzorka skladá so zoznamom všetkých možných konfigurácií.
+
                                                      [[Image:ReadWrite.jpg|500px]]
 +
 
 +
                                                    '''Obr. č. 7 Adresy zariadenia'''
 +
 
 +
 
 +
Prenos dát potvrdením je povinný. Vysielač musí uvoľniť SDA linku počas potvrdzovacieho impulzu. Prijímač musí potom ťahať dáta linky na nízkej úrovni, takže zostáva stabilný na nízkej úrovni aj počas high doby impulzu, ktoré potvrdzujú hodiny (clock). Prijímač, ktorý bol určený je povinný vygenerovať potvrdenie po každom bajte prijatých dát. I2C vložený vo vnútri LSM6DS0 sa správa ako slave a nasledujúci protokol musí byť dodržaný. Po počiatočnom stave (ST) slave adresa je odoslaná, akonáhle príde jedno slave vrátené potvrdenie (SAK) sa prenáša 8-bitová sub-adresa (SUB). Prírastok adresy je nakonfigurovaný CTRL_REG8 (22h) (IF_ADD_INC).  
  
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
+
Slave adresa je kompletná s Read/Write bitmi. V prípade, že bit je '1' (Read), opakovane zadaná podmienka START (SR) musí byť vydaná po dvoch sub-adries bajtov. Ak je bit "0" (Write) master bude vysielať na slave s nezmeneným smerom.
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 =
 
= Popis riešenia =
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
+
Nasledujúci obrázok predstavuje schému zapojenia snímača LSM6DS0, kde jednotlivé Piny sú opísané v časti ''Vývody''.
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  
 
  
'''Schéma zapojenia snímača'''
+
[[Image:schemaAKC.jpg]]
  
[[Súbor:schemaAKC.jpg]]
+
''' Obr. č. 8 Schéma zapojenia snímača'''
  
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
 
nahrať už aspoň 10 študentov.
 
  
[[Súbor:MojObrazok.jpg|center|250px]]
+
Snímač LSM6DS0 sme pripojili na dosku Arduino UNO.
 +
 
 +
[[Image:arduinoUNO.jpg|300px]]
 +
 
 +
''' Obr. č. 9 Arduino UNO'''
 +
 
 +
Napájanie a komunikácia riadiacej jednotky je zabezpečená z PC cez USB rozhranie. Pripojenie senzora na dosku vyzerá nasledovne:
 +
 
 +
[[Image:zapojenieACK.jpg|300px]]
 +
 
 +
''' Obr. č. 10 Zapojenie snímača'''
 +
 
 +
= Zmena riešenia =
 +
 
 +
Na realizáciu akcelerometra sme nakoniec nevyužili senzor LSM6DS0. Pri snahe o komunikáciu medzi doskou MEMS Inertial Nucleo a senzorom LSM6DS0 zlyhalo spojenie. Zobrazenie časti programu, ktorá mala zabezpečiť komunikáciu:
 +
<source lang="c">
 +
void setup() {
 +
 
 +
Serial.begin(SerialSpeed); 
 +
 
 +
Wire.begin();
 +
 
 +
Wire.beginTransmission(0xD4);
 +
 
 +
Wire.write(0x20); //register ovládajúci senzor lineárneho zrýchlenia
 +
 
 +
Wire.write(byte(0x00));
 +
 
 +
Wire.endTransmission();
 +
</source>
 +
 
 +
Po dohode s cvičiacim sme program dokončili pomocou MPL3115A2: High-precision Pressure Sensor, ktorý sa nachádza na doske Xtrinsic Sensors board. Následne sme vytvorili program, ktorý vypočíta nadmorskú výšku a prislúchajúci tlak.
 +
 
  
 
== Algoritmus a program ==
 
== Algoritmus a program ==
  
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.  
+
Program sme vyvíjali v prostredí Arduino 1.6.9. Program pozostáva z vytvorenia komunikácie medzi senzorom a zbernicou I2C, načítania senzorom nameraných hodnôt, výpočtu nadmorskej výšky, výpočtu tlaku a výpisu vypočítaných hodnôt na obrazovku.
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.
+
 
 +
[[Image:diagramS.jpg]]
 +
 
 +
''' Obr. č. 11 Vývojový diagram'''
 +
 
 +
'''1''' Funkcia setup()
  
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
+
Po inicializácii knižnice ''Wire.h'' sa zavolá funkcia ''setup()'', v ktorom sa pomocou funkcie ''begin()'' vytvorí prepojenie zbernice I2C a dosky. Volaním funkcie ''beginTransmission()'' sa vykoná I2C prenos zo slave zariadenia. Vstupom do tejto funkcie je adresa zariadenia. Následne dáta sú  prenášané pomocou funkcie ''write()''. Prenos so slave zariadenia sa zastavuje funkciou ''endTransmission()''
  
 
<source lang="c">
 
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */
 
  
int main(void) {
+
void setup() {
 +
 
 +
Serial.begin(SerialSpeed); 
 +
 
 +
Wire.begin();
 +
 
 +
Wire.beginTransmission(0xC0);
 +
 
 +
Wire.write(0x01);
 +
 
 +
Wire.write(byte(0x00));
 +
 
 +
Wire.endTransmission();
 +
 
 +
 
 +
delay(1000);
 +
   
 +
Serial.begin(SerialSpeed);
 +
   
 +
Serial.println("Semestralne zadanie");
 +
   
 +
Serial.println("Meranie nadmorskej vysky a tlaku");
 +
   
 +
Serial.println("---------------------------------");
 +
 
 +
}
 +
 +
</source>
 +
 
 +
 
 +
'''2''' Funkcia loop()
 +
 
 +
Po vykovaní funkcie ''setup()'', ktorá inicializuje a nastavuje počiatočné hodnoty, funkcie ''loop()'' opakovane vykonáva funkcionalitu program. Využíva sa na aktívne riadenie dosky Arduino. Pomocou funkcie ''requestFrom()'' master zariadenie vyžiada bajty od slave zariadenia (v našom prípade ide o 3 bajty). Funkcia ''read()'' slúži na prečítanie bajtov, ktoré boli poslané zo slave zariadenia na master. Pomocou rôznych bitových operácií a úprav sa v prvom rade vypočíta nadmorská výška v m a následne sa vypočíta tlak v hPa.
 +
 
 +
<source lang="c">
 +
 
 +
void loop() {
 +
 
 +
Wire.begin();
 +
 
 +
Wire.beginTransmission(0xC0);
 +
 
 +
Wire.write(0x04);
 +
 
 +
Wire.endTransmission();
 +
 
 +
 
 +
Wire.requestFrom(0xC0,3);
 +
 
 +
 +
byte msb, csb, lsb;
 +
 +
msb = Wire.read();
 +
 +
csb = Wire.read();
 +
 +
lsb = Wire.read();
 +
                   
 +
delay(500);
 +
     
 +
float pomocna = (lsb>>4)/16.0; // bitový posun doprava o 4 bity a delenie s 16
 +
 
 +
float vys = (float)( (msb << 8) | csb) + pomocna; // výpocet nadmorskej výšky
 +
 +
 
 +
// Hodnota tlaku sa vracia ako 20 bitové číslo posunuté doľava     
 +
long tlak_celk = (long)msb<<16 | (long)csb<<8 | (long)lsb;
 +
     
 +
tlak_celk >>= 6;
 +
 +
lsb &= 0b00110000; //Bity 4 a 5 predstavujú desatinnú zložku
 +
 +
lsb >>= 4;
 +
 +
float tlak_dec = (float)lsb/4.0; //Prevedenie na zlomok
 +
 
 +
 +
float tlak = (float)tlak_celk + tlak_dec; // výpočet tlaku 
 +
   
 +
 
 +
Serial.begin(SerialSpeed);
 +
   
 +
Serial.println("Nadmorska vyska v m");
 +
   
 +
Serial.println(NMM);
 +
   
 +
Serial.println();
 +
   
 +
Serial.println("Tlak v hPa");
 +
   
 +
Serial.println(tlak);
 
      
 
      
    printf("Hello, World!\n");
+
Serial.println();
    return(0);
+
 
 +
 
 +
delay(10000);
 +
 
 
}
 
}
 
</source>
 
</source>
  
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
 
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
Zdrojový kód: [[Médiá:senzor2.ino|senzor.ino]]
 +
 
 +
 
 +
== Overenie ==
 +
 
 +
 +
''' Používateľský návod:'''
 +
 
 +
'''1.''' Používateľ vyberie v prostredí Arduino dosku s ktorou pracuje: Nástroje -> Doska -> Arduino Genuino/Uno
 +
 
 +
[[Image:doskaTl.jpg]]
 +
 
 +
''' Obr. č. 12 Výber dosky'''
 +
 
 +
 
 +
 
 +
'''2.''' Následne si používateľ určí COM portu, na ktorý je doska pripojená: Nástroje -> Port -> "XY"COM
 +
 
 +
[[Image:port.jpg]]
 +
 
 +
''' Obr. č. 13 Výber portu'''
 +
 
 +
 
 +
 
 +
'''3.''' Po napísaní programu si môže používateľ overiť správnosť kódu pomocou funkcie VERIFY a hneď potom môže pristúpiť k nahratiu programu na dosku pomocou šípky ->
 +
 
 +
[[Image:spustanie.jpg]]
 +
 
 +
''' Obr. č. 14 Spúšťanie'''
 +
 
 +
 
 +
 
 +
'''4.''' Zobrazenie výsledku dosiahne používateľ po kliknutí na funkciu Monitor sériového portu (lupa napravo GUI)
  
[[Médiá:MojProgram.c|program.c]]
+
[[Image:Seriovyport.jpg]]
  
 +
''' Obr. č. 15 Monitor sériového portu'''
  
  
  
== Overenie ==
+
'''5.''' Tu vidíme, po rozkliknutí vyššie uvedenej funkcie, výstup nášho programu :-)
  
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
+
[[Image:output.jpg]]
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.
+
''' Obr. č. 16 Výstup'''
  
  
[[Category:AVR]] [[Category:DVPS]]
+
[[Category:AVR]] [[Category:DVPS]] [[Category:MEMS]] [[Category:I2C]]

Aktuálna revízia z 21:26, 11. december 2017

Autori: Eva Bartalová, Romana Čápková
Študijný odbor: Aplikovaná mechatronika a elektromobilita
Ročník: 1. ročník IŠ (2015/2016)

Zadanie

Využitím akcelerometra, ktorý sa nachádza na doske MEMS Inertial Nucleo navrhnite a vytvorte aplikáciu, ktorý bude merať zrýchlenie.

Úlohy:

  • Nájdite si k senzorom datasheet
  • Nájdite si schémy zapojenia dosky
  • Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke
  • Napíšte základný demonštračný program využívajúci vaše funkcie
  • Vymyslite a demonštrujte vhodnú aplikáciu



300px-NucleoBoard.jpg

Obr. č. 1 MEMS Inertial Nucleo


Zoznam senzorov, ktoré sa nachádzajú na doske:

  • LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)
  • LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)
  • LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer
  • HTS221: capacitive digital relative humidity and temperature


Senzor.png

Obr. č. 2 MEMS Inertial Nucleo - rozdelenie senzorov


Literatúra:

  • Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.


Analýza riešenia

Na realizáciu akcelerometra sme využili senzor LSM6DS0.

Senzor LSM6DS0

LSM6DS0 je integrovaný obvod, ktorý zahŕňa 3D digitálny akcelerometer a 3D digitálny gyroskop. Jednotlivé snímače sú vyrábané pomocou špeciálnej techniky tzv. micromachining, zatiaľ čo rozhranie IC využíva CMOS technológiu. LSM6DS0 má dva režimy použitia. Prvý režim predstavuje aktiváciu akcelerometera a gyroskopu naraz na rovnakom ODR. Druhý režim predstavuje aktiváciu akcelerometera a deaktiváciu gyroskopu.


LSM6DS0 je uložený v 3 mm x 3mm x 0.86 mm LGA púzdre.

Vlastnosti:

  • Analógové napájacie napätie: 1.71 V až 3.6 V
  • Nezávislé I/O napájanie (1.71 V)
  • Nízkovýkonový režim 1.8 mA
  • Meranie zrýchlenia v smere osi X,Y,Z
  • ±2/±4/±8/±16 g full scale
  • ±245/±500/±2000 dps full scale
  • SPI/I2C rozhranie
  • Vstavený snímač tepla
  • Vstavané FIFO


Vývody

PinLSM6DS0.png

Popis jednotlivých pinov a ich funkcia:

PinOpis.jpg

Registre

LSM6DS0 má dve operačné módy: iba akcelerometer je zapnutý a gyroskop je vypnutý (register CTRL_REG6_XL (20h)) alebo akcelerometer a gyropskop sú zapnuté na rovnakom ODR (register CTRL_REG1_G (10h)).

JednotliveMody.jpg

Obr. č. 3 Módy senzora LSM6DS0

CTRL_REG6_XL (20h) Register ovládajúci senzor lineárneho zrýchlenia. Predstavuje register na zápis údajov.

Reg1.jpg

Obr. č. 4 CTRL_REG6_XL register

Kde jednotlivé bity predstavujú

ODR_XL [2:0] Output data rate and power mode slection. Defaultne je nastavená hodnota 000
FS_XL [1:0] Výber maximálneho rozhrania. Defaultne je nastavená hodnota 00, (00: ±2g; 01: ±16g; 10: ±4g; 11: ±8g)
BW_SCAL_ODR Bandwidth selection. Defaultne je nastavená hodnota 0
BW_XL [1:0] Anti-aliasing filter. Defaultne je nastavená hodnota 00 (00: 408 Hz; 01: 211 Hz; 10: 105 Hz; 11: 50 Hz)

Ďalej sme využili nasledovné registra ako Output:

OUT_X_XL (28h - 29h) Výstupný register pre meranie lineárneho zrýchlenia v smere osi X. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.

OUT_Y_XL (2Ah - 2Bh) Výstupný register pre meranie lineárneho zrýchlenia v smere osi Y. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.

OUT_Z_XL (2Ch - 2Dh) Výstupný register pre meranie lineárneho zrýchlenia v smere osi Z. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.


Sériové rozhrania

Registre vo vnútri senzora LSM6DS0 umožňujú prístup aj pre I2C a SPI sériové rozhranie. Pričom SPI môže byť nakonfigurovaný tak, aby SW pracovalo buď v 3-wire alebo 4-wire režime. Sériové rozhrania sú mapované na rovnakých pinoch. Pre využitie rozhrania I2C, musí byť pin CS pripojený k Vdd_IO.

Zbernica I2C

“Inter-Integrated Circuit” protokol a zbernicu vyvinula firma Philips Semiconductor pôvodne pre svoje TV prijímače v roku 1980, za účelom komunikácie medzi IO na jednej DPS pri použití minimálneho množstva pinov. Špecifikácia zbernice I2C je založená na jednoduchých hardvérových štandardoch (nie sú potrebné špeciálne konektory alebo kabeláž)

Základné pojmy

  • Master - začína a končí dátový prenos generovaním štart bitu a stop bitu - generuje hodinový signál - vysiela adresu podriadeného IO, pre ktorý budú dáta určené - určuje smer prenosu dát
  • Slave - odpovedá iba v prípade, že rozpoznal svoju adresu - časovanie prenosu je riadené hodinovým signálom


                                                  PrenosBitu.jpg
                                                  
                                                    Obr. č. 5 Prenos bitu  
  • Štart bit a Stop bit - začiatok alebo koniec prenosu je definovaný dátovej linky z vysokej na úroveň. Prenos prechodom nízku (štart bit) alebo z nízkej na vysokú úroveň (stop bit) kým hodinový signál je na vysokej úrovni - po štart bite považujú všetky zariadenia zbernicu za zaneprázdnenú - po príchode stop bitu čakajú zariadenia istý čas a potom považujú zbernicu za voľnú Štart bit a stop bit


                                                     I2Cadr.jpg
                                                 Obr. č. 6 I2C - Adresovanie 

Opis

Existujú dva signály spojené s I2C zbernicou: Serial Clock Line (SCL - slúži pre prenos hodinového signálu) a Serial Data Line (SDA - slúži pre prenos sériových dát). SDA je obojsmerná linka, ktorá slúži na odosielanie a prijímanie dát do / z rozhrania. Obe linky musia byť pripojené k Vdd_IO prostredníctvom externého pull-up rezistorov.

Transakcia na zbernici je spustená pomocou signálu ŠTART (ST). Po štart podmienke sa vysiela na zbernicu 7bitove číslo – adresa SLAVE zariadenia (SAD) s ktorým chceme komunikovať – doplnené o najnižší bit, ktorý značí či chceme do zariadenia dáta zapisovať alebo z neho dáta prijímať (čítať).

Slave adresa (SAD) pridružená k LSM6DS0 je 110101xb. Ak je SDO/SA0 pin pripojený k zdroju napätia, LSB je '1' (adresa 1101011b), inak ak je SDO/SA0 pin pripojený k zemi, LSB hodnota "0" (adresa 1101010b). Toto riešenie umožňuje pripojiť sa a riešiť dve rôzne zotrvačné moduly na rovnakej zbernici I2C.


                                                     ReadWrite.jpg
                                                    Obr. č. 7 Adresy zariadenia 


Prenos dát potvrdením je povinný. Vysielač musí uvoľniť SDA linku počas potvrdzovacieho impulzu. Prijímač musí potom ťahať dáta linky na nízkej úrovni, takže zostáva stabilný na nízkej úrovni aj počas high doby impulzu, ktoré potvrdzujú hodiny (clock). Prijímač, ktorý bol určený je povinný vygenerovať potvrdenie po každom bajte prijatých dát. I2C vložený vo vnútri LSM6DS0 sa správa ako slave a nasledujúci protokol musí byť dodržaný. Po počiatočnom stave (ST) slave adresa je odoslaná, akonáhle príde jedno slave vrátené potvrdenie (SAK) sa prenáša 8-bitová sub-adresa (SUB). Prírastok adresy je nakonfigurovaný CTRL_REG8 (22h) (IF_ADD_INC).

Slave adresa je kompletná s Read/Write bitmi. V prípade, že bit je '1' (Read), opakovane zadaná podmienka START (SR) musí byť vydaná po dvoch sub-adries bajtov. Ak je bit "0" (Write) master bude vysielať na slave s nezmeneným smerom.


Popis riešenia

Nasledujúci obrázok predstavuje schému zapojenia snímača LSM6DS0, kde jednotlivé Piny sú opísané v časti Vývody.

SchemaAKC.jpg

Obr. č. 8 Schéma zapojenia snímača


Snímač LSM6DS0 sme pripojili na dosku Arduino UNO.

ArduinoUNO.jpg

Obr. č. 9 Arduino UNO

Napájanie a komunikácia riadiacej jednotky je zabezpečená z PC cez USB rozhranie. Pripojenie senzora na dosku vyzerá nasledovne:

ZapojenieACK.jpg

Obr. č. 10 Zapojenie snímača

Zmena riešenia

Na realizáciu akcelerometra sme nakoniec nevyužili senzor LSM6DS0. Pri snahe o komunikáciu medzi doskou MEMS Inertial Nucleo a senzorom LSM6DS0 zlyhalo spojenie. Zobrazenie časti programu, ktorá mala zabezpečiť komunikáciu:

void setup() {

Serial.begin(SerialSpeed);  
  
Wire.begin();
  
Wire.beginTransmission(0xD4); 
  
Wire.write(0x20); //register ovládajúci senzor lineárneho zrýchlenia
  
Wire.write(byte(0x00));
  
Wire.endTransmission();

Po dohode s cvičiacim sme program dokončili pomocou MPL3115A2: High-precision Pressure Sensor, ktorý sa nachádza na doske Xtrinsic Sensors board. Následne sme vytvorili program, ktorý vypočíta nadmorskú výšku a prislúchajúci tlak.


Algoritmus a program

Program sme vyvíjali v prostredí Arduino 1.6.9. Program pozostáva z vytvorenia komunikácie medzi senzorom a zbernicou I2C, načítania senzorom nameraných hodnôt, výpočtu nadmorskej výšky, výpočtu tlaku a výpisu vypočítaných hodnôt na obrazovku.


DiagramS.jpg

Obr. č. 11 Vývojový diagram

1 Funkcia setup()

Po inicializácii knižnice Wire.h sa zavolá funkcia setup(), v ktorom sa pomocou funkcie begin() vytvorí prepojenie zbernice I2C a dosky. Volaním funkcie beginTransmission() sa vykoná I2C prenos zo slave zariadenia. Vstupom do tejto funkcie je adresa zariadenia. Následne dáta sú prenášané pomocou funkcie write(). Prenos so slave zariadenia sa zastavuje funkciou endTransmission()

void setup() {

Serial.begin(SerialSpeed);  
  
Wire.begin();
  
Wire.beginTransmission(0xC0); 
  
Wire.write(0x01);
  
Wire.write(byte(0x00));
  
Wire.endTransmission();
  
  
delay(1000);
    
Serial.begin(SerialSpeed);
    
Serial.println("Semestralne zadanie");
    
Serial.println("Meranie nadmorskej vysky a tlaku");
    
Serial.println("---------------------------------");

}


2 Funkcia loop()

Po vykovaní funkcie setup(), ktorá inicializuje a nastavuje počiatočné hodnoty, funkcie loop() opakovane vykonáva funkcionalitu program. Využíva sa na aktívne riadenie dosky Arduino. Pomocou funkcie requestFrom() master zariadenie vyžiada bajty od slave zariadenia (v našom prípade ide o 3 bajty). Funkcia read() slúži na prečítanie bajtov, ktoré boli poslané zo slave zariadenia na master. Pomocou rôznych bitových operácií a úprav sa v prvom rade vypočíta nadmorská výška v m a následne sa vypočíta tlak v hPa.

void loop() {
  
Wire.begin();
  
Wire.beginTransmission(0xC0);
  
Wire.write(0x04);
  
Wire.endTransmission();
  
  
Wire.requestFrom(0xC0,3);
  
		
byte msb, csb, lsb;
	
msb = Wire.read(); 
	
csb = Wire.read();
	
lsb = Wire.read();
                    
delay(500);
      
float pomocna = (lsb>>4)/16.0; // bitový posun doprava o 4 bity a delenie s 16

float vys = (float)( (msb << 8) | csb) + pomocna; // výpocet nadmorskej výšky
 

// Hodnota tlaku sa vracia ako 20 bitové číslo posunuté doľava       
long tlak_celk = (long)msb<<16 | (long)csb<<8 | (long)lsb;
       
tlak_celk >>= 6; 
	
lsb &= 0b00110000; //Bity 4 a 5 predstavujú desatinnú zložku
	
lsb >>= 4; 
	
float tlak_dec = (float)lsb/4.0; //Prevedenie na zlomok

	
float tlak = (float)tlak_celk + tlak_dec; // výpočet tlaku  
     

Serial.begin(SerialSpeed);
    
Serial.println("Nadmorska vyska v m");
    
Serial.println(NMM);
    
Serial.println();
    
Serial.println("Tlak v hPa");
    
Serial.println(tlak);
    
Serial.println();
  
  
delay(10000);

}


Zdrojový kód: senzor.ino


Overenie

Používateľský návod:

1. Používateľ vyberie v prostredí Arduino dosku s ktorou pracuje: Nástroje -> Doska -> Arduino Genuino/Uno

DoskaTl.jpg

Obr. č. 12 Výber dosky


2. Následne si používateľ určí COM portu, na ktorý je doska pripojená: Nástroje -> Port -> "XY"COM

Port.jpg

Obr. č. 13 Výber portu


3. Po napísaní programu si môže používateľ overiť správnosť kódu pomocou funkcie VERIFY a hneď potom môže pristúpiť k nahratiu programu na dosku pomocou šípky ->

Spustanie.jpg

Obr. č. 14 Spúšťanie


4. Zobrazenie výsledku dosiahne používateľ po kliknutí na funkciu Monitor sériového portu (lupa napravo GUI)

Seriovyport.jpg

Obr. č. 15 Monitor sériového portu


5. Tu vidíme, po rozkliknutí vyššie uvedenej funkcie, výstup nášho programu :-)

Output.jpg

Obr. č. 16 Výstup