Operácie

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.
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:

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 hodnoty zo snímačov
PARAM_RD Register slúžiaci na čitanie dát zo senzora
PARAM_WR Register slúžiaci na na zápis do RAM

+++V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje, done +++ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:

+++* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.) +++* obrázok zapojenia vývodov použitej súčiastky done

+++* priebehy dôležitých signálov +++* este jedna polozka

Popis riešenia

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.


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


Obr. 3. Náhľad do hry


Algoritmus a program

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.


Obr. 4. Vývojový diagram 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.