Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami
Zo stránky SensorWiki
Vytvorená stránka „{| |Autori: || '''Ján Mrkvička, Jozef Kuleha''' |- |Študijný odbor: || Aplikovaná mechatronika || 2. Ing. ('''2013''') |} == Zadanie == # Sem príde tex…“ |
Bez shrnutí editace |
||
(28 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: || ''' | |Autori: || '''Matej Furmánek, Ľubomír Halač''' | ||
|- | |- | ||
|Študijný odbor: || Aplikovaná mechatronika || | |Študijný odbor: || Aplikovaná mechatronika a elektromobilita || 1. Ing. ('''2019''') | ||
|} | |} | ||
== Zadanie == | == '''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 | |||
[[Súbor:Parallax L3G4200D.jpg|center|300px]] | |||
'''Literatúra:''' | '''Literatúra:''' | ||
* | * [https://www.parallax.com/sites/default/files/downloads/27911-L3G4200D-Gyroscope-Manufacturer-Datasheet.pdf Senzor datasheet] | ||
* [http://www.theorycircuit.com/gyroscope-l3g4200d-arduino-schematic/ Zapojenie k arduino] | |||
== '''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 == | == '''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 === | |||
[[Súbor: | '''Schéma zapojenia MEMS akcelerometra k arduinu''' | ||
[[Súbor:SchemaZap.png|700px]] | |||
[[Súbor:GyroskopCurcuit.jpg|700px]] | |||
=== Algoritmus a program === | === 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) |
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.