Trojosí akcelerometer MMA7455: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(21 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených) | |||
Riadok 1: | Riadok 1: | ||
{| | {| | ||
|Autori: || ''' | |Autori: || '''Tomáš Vincze, Tomáš Šandal''' | ||
|- | |- | ||
|Študijný odbor: || Aplikovaná mechatronika || 2. Ing. (''' | |Študijný odbor: || Aplikovaná mechatronika || 2. Ing. ('''2014''') | ||
|} | |} | ||
Riadok 13: | Riadok 13: | ||
[[Obrázok:Parallax_MMA7455.jpg|300px]][[Obrázok:HraciaKocka.jpg|200px]] | [[Obrázok:Parallax_MMA7455.jpg|300px]][[Obrázok:HraciaKocka.jpg|200px]] | ||
* [http://www.parallax.com/product/28140 Product page] | <!--* [http://www.parallax.com/product/28140 Product page ]--> | ||
'''Literatúra:'''<br> | |||
<!-- * Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.--> | |||
[http://www.parallax.com/product/28526 Stránka produktu] | |||
<br> | |||
[http://www.parallax.com/sites/default/files/downloads/28526-MMA7455-3-Axis-Accelerometer-Documentation-v1.1.pdf Datasheet modulu senzora] | |||
<br> | |||
[http://www.farnell.com/datasheets/47838.pdf Datasheet čipu] | |||
<br> | |||
__TOC__ | __TOC__ | ||
Riadok 55: | Riadok 60: | ||
<tr><td>8</td><td>CLK</td><td>i2c hodinové impulzy(SCL),SPI hodinové impulzy(SPC)</td><td>Vstup</td></tr> | <tr><td>8</td><td>CLK</td><td>i2c hodinové impulzy(SCL),SPI hodinové impulzy(SPC)</td><td>Vstup</td></tr> | ||
</table> | </table> | ||
'''Rozloženie pinov''' | |||
[[Súbor:Piny_mma7455_.jpg ]] | [[Súbor:Piny_mma7455_.jpg ]] | ||
<h3>Synchrónna komunikácia i2c</h3> | <h3>Synchrónna komunikácia i2c</h3> | ||
Riadok 123: | Riadok 128: | ||
Piny, ktoré sa využívajú na i2c komunikáciu u nami použitej vývojovej dosky acrob, sú označoné A4 (SDA) a A5 (SCL). | Piny, ktoré sa využívajú na i2c komunikáciu u nami použitej vývojovej dosky acrob, sú označoné A4 (SDA) a A5 (SCL). | ||
''' | '''Shéma zapojenia''' | ||
[[Súbor:Schema_zapojenia_mma7455_i2c.jpg]] | [[Súbor:Schema_zapojenia_mma7455_i2c.jpg]] | ||
Riadok 233: | Riadok 238: | ||
/* A nezabudnite zdroják hojne komentovať */ | /* A nezabudnite zdroják hojne komentovať */ | ||
int main(void) { | #include <avr/io.h> | ||
#include <avr/pgmspace.h> | |||
printf(" | #include <util/delay.h> | ||
#include <stdio.h> | |||
#include "serial.h" | |||
#include "acc_mma7455_avr.h" | |||
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); | |||
int main(void) | |||
{ | |||
int c; | |||
//inicializacia akcelerometra MMA7455 | |||
uint8_t res; | |||
res=MMA7455Init(MMA7455_RANGE_2G);// nastavenie citlivosti akcelerometra | |||
if(res==0) | |||
{ | |||
//Error! | |||
inituart(); // Inicializacia seriovej linky | |||
stdout = &mystdout; | |||
printf("chyba"); | |||
_delay_ms(300); | |||
while(1){} | |||
} | |||
while(1) | |||
{ | |||
//cakaj kym data budu pripravene | |||
while(MMA7455IsDataReady()==0){} | |||
//meranie | |||
int8_t x,y,z; | |||
x=MMA7455GetX(); | |||
y=MMA7455GetY(); | |||
z=MMA7455GetZ(); | |||
inituart(); // Inicializacia seriovej linky | |||
stdout = &mystdout; | |||
printf(" \ngravitacne sily v jednotlivych osiach\n"); | |||
printf(" \n"); | |||
printf(" x= %d\n",x); | |||
printf(" z= %d\n",z); | |||
printf(" y= %d\n",y); | |||
printf(" \n"); | |||
// definovanie hran(stran) hracej kocky a vypis prislusneho cisla | |||
if (z>60 && z<68) | |||
{ | |||
c=2; | |||
printf(" Hodil si: %d\n",c); | |||
} | |||
if (z<-60 && z>-68) | |||
{ | |||
c=5; | |||
printf(" Hodil si: %d\n",c); | |||
} | |||
if (x>60 && x<68) | |||
{ | |||
c=1; | |||
printf(" Hodil si: %d\n",c); | |||
} | |||
if (x<-60 && x>-68) | |||
{ | |||
c=6; | |||
printf(" Hodil si: %d\n",c); | |||
} | |||
if (y>60 && y<68) | |||
{ | |||
c=4; | |||
printf(" Hodil si: %d\n",c); | |||
} | |||
if (y<-60 && y>-68) | |||
{ | |||
c=3; | |||
printf(" Hodil si: %d\n",c); | |||
} | |||
_delay_ms(20000); | |||
} | |||
} | |||
} | } | ||
</source> | </source> | ||
Zdrojový kód:[[Médiá:Acc_mma7455_avr.c|acc_mma7455_avr.c]], [[Médiá:Acc_mma7455_avr.h|acc_mma7455_avr.h]], [[Médiá:I2c_avr.c|i2c_avr.c]], [[Médiá:I2c_avr.h|i2c_avr.h]],[[Médiá:Serial_sv.c|serial.c]], [[Médiá:Serial_sv.h|serial.h]], [[Médiá:Projekt_2pokus.c|main.c]] | |||
<!--[[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]--> | |||
Zdrojový kód: [[Médiá: | |||
[[Médiá: | |||
=== Overenie === | === Overenie === | ||
<p> | |||
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, | Oživenie prípravku sa realizuje jeho pripojením na napájacie napätie. Na sledovanie činnosti používame program Terminal. V programe treba správne zvoliť sériový port, prenosovú rýchlosť 9600 baudov, 8 dátových bitov, 1 stop bit a zvoliť si možnosť bez potvrdzovania (Handshaking none). Po pripojení nám program začne vypisovať údaje, ktoré sa namerali a tiež číslo, ktoré sme "hodili". Naše riešenie využíva USB kábel na prenos údajov, bola snaha prenos uskutočniť pomocou bluetooth, ale sa nepodarilo oživiť komunikačný modul. Nastavili sme aj pásmo citlivosti pre každú os cca +- 3 jednotiek, tým zabezpečíme vplyv rovnosti plochy. Na obrázkoch nižšie sú znázornené príklady pre tri polohy akcelerometra, aby sme demonštrovali jeho funkčnosť. | ||
</p> | |||
<br> | |||
'''Príklad č.1''' | |||
[[Súbor:Priklad1_y_os_maa7455.jpg]] | |||
<br><br> | |||
'''Príklad č.2''' | |||
[[Súbor:Priklad2_z_os_maa7455.jpg]] | |||
<br><br> | |||
'''Príklad č.3''' | |||
[[Súbor:Priklad3_x_os_maa7455.jpg]] | |||
<!--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). | 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, | Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, | ||
odfotografujte ho. | odfotografujte ho.--> | ||
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte. | <!--Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.--> | ||
[[Category:AVR]] [[Category:DVPS]] | [[Category:AVR]] [[Category:DVPS]][[Category:I2C]] |
Aktuálna revízia z 13:41, 15. marec 2016
Autori: | Tomáš Vincze, Tomáš Šandal | |
Študijný odbor: | Aplikovaná mechatronika | 2. Ing. (2014) |
Zadanie
Treba popísať ako funguje samotný senzor, ako sa pripojí k mikropočítaču a čo vlastne meria. Naprogramujte bezdrôtovú hraciu kocku.
Literatúra:
Stránka produktu
Datasheet modulu senzora
Datasheet čipu
Analýza
Našou úlohou bolo zrealizovať bezdrôtovú hraciu kocku. Na určenie čísla, ktoré bolo hodené slúži akcelerometer. Odmeraním pôsobenia gravitačného zrýchlenia v jednotlivých osiach sa priradí číslo od 1 do 6. Riadenie a posielanie údajov zabezpečuje mikrokontrolér ATmega 328P. Akcelerometer mma7455 komunikuje v našom prípade s mikroprocesorom štandardom i2c. Namerané údaje sú odosielané sériovou zbernicou z mikroprocesora na klientské zariadenie.
Vlastnosti akcelerometra mma 7455:
- komunikácia pomocou i2c/SPI,
- voliteľná citlivosť: 8-bitový mód (±2g/±4g/±8g), alebo 10-bitový mód (±8g),
- uživateľom ovládané (kontrolované) prerušenia int1/int2,
- užívateľom nastaviteľné registre pre kalibráciu jednotlivých osí
- vstupné napätie v rozsahu 2,5 - 5,5 VDC,
- prúdový odber v pokoji (standby) 26 μA a v aktívnom režime 0,5 - 3 mA,
- teplotný rozsah správnej činnosti snímača -40 to +85 °C.
Popis pinov mma 7455
Pin | Označenie pinu | Popis | Typ pinu |
---|---|---|---|
1 | VIN | Vstupné napájacie napätie | Napájanie |
2 | n/c | Nezapojený | n/a |
3 | INT1 | Prerušenie1/Data Ready | Výstup |
4 | INT2 | Prerušenie2 | Výstup |
5 | GND | Uzemnenie | Napájanie |
6 | CS | Typ komunikácie,SPI povolený(0),I2C povelený(1) | Vstup |
7 | Data | i2c dáta(SDA),SPI dáta(SDI/SDO) | Vstup/Výstup |
8 | CLK | i2c hodinové impulzy(SCL),SPI hodinové impulzy(SPC) | Vstup |
Synchrónna komunikácia i2c
- protokol a zbernicu vyvinula firma Philips Semiconductor pôvodne pre svoje TV príjí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áž) a rovnako jednoduchého softvérového štandardu pre komunikačný protokol,
- obvody, ktoré používajú I2C protokol zahŕňajú pamäte EEPROM a RAM, senzory teploty, expandéry portov, hodiny reálneho času, atď.,
- používa sa tiež ako riadiaca zbernica v obvodoch spracovania signálov, ktoré majú oddelenú dátovú zbernicu, napr. RF tunery, video dekódery a enkódery a audio procesory a kodeky,
- zbernica i2c môže pracovať pri troch prenosových rýchlostiach:
- Slow (pod 100 Kbps),
- Fast (400 Kbps),
- High-speed (3.4 Mbps) – protokol označený ako i2c v.2.0,
- vzdialenosť komunikujúcich zariadení je limitovaná z dôvodu udržania komunikačnej rýchlosti na približne 4m,
- zbernica používa dva vodiče – Serial Data (SDA) a Serial Clock (SCL)
- synchrónna (signál SCL), multimasterová (aj slave môže byť konfigurovaný tak, aby mohol začať komunikáciu) zbernica s polovičným duplexom,
- každý IO na zbernici je identifikovaný svojou adresou, ktorá je v rámci siete jedinečná, preto zbernica I2C nevyžaduje signál CS (chip select) ani ďalšiu logiku,
- linky SDA aj SCL sú pripojené na napájacie napätie pomocou tzv. pullup rezistorov,
- každé zariadenie na zbernici môže stiahnuť danú linku na nízku úroveň pomocou tranzistorov s otvoreným kolektorom.
I2C prenos dát
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.
Prenos bitu
- počas dátového prenosu sa stav na dátovom vodiči mení iba keď je hodinový signál na nízkej úrovni.
Štart bit a stop bit
- začiatok alebo koniec prenosu je definovaný prechodom dátovej linky z vysokej na nízku úroveň (š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ú.
UART
Univerzálny asynchrónny prijímač/vysielač (UART) je hardware, ktorý vysiela a prijíma dáta pomocou dvoch pinov RX a TX. Tým, že sa jedná a asynchrónnu komunikáciu, tak aj vysielač aj prijímač obsahujú vlastný generátor hodinových impulzov, ktorými sa UART taktuje. Zbernica umožňuje nastavenie frekvencie taktovacieho signálu, veľkosť bajtu, počet stop bitov, paritný bit. Pokiaľ neprebieha ani vysielanie ani príjem, pokojová úroveň signálu je logická 1. Vysielanie sa zahajuje zmenou hodnoty signálu na logickú 0 počas trvania jedného bitu (tzv. štart bitu). Po tejto sekvencii sa posiela najnižší dátový bit a ako posledný sa odošle navýznamnejší dátový bit. Ten potom je nasledovaný stop bitom, ktorý má opäť úroveň logickej 1. Po odvysielaní stop bitu môže opäť začať vysielanie ďalšieho bajtu.
Popis riešenia
Akcelerometer mma 7455 je k procesoru pripojený dvoma vodičmi - SDA a SCL. Vodič SDA slúži na prenos informácií (dát) a SCL na synchronizáciu. Tieto vodiče sú pomocou rezistorov 4k7 (tzv pull up rezistory) pripojené k napájaciemu napätiu +5VDC. Taktiež je pripojený k napájaciemu napätiu a je uzemnený. Piny, ktoré sa využívajú na i2c komunikáciu u nami použitej vývojovej dosky acrob, sú označoné A4 (SDA) a A5 (SCL).
Nami použitému akcelerometeru vieme predpísať citlovosť a tým priamo súvisý aj jeho mód. My sme si zvoli citlivosť ±2g a tým pádom akcelerometer pracuje v 8 bitovom móde. Číselné hodnoty výstupov pre nami zvolenú citlivosť uvádzam nižšie.
Citlovosť | Akcelerácia | Výstupné hodnoty (decimálne) |
---|---|---|
±2g | -2g | -127 |
-1g | -63 | |
0g | 0 | |
1g | 63 | |
2g | 127 |
Pre správne meranie sme museli akcelerometer nakalibrovať. Ako referenčnú rovinu sme si zvolili stôl. Kalibráciu sme vykonali vo všetkých osiach. Nameraná údaje sme museli ovplyvniť tak, aby sme sa dopracovali k hodnotám z tabuľky vyššie. Teda, keď meriame v osi Z tak výstupné hodnoty budú +/- 63 pre túto os a ostané osi bude nulové. Takto sme postupovali aj pri osiach X a Y. Pri našom meraní nám stačilo uvažovať zrýchlenie 1g.
Na správne priradenie čísla z rozsahu 1 až 6 bolo potrebné stotožniť jednotlivé osi akcelorometra s týmito číslami. Vytvorili sme teda tabuľku priradenia.
Čísla | Merané zrýchlenia v osiach akcelerometra | ||
---|---|---|---|
x | y | z | |
1 | 63 | 0 | 0 |
2 | 0 | 0 | 63 |
3 | 0 | -63 | 0 |
4 | 0 | 63 | 0 |
5 | 0 | 0 | -63 |
6 | -63 | 0 | 0 |
Situovanie jednotlivých osí akcelerometra s porovnaním hracej kocky
Algoritmus a program
Algoritmus bol napísaný v prostredí avrstudio verzia 4 v jazyku c++. Algoritmus zabezpečuje inicializáciu snímača. Po inicializácii sa uskutoční komunikácia štandardom i2c a dochádza k samotnému snímaniu zrýchlenia. Údaje sú sériovou linkou posielané do počítača, kde sa pomocou serial monitora vypisujú.
/* A nezabudnite zdroják hojne komentovať */
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdio.h>
#include "serial.h"
#include "acc_mma7455_avr.h"
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
int main(void)
{
int c;
//inicializacia akcelerometra MMA7455
uint8_t res;
res=MMA7455Init(MMA7455_RANGE_2G);// nastavenie citlivosti akcelerometra
if(res==0)
{
//Error!
inituart(); // Inicializacia seriovej linky
stdout = &mystdout;
printf("chyba");
_delay_ms(300);
while(1){}
}
while(1)
{
//cakaj kym data budu pripravene
while(MMA7455IsDataReady()==0){}
//meranie
int8_t x,y,z;
x=MMA7455GetX();
y=MMA7455GetY();
z=MMA7455GetZ();
inituart(); // Inicializacia seriovej linky
stdout = &mystdout;
printf(" \ngravitacne sily v jednotlivych osiach\n");
printf(" \n");
printf(" x= %d\n",x);
printf(" z= %d\n",z);
printf(" y= %d\n",y);
printf(" \n");
// definovanie hran(stran) hracej kocky a vypis prislusneho cisla
if (z>60 && z<68)
{
c=2;
printf(" Hodil si: %d\n",c);
}
if (z<-60 && z>-68)
{
c=5;
printf(" Hodil si: %d\n",c);
}
if (x>60 && x<68)
{
c=1;
printf(" Hodil si: %d\n",c);
}
if (x<-60 && x>-68)
{
c=6;
printf(" Hodil si: %d\n",c);
}
if (y>60 && y<68)
{
c=4;
printf(" Hodil si: %d\n",c);
}
if (y<-60 && y>-68)
{
c=3;
printf(" Hodil si: %d\n",c);
}
_delay_ms(20000);
}
}
}
Zdrojový kód:acc_mma7455_avr.c, acc_mma7455_avr.h, i2c_avr.c, i2c_avr.h,serial.c, serial.h, main.c
Overenie
Oživenie prípravku sa realizuje jeho pripojením na napájacie napätie. Na sledovanie činnosti používame program Terminal. V programe treba správne zvoliť sériový port, prenosovú rýchlosť 9600 baudov, 8 dátových bitov, 1 stop bit a zvoliť si možnosť bez potvrdzovania (Handshaking none). Po pripojení nám program začne vypisovať údaje, ktoré sa namerali a tiež číslo, ktoré sme "hodili". Naše riešenie využíva USB kábel na prenos údajov, bola snaha prenos uskutočniť pomocou bluetooth, ale sa nepodarilo oživiť komunikačný modul. Nastavili sme aj pásmo citlivosti pre každú os cca +- 3 jednotiek, tým zabezpečíme vplyv rovnosti plochy. Na obrázkoch nižšie sú znázornené príklady pre tri polohy akcelerometra, aby sme demonštrovali jeho funkčnosť.