Operácie

Ovládanie aplikácie cez gesture senzor Si1143

Z SensorWiki

Verzia z 12:22, 24. máj 2016, ktorú vytvoril StudentDVPS (diskusia | príspevky) (Popis snímača)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Autori: Matúš Rus, Matej Cehula
Študijný odbor: Aplikovaná mechatronika a elektromobilita
Ročník: 1. Ing. (2015/2016)



Zadanie

Navrhnite ovládanie vybranej aplikácie cez gesture sensor Si1143 (Parallax).

Treba popísať ako senzor funguje, čo všetko sa ním dá merať, pripojiť ho k procesoru a vymyslieť ukážkovú aplikáciu.

  • 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
  • Dokumentáciu odovzdajte prostredníctvom tejto wiki stránky.
Parallax Si1143.jpg
Obr. 1. Senzor Si1143 (Parallax)



Literatúra:

Analýza

V našom projekte sme si vybrali proximitny snímač Parallax Si1143. Na tom snímači chceme demonštrovať použitie proximitného snímača na detekciu prstu pred konkrétnou LEDkou( resp. snímačom senzoru). Tento snímač nie je vhodný na presnú detekciu pozície ruky alebo prsta v priestore, skôr na detekciu hrán. Snímač vie dobre zachytiť kedy a z ktorej strany objekt vstúpil do jeho zorného poľa a takisto kedy jeho zorné pole opustil. Najlepšia detekčná zóna je v rozsahu 50-2 cm pred snímačom. V naśom projekte sa budeme snažiť zistiť pred ktorým konkrétnym snímačom sa objekt(v naśom prípade prst) bude nachádzať a vyhodnotiť úspešnosť a čas za aký sa nám podarilo dosiahnuť vybratú LEDku.

Popis snímača

Vlastnosti snímača:

  • Napájacie napätie: <3-5.5>
  • Maximalny prúd: 4mA
  • Komunikačná zbernica: I2C
  • Rozmer: 5.08 x 5.79 x 0.48 cm
  • Operačná teplota: -40 do 85 °C
  • Vzorkovacia perióda: 100 snímkov/sekundu

Popis práce snímaća:

  • Snímač je vybavený foto diódami na zachytávanie viditeľného a odrazeného svetla. Snímač obsahuje 3 takéto diódy ktoré sa zapínajú postupne nie naraz, čo umožnuje zistiť pre každú diódu koľko svetla zachytila. Hlavné výhody tohto snímača sú:
  • 1- nízka spotreba (snímač dokáže zostať v spánkovom režime väčšinu času zbytok času je v "pulzovacom režime" kedy sa LEDky zapnú len na veľmi krátku dobu)
  • 2- dobrá filtrácia šumu vstupného signálu (Snímače pracujú v 2 krokoch, v prvom sa snímač zapne bez spustenia prisvetlovacej LED diódy a zmeria hodnotu svetla v okolí uloží hodnotu a následne zmeria hodnotu odrazeného svetla so zapnutou prisvetlovacou LED diódou. Celé toho meranie trvá krátko približne 25.6 μs )


Popis vývodov snímača:

Si1143vyvody.png

C Pin Typ Funkcia
1 GND Napájanie Zem
2 VIN Napájanie Napájacie napätie
3 INT Výstup Prerušenie(nepripojené)
4 SCL Vstup I2C hodinová linka
5 SDA Vstup/Výstup I2C dátová linka

Popis doležitých registrov snímača:

Nazov Funkcia
COMMAND REGISTER Register na zadávanie požadovanej funkcie senzora
RESPONSE REGISTER Register obsahujúci chybove upozornenia
PARAM_RD Register slúžiaci na čitanie dát zo senzora
PARAM_WR Register slúžiaci na na zápis do RAM

Zapojenie snimaca:

ZapojenieSi.png
Obr. 2. Schéma zapojenia snímača

I2C komunikacia:

Senzor moze byt nastaveny do Autonomneho rezimu, alebo do Prikazoveho rezimu tzv. Forced measuremet.

  • Prikazovy rezim:

