Operácie

Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami

Z SensorWiki

(Vytvorená stránka „{| |Autori: || '''Ján Mrkvička, Jozef Kuleha''' |- |Študijný odbor: || Aplikovaná mechatronika || 2. Ing. ('''2013''') |} == Zadanie == # Sem príde tex…“)
 
 
(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:      || '''Ján Mrkvička, Jozef Kuleha'''  
+
|Autori:      || '''Matej Furmánek, Ľubomír Halač'''  
 
|-
 
|-
|Študijný odbor:  || Aplikovaná mechatronika || 2. Ing.  ('''2013''')  
+
|Študijný odbor:  || Aplikovaná mechatronika a elektromobilita || 1. Ing.  ('''2019''')  
 
|}
 
|}
  
== Zadanie ==
+
== '''Zadanie''' ==
  
# Sem príde text zadania...
+
Využite dvojosí MEMS akcelometer L3G4200D na vytvorenie aplikácie ktorá bude podľa zmeny súradníc akcelometra meniť barvu pozadia programu.
# Druhy '''riadok'''
 
  
[http://www.example.com link title]
+
=== Ú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:MojObrazok2.jpg|center|300px]]
 
  
[[Médiá:MojZdrojak.c]]
 
  
  
 
'''Literatúra:'''  
 
'''Literatúra:'''  
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
+
* [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]
  
__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
  
int main(void) {
+
 
   
+
Serial.print(x);
    printf("Hello, World!\n");
+
Serial.print(",");
    return(0);
+
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>
  
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();
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
Wire.requestFrom(deviceAddress, 1); // načítanie bytu
 +
 
 +
while(!Wire.available()) {
 +
// čakanie
 +
}
 +
 
 +
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 13: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...