Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace  | 
				Bez shrnutí editace  | 
				||
| (20 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 8: | Riadok 12: | ||
Využite dvojosí MEMS akcelometer L3G4200D na vytvorenie aplikácie ktorá bude podľa zmeny súradníc akcelometra meniť barvu pozadia programu.     | 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]]  | [[Súbor:Parallax L3G4200D.jpg|center|300px]]  | ||
| Riadok 19: | Riadok 28: | ||
* [https://www.parallax.com/sites/default/files/downloads/27911-L3G4200D-Gyroscope-Manufacturer-Datasheet.pdf Senzor datasheet]  | * [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]  | * [http://www.theorycircuit.com/gyroscope-l3g4200d-arduino-schematic/ Zapojenie k arduino]  | ||
== '''Komponenty''' ==  | == '''Komponenty''' ==  | ||
| Riadok 28: | Riadok 36: | ||
* Prepojovacie kábliky  | * Prepojovacie kábliky  | ||
* Software - Arduino IDE  | * 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.