Ked je senzor v prikazovom rezime, senzor nevykonava ziadne merania bez ziadosti od strany programatora pomocou specialneho prikazu inicializacie. CHLIST parameter sa musi zapisat do senzora aby senzor vedel ze ma vykonat meranie. Ked je senzor nastaveny do prikazoveho rezimu, do parametru MEAS_RATE sa vlozi 0 cim sa senzoru zabrani vykonat akekolvek meranie bez prikazu zo strany programatora.

  • Autonomny rezim:

Senzor je nastaveny do autonomneho rezimu ked hodnota v MEAS_RATE je nenulova, potom tato hodnota reprezentuje cas interval v ktorom sa senzor zobudza na meranie. Akonahle sa senzor zobudi na meranie, vykonaju sa 3 proximitne merania pre kazdy senzor (PS1, PS2, PS3) v poradi ALS_VIS, ALS_IR and AUX co znamena ze senzor najprv zmeria hodnotu okoliteho svetla, potom hodnotu odrazeneho svetla a nakoniec urobi rozdiel z tychto hodnot. Na zabranenie toho aby sa vykonali vsetky tri sucastne, su k dispozici dva casovace PS_RATE a ALS_RATE, ktore urcuju ktora LED sa kedy spusti, po vyprsani PS_RATE sa spusti meranie LEDky ktora je nastavena v CHLIST(channel list). Po skonceni vsetkych merani sa mikrocontroler vrati do spacieho rezimu az kym sa nezobudi na dalsie meranie podla MEAS_RATE.

  • Programovacia sekvencia

Aby sme mohli zadat prikaz musime vykonat nasledujucu sekvenciu krokov:

  • 1- Do registra COMMAND zapiseme hodnotu 0x00 aby sme vycistili RESPONSE register
  • 2- Overit ze RESPONSE register obsahuje 0x00
  • 3- Zapisat konkretny prikaz do COMMAND registru*
  • 4- Overit ze RESPONSE register je nenulovy ak je v nom stale nulova hodnota tak opakujeme predchadzajuci krok.

*kompletny zoznam prikazov najdete na stranach 23-25 na tomto odkaze v tabulke 5.

BitTimingI2C.png
Datovy diagram I2C komunikacie
Priebeh meraneho svetla.png
Priebeh meraneho svetla: cervena- odrazene IR svetlo, zelena-okolite viditelne svetlo

Popis riešenia

Teoreticky popis programu

Najprv sme si naštudovali základne funkcie senzora Si1143. Ako senzor funguje, ako ho treba zapojiť a pod. Začali sme písať zdrojový kód. Po napísaní základného kódu sme si overili či sme senzor dobre zapojili a či funguje správne. Zistili sme senzor nie je taký presný ako sme čakali. Prvý nápad bol aby senzor kopíroval náš prst a podľa jeho pohybu vykresľoval čiaru. Senzor zvláda len základne gestá napr. prejdenie rukov hore, dole, doprava a pod. Po zvážení sme si vymysleli novú hru VYBER LED. V programe sme si odfiltrovali údaje a tak zistili kde sa prst nachádza. Program je taktiež náchylný na vzdialenosť a musíme si dávať pozor aby sme inými časťami tela nezakrývali LEDky.


Hra screen final1.png
Obr. 3. Náhľad do hry

Vyvojovy diagram programu

Náš software sme navrhli vo vývojovom prostredí Arduino, kde sme využili znalosti z programovaného jazyka C/C++. V našom algoritme sme využili dva stupne filtrácie vstupného signálu, na presnejšie určenie vybratej LED. Vizuálnu časť nášho zadania sme takisto riešili v tomto vývojovom prostredí a síce iba jednoduchým výpisom do programovacieho okna, nakoľko naša zručnosť s vizualizácia je nízka.


VyvojovyDiagramProgramu.png
Obr. 4. Vývojový diagram programu

Algoritmus programu

Časť 1. Zadefinovanie premenných

/* Si1143 Example */


#define sleep  100
#include <Wire.h>
#include "Si1143.h";

int bias1,bias2,bias3;
unsigned int PS1,PS2,PS3;
int blinktime,counter,counter1,counter2,Ledposition;
unsigned int Light_Reading;
byte LowB,HighB;
bool selected;
unsigned long time;

