Operácie

Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami

Z SensorWiki

(Zadanie)
 
(21 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]]
  
  
 
[[Médiá:MojZdrojak.c]]
 
  
  
Riadok 20: Riadok 29:
 
* [http://www.theorycircuit.com/gyroscope-l3g4200d-arduino-schematic/ Zapojenie k arduino]
 
* [http://www.theorycircuit.com/gyroscope-l3g4200d-arduino-schematic/ Zapojenie k arduino]
  
__TOC__
+
== '''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''' ==
  
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
+
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.
ktoré potrebné na úspešné vyriešenie projektu. Napríklad:
+
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í programovateľné používateľom za behu.
  
* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
+
'''Vlastnosti'''
* obrázok zapojenia vývodov použitej súčiastky
+
*Napájacie napätie: 3V - 5V
* odkaz na katalógový list
+
*Merací rozsah: 250 / 500 / 2000 dps
* priebehy dôležitých signálov
+
*Prevádzková teplota: -40°C až +85°C
* este jedna polozka
 
  
== Popis riešenia ==
+
'''Rozhrania'''
 +
*I2C (až do 400 kHz)
 +
*SPI (10 MHz)
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
 
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.
 
  
'''Schéma zapojenia snímača'''
+
=== Popis riešenia ===
[[Súbor:Zapojenie.png]]
 
  
[[Súbor:Example.jpg]]
 
  
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
 
nahrať už aspoň 10 študentov.
 
  
[[Súbor:MojObrazok.jpg|center|250px]]
+
'''Schéma zapojenia MEMS akcelerometra k arduinu'''
 +
[[Súbor:SchemaZap.png|700px]]
 +
[[Súbor:GyroskopCurcuit.jpg|700px]]
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
  
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.  
+
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.
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.  
+
 
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
+
<source lang="c">
 +
int L3G4200D_Address = 105;
 +
/*Nastavenie I2C adresy*/
 +
 
 +
int x;
 +
int y;
 +
int z;
 +
 
 +
void setup(){
 +
 
 +
Wire.begin();
 +
Serial.begin(9600);
  
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
+
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">
/* A nezabudnite zdroják hojne komentovať  */
+
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);
  
int main(void) {
+
byte zMSB = readRegister(L3G4200D_Address, 0x2D);
   
+
byte zLSB = readRegister(L3G4200D_Address, 0x2C);
    printf("Hello, World!\n");
+
z = ((zMSB << 8) | zLSB);
    return(0);
 
 
}
 
}
 
</source>
 
</source>
  
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
+
<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
 +
}
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
v = Wire.read();
 +
return v;
 +
}
 +
</source>
  
[[Médiá:MojProgram.c|program.c]]
+
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()
  
=== Overenie ===
+
  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>
  
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
+
Kompletný zdrojový kód: [[Médiá:cube.pde|cube.pde]] a [[Médiá:gyroskop.ino|gyroskop.ino]]
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
 
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,
 
odfotografujte ho.  
 
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
+
=== 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
Parallax L3G4200D.jpg



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 SchemaZap.png GyroskopCurcuit.jpg

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.

Späť na zoznam projektov...