Ovládanie aplikácie cez gesture senzor Si1143
Zo stránky SensorWiki
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.
![](/sensorwiki/images/thumb/3/37/Parallax_Si1143.jpg/300px-Parallax_Si1143.jpg.png)
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:
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:
![](/sensorwiki/images/b/bb/ZapojenieSi.png)
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.
![](/sensorwiki/images/3/33/BitTimingI2C.png)
![](/sensorwiki/images/7/78/Priebeh_meraneho_svetla.png)
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.
![](/sensorwiki/images/5/53/Hra_screen_final1.png)
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.
![](/sensorwiki/images/9/9b/VyvojovyDiagramProgramu.png)
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.