Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Bez shrnutí editace | |||
| (23 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] | [[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.