Operácie

Dvojosí MEMS akcelerometer: Rozdiel medzi revíziami

Z SensorWiki

(Algoritmus a program)
 
(14 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 19: Riadok 23:
  
  
 
[[Médiá:MojZdrojak.c]]
 
  
  
Riadok 50: Riadok 52:
 
*SPI (10 MHz)
 
*SPI (10 MHz)
  
* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
 
* obrázok zapojenia vývodov použitej súčiastky
 
* odkaz na katalógový list
 
* priebehy dôležitých signálov
 
* este jedna polozka
 
 
== Popis riešenia ==
 
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
+
=== Popis riešenia ===
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.
 
  
'''Schéma zapojenia snímača'''
 
[[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
+
'''Schéma zapojenia MEMS akcelerometra k arduinu'''
nahrať už aspoň 10 študentov.
+
[[Súbor:SchemaZap.png|700px]]
 
+
[[Súbor:GyroskopCurcuit.jpg|700px]]
[[Súbor:MojObrazok.jpg|center|250px]]
 
  
 
=== 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.
 
 
 
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
 
  
 
<source lang="c">
 
<source lang="c">
Riadok 94: Riadok 80:
 
Serial.println("starting up L3G4200D");
 
Serial.println("starting up L3G4200D");
 
setupL3G4200D(2000); // Nastavenie L3G4200 na 2000 deg/sec
 
setupL3G4200D(2000); // Nastavenie L3G4200 na 2000 deg/sec
 +
 +
delay(1500); //čakanie, kým je senzor pripravený
 +
}
 
</source>
 
</source>
 
<source lang="c">
 
<source lang="c">
 
void loop(){
 
void loop(){
getGyroValues(); // Update hodnoty x, y, and z
+
getGyroValues(); // Update hodnoty x, y, a z
  
  
Riadok 106: Riadok 95:
 
Serial.println(z);
 
Serial.println(z);
  
delay(100); //Delay aby boli hodnoty citatelnejsie
+
delay(100); //Delay aby boli hodnoty čitatelnejsie
 
}
 
}
/*funkcia na ziskatie aktualnych suradnic x,y,z*/
+
/*funkcia na získanie aktuálnych súradníc x,y,z*/
 
void getGyroValues(){
 
void getGyroValues(){
  
Riadok 124: Riadok 113:
 
}
 
}
 
</source>
 
</source>
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
 
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
<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){
  
[[Médiá:MojProgram.c|program.c]]
+
int v;
 +
Wire.beginTransmission(deviceAddress);
 +
Wire.write(address); // registracia na citanie
 +
Wire.endTransmission();
  
=== Overenie ===
+
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>
  
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...