Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(4 medziľahlé úpravy od jedného ďalšieho používateľa nie sú zobrazené) | |||
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 51: | Riadok 55: | ||
=== Popis riešenia === | === Popis riešenia === | ||
'''Schéma zapojenia MEMS akcelerometra k arduinu''' | '''Schéma zapojenia MEMS akcelerometra k arduinu''' | ||
[[Súbor:SchemaZap.png|700px]] | [[Súbor:SchemaZap.png|700px]] | ||
[[Súbor:GyroskopCurcuit.jpg|700px]] | [[Súbor:GyroskopCurcuit.jpg|700px]] | ||
=== Algoritmus a program === | === Algoritmus a program === | ||
Program bol napísaný v jazyku C a otestovaný v Arduinou IDE. | 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"> | <source lang="c"> | ||
Riadok 82: | Riadok 80: | ||
Serial.println("starting up L3G4200D"); | Serial.println("starting up L3G4200D"); | ||
setupL3G4200D(2000); // Nastavenie L3G4200 na 2000 deg/sec | setupL3G4200D(2000); // Nastavenie L3G4200 na 2000 deg/sec | ||
delay(1500); //čakanie, kým je senzor pripravený | |||
} | |||
</source> | </source> | ||
<source lang="c"> | <source lang="c"> | ||
Riadok 94: | Riadok 95: | ||
Serial.println(z); | Serial.println(z); | ||
delay(100); //Delay aby boli hodnoty | delay(100); //Delay aby boli hodnoty čitatelnejsie | ||
} | } | ||
/*funkcia na | /*funkcia na získanie aktuálnych súradníc x,y,z*/ | ||
void getGyroValues(){ | void getGyroValues(){ | ||
Riadok 115: | Riadok 116: | ||
<source lang="c"> | <source lang="c"> | ||
void writeRegister(int deviceAddress, byte address, byte val) { | void writeRegister(int deviceAddress, byte address, byte val) { | ||
Wire.beginTransmission(deviceAddress); // | Wire.beginTransmission(deviceAddress); // začiatok prenosu do zariadenia | ||
Wire.write(address); // poslanie adresy registra | Wire.write(address); // poslanie adresy registra | ||
Wire.write(val); // poslanie hodnoty na | Wire.write(val); // poslanie hodnoty na zápis | ||
Wire.endTransmission(); // koniec prenosu | Wire.endTransmission(); // koniec prenosu | ||
} | } | ||
Riadok 128: | Riadok 129: | ||
Wire.endTransmission(); | Wire.endTransmission(); | ||
Wire.requestFrom(deviceAddress, 1); // | Wire.requestFrom(deviceAddress, 1); // načítanie bytu | ||
while(!Wire.available()) { | while(!Wire.available()) { | ||
// | // čakanie | ||
} | } | ||
Riadok 143: | Riadok 144: | ||
<source lang="c"> | <source lang="c"> | ||
void setup() { | void setup() { | ||
size(200,200); // | size(200,200); // Veľkosť pozadia | ||
println(Serial.list()[4]); | println(Serial.list()[4]); | ||
// | // Výber portu | ||
port = new Serial(this, Serial.list()[4], 9600); | port = new Serial(this, Serial.list()[4], 9600); | ||
} | } | ||
//Funkcia | //Funkcia, ktorá vykresly farebné pozadie | ||
void draw() { | void draw() { | ||
// Na farbu su pouzite udaje zo serial portu. | // Na farbu su pouzite udaje zo serial portu. | ||
Riadok 160: | Riadok 160: | ||
void serialEvent(Serial port) { | void serialEvent(Serial port) { | ||
// | // Údaje zo serial portu sú načítané zo serialEvent() | ||
String input = port.readStringUntil(lf); | String input = port.readStringUntil(lf); | ||
Riadok 188: | Riadok 188: | ||
=== Overenie === | === 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) |
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
![](/sensorwiki/images/thumb/3/36/Parallax_L3G4200D.jpg/300px-Parallax_L3G4200D.jpg.png)
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.