Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami
Z SensorWiki
(→Analýza) |
|||
(16 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených) | |||
Riadok 1: | Riadok 1: | ||
+ | Balogh: chýba podrobnejší opis senzora | ||
+ | chýba zmienka o kalibrácii | ||
+ | vizualizácia mohla byť trocha náročnejšia | ||
+ | |||
{| | {| | ||
|Autori: || '''Matej Furmánek, Ľubomír Halač''' | |Autori: || '''Matej Furmánek, Ľubomír Halač''' | ||
Riadok 19: | Riadok 23: | ||
− | |||
− | |||
Riadok 50: | Riadok 52: | ||
*SPI (10 MHz) | *SPI (10 MHz) | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == Popis riešenia == | + | === Popis riešenia === |
+ | |||
+ | |||
− | + | '''Schéma zapojenia MEMS akcelerometra k arduinu''' | |
− | + | [[Súbor:SchemaZap.png|700px]] | |
+ | [[Súbor:GyroskopCurcuit.jpg|700px]] | ||
− | + | === Algoritmus a program === | |
− | |||
− | + | Program bol napísaný v jazyku C a otestovaný v Arduinou IDE. Jeho úlohou je vyčítať x, y, z súradnice z L3G4200D a následne tieto údaje vypísať na sériovú linku. | |
− | + | <source lang="c"> | |
− | + | int L3G4200D_Address = 105; | |
+ | /*Nastavenie I2C adresy*/ | ||
− | + | int x; | |
+ | int y; | ||
+ | int z; | ||
− | + | void setup(){ | |
− | + | Wire.begin(); | |
− | + | Serial.begin(9600); | |
− | |||
− | + | Serial.println("starting up L3G4200D"); | |
+ | setupL3G4200D(2000); // Nastavenie L3G4200 na 2000 deg/sec | ||
+ | delay(1500); //čakanie, kým je senzor pripravený | ||
+ | } | ||
+ | </source> | ||
<source lang="c"> | <source lang="c"> | ||
− | /* | + | void loop(){ |
+ | getGyroValues(); // Update hodnoty x, y, a z | ||
+ | |||
+ | |||
+ | Serial.print(x); | ||
+ | Serial.print(","); | ||
+ | Serial.print(y); | ||
+ | Serial.print(","); | ||
+ | Serial.println(z); | ||
+ | |||
+ | delay(100); //Delay aby boli hodnoty čitatelnejsie | ||
+ | } | ||
+ | /*funkcia na získanie aktuálnych súradníc x,y,z*/ | ||
+ | void getGyroValues(){ | ||
+ | |||
+ | byte xMSB = readRegister(L3G4200D_Address, 0x29); | ||
+ | byte xLSB = readRegister(L3G4200D_Address, 0x28); | ||
+ | x = ((xMSB << 8) | xLSB); | ||
+ | |||
+ | byte yMSB = readRegister(L3G4200D_Address, 0x2B); | ||
+ | byte yLSB = readRegister(L3G4200D_Address, 0x2A); | ||
+ | y = ((yMSB << 8) | yLSB); | ||
− | + | byte zMSB = readRegister(L3G4200D_Address, 0x2D); | |
− | + | byte zLSB = readRegister(L3G4200D_Address, 0x2C); | |
− | + | z = ((zMSB << 8) | zLSB); | |
− | |||
} | } | ||
</source> | </source> | ||
− | + | <source lang="c"> | |
+ | void writeRegister(int deviceAddress, byte address, byte val) { | ||
+ | Wire.beginTransmission(deviceAddress); // začiatok prenosu do zariadenia | ||
+ | Wire.write(address); // poslanie adresy registra | ||
+ | Wire.write(val); // poslanie hodnoty na zápis | ||
+ | Wire.endTransmission(); // koniec prenosu | ||
+ | } | ||
+ | |||
+ | int readRegister(int deviceAddress, byte address){ | ||
− | + | int v; | |
+ | Wire.beginTransmission(deviceAddress); | ||
+ | Wire.write(address); // registracia na citanie | ||
+ | Wire.endTransmission(); | ||
− | + | Wire.requestFrom(deviceAddress, 1); // načítanie bytu | |
+ | while(!Wire.available()) { | ||
+ | // čakanie | ||
+ | } | ||
+ | v = Wire.read(); | ||
+ | return v; | ||
+ | } | ||
+ | </source> | ||
+ | Uzivatelské rozhranie sme vytvorili v Processingu | ||
− | === | + | <source lang="c"> |
+ | void setup() { | ||
+ | size(200,200); // Veľkosť pozadia | ||
+ | |||
+ | |||
+ | println(Serial.list()[4]); | ||
+ | |||
+ | // Výber portu | ||
+ | port = new Serial(this, Serial.list()[4], 9600); | ||
+ | } | ||
+ | //Funkcia, ktorá vykresly farebné pozadie | ||
+ | void draw() { | ||
+ | // Na farbu su pouzite udaje zo serial portu. | ||
+ | background(r,g,b); | ||
+ | } | ||
+ | |||
+ | void serialEvent(Serial port) { | ||
+ | |||
+ | // Údaje zo serial portu sú načítané zo serialEvent() | ||
+ | |||
+ | String input = port.readStringUntil(lf); | ||
+ | if(input!=null){ | ||
+ | println(input); | ||
+ | int[] vals = int(splitTokens(input, ",")); | ||
+ | if(vals[0]<0){ | ||
+ | vals[0]=0; | ||
+ | } | ||
+ | if(vals[1]<0){ | ||
+ | vals[1]=0; | ||
+ | } | ||
+ | if(vals[2]<0){ | ||
+ | vals[2]=0; | ||
+ | } | ||
+ | r = vals[0]/100; | ||
+ | g = vals[1]/100; | ||
+ | b = vals[2]/100; | ||
+ | println( "R:" + r); | ||
+ | println( "G:" + g); | ||
+ | println( "B:" + b); | ||
+ | } | ||
+ | </source> | ||
− | + | Kompletný zdrojový kód: [[Médiá:cube.pde|cube.pde]] a [[Médiá:gyroskop.ino|gyroskop.ino]] | |
− | |||
− | |||
− | |||
− | + | === Overenie === | |
+ | Výsledný program slúži na menenie pozadia na základe x,y,z polohy akcelerometra, kde každá zložka polohy predstavuje zložku farby v RGB. X reprezentuje R, Y reprezentuje G a Z reprezentuje B, pričom sa berú do úvahy len kladné hodnoty s upraveným vzorkovaním. | ||
[[MEMS_projekty#Projekty_2019|Späť na zoznam projektov...]] | [[MEMS_projekty#Projekty_2019|Späť na zoznam projektov...]] | ||
[[Category:MEMS2019]] [[Category:AVR]] | [[Category:MEMS2019]] [[Category:AVR]] |
Aktuálna revízia z 11:29, 14. máj 2019
Balogh: chýba podrobnejší opis senzora chýba zmienka o kalibrácii vizualizácia mohla byť trocha náročnejšia
Autori: | Matej Furmánek, Ľubomír Halač | |
Študijný odbor: | Aplikovaná mechatronika a elektromobilita | 1. Ing. (2019) |
Obsah
Zadanie
Využite dvojosí MEMS akcelometer L3G4200D na vytvorenie aplikácie ktorá bude podľa zmeny súradníc akcelometra meniť barvu pozadia programu.
Úlohy
- Nájdite si datasheet k danému senzoru
- 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
Literatúra:
Komponenty
Na vypracovanie zadania sme použili nasledujúce komponenty:
- 1 x Vývojová doska Arduino
- 1 x dvojosí MEMS akcelometer L3G4200D
- 1 x Mini USB kábel
- Prepojovacie kábliky
- Software - Arduino IDE
- Software - Processing
Analýza
L3G4200D je 3-osový snímač uhlovej rýchlosti s digitálnym sériovým rozhraním I2C a SPI. Modul sníma plnú stupnicu ± 250 / ± 500 / ± 2000 dps a je schopný merať rýchlosti s voliteľnou šírkou pásma. Modul L3G4200D môže byť nakonfigurovaný na generovanie signálov prerušení nezávislým budením. Prahové hodnoty a časovanie generátora prerušení sú programovateľné používateľom za behu.
Vlastnosti
- Napájacie napätie: 3V - 5V
- Merací rozsah: 250 / 500 / 2000 dps
- Prevádzková teplota: -40°C až +85°C
Rozhrania
- I2C (až do 400 kHz)
- SPI (10 MHz)
Popis riešenia
Schéma zapojenia MEMS akcelerometra k arduinu
Algoritmus a program
Program bol napísaný v jazyku C a otestovaný v Arduinou IDE. Jeho úlohou je vyčítať x, y, z súradnice z L3G4200D a následne tieto údaje vypísať na sériovú linku.
int L3G4200D_Address = 105;
/*Nastavenie I2C adresy*/
int x;
int y;
int z;
void setup(){
Wire.begin();
Serial.begin(9600);
Serial.println("starting up L3G4200D");
setupL3G4200D(2000); // Nastavenie L3G4200 na 2000 deg/sec
delay(1500); //čakanie, kým je senzor pripravený
}
void loop(){
getGyroValues(); // Update hodnoty x, y, a z
Serial.print(x);
Serial.print(",");
Serial.print(y);
Serial.print(",");
Serial.println(z);
delay(100); //Delay aby boli hodnoty čitatelnejsie
}
/*funkcia na získanie aktuálnych súradníc x,y,z*/
void getGyroValues(){
byte xMSB = readRegister(L3G4200D_Address, 0x29);
byte xLSB = readRegister(L3G4200D_Address, 0x28);
x = ((xMSB << 8) | xLSB);
byte yMSB = readRegister(L3G4200D_Address, 0x2B);
byte yLSB = readRegister(L3G4200D_Address, 0x2A);
y = ((yMSB << 8) | yLSB);
byte zMSB = readRegister(L3G4200D_Address, 0x2D);
byte zLSB = readRegister(L3G4200D_Address, 0x2C);
z = ((zMSB << 8) | zLSB);
}
void writeRegister(int deviceAddress, byte address, byte val) {
Wire.beginTransmission(deviceAddress); // začiatok prenosu do zariadenia
Wire.write(address); // poslanie adresy registra
Wire.write(val); // poslanie hodnoty na zápis
Wire.endTransmission(); // koniec prenosu
}
int readRegister(int deviceAddress, byte address){
int v;
Wire.beginTransmission(deviceAddress);
Wire.write(address); // registracia na citanie
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1); // načítanie bytu
while(!Wire.available()) {
// čakanie
}
v = Wire.read();
return v;
}
Uzivatelské rozhranie sme vytvorili v Processingu
void setup() {
size(200,200); // Veľkosť pozadia
println(Serial.list()[4]);
// Výber portu
port = new Serial(this, Serial.list()[4], 9600);
}
//Funkcia, ktorá vykresly farebné pozadie
void draw() {
// Na farbu su pouzite udaje zo serial portu.
background(r,g,b);
}
void serialEvent(Serial port) {
// Údaje zo serial portu sú načítané zo serialEvent()
String input = port.readStringUntil(lf);
if(input!=null){
println(input);
int[] vals = int(splitTokens(input, ","));
if(vals[0]<0){
vals[0]=0;
}
if(vals[1]<0){
vals[1]=0;
}
if(vals[2]<0){
vals[2]=0;
}
r = vals[0]/100;
g = vals[1]/100;
b = vals[2]/100;
println( "R:" + r);
println( "G:" + g);
println( "B:" + b);
}
Kompletný zdrojový kód: cube.pde a gyroskop.ino
Overenie
Výsledný program slúži na menenie pozadia na základe x,y,z polohy akcelerometra, kde každá zložka polohy predstavuje zložku farby v RGB. X reprezentuje R, Y reprezentuje G a Z reprezentuje B, pričom sa berú do úvahy len kladné hodnoty s upraveným vzorkovaním.