Časť 2.Funkcia setup

void setup()
{
  Serial.begin(9600);
  delay(25);
  Wire.begin(); // join i2c bus (address optional for master)
  delay(25);
 
  write_reg(HW_KEY, 0x17); // Setting up LED Power to full
  write_reg(PS_LED21,0xFF);
  write_reg(PS_LED3, 0x0F);
  param_set(CHLIST,0b00010111);
 
  char parameter = read_reg(PARAM_RD,1);
  delay(1000);
 
  bias();
 
  counter = 0;
  counter1 = 0;
  counter2 = 0;
  selected = 0;
  StartGame();
}


Časť 3. Funkcia vykonávajúca filtráciu signálu a vyhodnocovanie hry

void do_magic(){
  
  
 
  diff1 = PS1-PS1_old;
  diff2 = PS2-PS2_old;
  diff3 = PS3-PS3_old;
  diff1=abs(diff1);
  diff2=abs(diff2);
  diff3=abs(diff3);
  
  PS1_old=PS1;
  PS2_old=PS2;
  PS3_old=PS3;
 
  
  
  if(diff1>diff2 && diff1 >diff3){
     if(sum2>0 || sum3 >0){
      sum2=0; sum3=0;
    }
    sum1=sum1+1;   
    
  }else if(diff2> diff1 && diff2 >diff3){
     if(sum1>0 || sum2 >0){
      sum1=0; sum3=0;
    }
    sum2=sum2+1;
    
  }else if(diff3>diff1 && diff3>diff2){    
    if(sum1>0 || sum2 >0){
      sum1=0; sum2=0;
    }
    sum3=sum3+1;
  }
if(sum1>0 || sum2>0 || sum3 > 0){
  if(sum1>4 && rand1==1){
    Serial.println("vybrata je LED1");
    sum1=0;
    succes=true;
    Serial.println("Vyhra");
  }
   if(sum2>4 && rand1==2){
    Serial.println("vybrata je LED2");
    sum2=0;
    succes=true;
    Serial.println("Vyhra");
  }
   if(sum3>4 && rand1==3){
      Serial.println("vybrata je LED3");
      sum3=0;
      succes=true;
      Serial.println("Vyhra");
  }
   if(succes){
  rand1=random(1,4);
  
  if(rand1>=1 && rand1<2){
    rand1=1;
  }else if(rand1>=2 && rand1<3){
    rand1 =2;
  }else{
    rand1=3;
  }
  
  time = millis();
  aktual=time-timing;
  timing=time;
  switch(rand1){
  case 1:
    Serial.println("Priloz prst k LED cislo 1");
   break;
   case 2:
    Serial.println("Priloz prst k LED cislo 2");
  break;  
   case 3:
    Serial.println("Priloz prst k LED cislo 3");
  break;
  
  }
   Serial.print("Time: ");
   Serial.println(aktual);
   succes=false;
  }
}
delay(10);
}

Časť 5. Vypis úvodneho zobrazenia programu

void StartGame(){
Serial.println("                            HRA: VYBER LED                ");
Serial.println("CIEL: Priloz prst co najrychlejsie k spravnej LEDke senzora podla  zobrazenia na monitore");
Serial.println("INSTRUKCIE: Rozlozenie LEDiek na snimaci:");
Serial.println("        LED2");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("        LED1 -------------------- LED3 ");
Serial.println(" ");
Serial.println("Hra zacne prilozenim prstu k  LED3 na senzore ");

}


Zdrojový kód: Si1143.h, Si1143.c, main.c

Záver

Naša hra sa volá jednoducho a výstižne "VYBER LED". Ciel tejto hry je priložiť prst k správnej LEDke senzora podľa zobrazenia na monitore. Led sa nachádza na každom rohu našého senzora v tvare L vid obrázok vyššie. Hra začne keď priložíte prst k LED3. Takto program počká aby ste si naštudovali návod a pochopili hru. Ak ste pripravený priložíte prst a čas vám beží. Program náhodne generuje LED1, LED2 alebo LED3. Po priložení Vám vypíše čas v milisekundách za aký ste to stihli.