KKM: APDS-9960

Početnik si s Dasduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala tvrtke soldered na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Dasduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.
UVOD
U ovome tutorijalu, upoznat’ ćemo se s APDS-9960 digitalnim senzorom blizine, količine svjetla u prostoru, boja i gesti. Kontrola gesti omogućuje nam da se detektira pokret ruke u lijevu ili desnu stranu, te gore ili dolje, kao i neke kompleksnije geste poput udaljavanje ruke od senzora prema gore ili pak približavanje ruke prema senzoru. Zbog svojih dimenzija, mogućnosti i potrošnje, primjenu je našao u mobitelima kao senzor detekcije blizine da se prilikom korisnikovog javljanja na mobitel onemogući touchscreen (a samim time i slučajni dodiri na zaslonu), snimi sliku zaslona pokretom ruke i sl. No, za početak promotrit’ ćemo neke karakteristike senzora kao i sam izgled senzora.
Karakteristike senzora:
• Napon napajanja: 5 VDC (header), 3.3 VDC (easyC)
• Napon na ulazima SDA i SCL: 0.8 VDC – 3.6 VDC
• Napon LED diode u senzoru: 3 VDC – 4.5 VDC
• Struja senzora: 1 – 10 uA Sleep Mode, 38 uA Stanje čekanja, 790 uA Očitavanje blizine i geste
• Struja LED diode u senzoru: 12.5 mA – 100 mA
• Vrsta komunikacije: I2C (Two Wire)
• Maksimalna frekvencija I2C-a: 400 kHz
• Dimenzije modula: 38 x 22 mm
KAKO MODUL RADI?
Senzor na modulu je sastavljen od dva dijela; samog senzora i LED diode koja služi za određivanje blizine predmeta. U samom senzoru se nalaze četiri foto diode koje služe za detekciju geste (postavljene su na način da uspješno detektiraju pokret ruke u različitim smjerovima) i četiri foto diode koje služe za detekciju boje i intenziteta svjetla.
Svaka od tih četiri foto diode za boju mjeri intenzitet svjetla određenog opsega valnih duljina, pa tako imamo foto diodu za crvenu, zelenu i plavu boju što je izvedeno na način se da ispred foto diode nalazi određeni filtar boje. Zadnja foto dioda je čista, sadrži samo infracrveni i UV filtar, te detektira cijeli spektar boje koje foto diode za crvenu, zelenu i plavu boju detektiraju zajedno. Ona služi za određivanje intenziteta svjetla koje dolazi na senzor. Na slici dolje, vidljivo je koji spektar boja pojedinačna foto dioda detektira.
Detektiranje geste se bazira na tome da se promatra koliki se intenzitet svjetlosti infracrvene diode ugrađene u senzor reflektira nazad u foto diode za detekciju geste. Na slici ispod je vidljivo kako se prepoznaje određeni pokret. U, L, D, R predstavlja foto diode za detekciju geste. Ukoliko se prvo detektirala blizina predmeta na D foto diodi, zatim na L i R i s sličim countom (intenzitetom), te zatim na kraju na U diodi, to bi značilo da se dogodio pokret prema dolje.
Kod detekcije geste može se podesiti da se na INT pinu javi promjena stanja pri detekciji neke od gesti, no također se može isto to omogućiti za detekciju prepreke (predmeta), te bi nam u tom slučaju to senzor preko INT pina dojavio. To omogućava da se obavi neka vrlo brza i vrlo bitna operacija u kodu koristeći prekide (Interrupts).
KAKO POVEZATI?
Način na koji će biti povezani Dasduino i naš senzor biti će opisan u nastavku. Ukoliko se odlučite na povezivanje preko headera koje ima na sebi, imajte na umu da je potrebno dovesti 5 VDC na pozitivni pin. Ako pak želite izbjeći mogućnosti pogreške prilikom spajanja (odlučili ste se za easyC), jednostavno ćete senzorsku pločicu povezati kablićem s Dasduinom. Napon easyC sustava je 3.3 VDC.
ARDUINO KOD
Kako bi si olakšali programiranje i korištenje ovoga modula, koristiti ćemo gotovu biblioteku za upravljanje ovim modulom. Biblioteka se može pronaći ovdje. Ukoliko ne znate kako instalirati biblioteku, pročitajte naš tutorijal.
Ovdje ćemo prikazati kako se koristi senzor geste.
#include "Wire.h" //Dodavanje Wire biblioteke
#include "SparkFun_APDS9960.h" //Dodavanje biblioteke senora
#define APDS9960_INT 2 //Definiranje Croduino pina na koji ce biti spojen INT pin sa senzora (mora biti Interrupt pin)
SparkFun_APDS9960 apds = SparkFun_APDS9960();
//Konstruktor za nasu biblioteku da bi imali pristupa funkcija koje upravaljanju senzorom
int
isr_flag = 0;
//Varijabla koja sluzi kao zastavica da znamo da je detektirana neka gesta
void
setup
() {
//Postavljamo pin na Croduinu na ulaz. Na taj pin spajamo INT pin sa senzora.
pinMode
(APDS9960_INT,
INPUT
);
Serial.begin(9600);
//Inicijalizacija serijske komunikacije i postavljanje brzine komunikacije (9600 bauda)
Serial.println();
//Ispis poruke da znamo da je komunikacija izmedju racunala i Croduina u redu
Serial.println(F(
"**********Test APDS-99600 Senzora – Senzor geste**********"
));
//Podesavanje prekidne rutine. Ukoliko se dogodi da se na pinu broj 2 na Croduinu
//detektira pad sa logicke jedinice na logicku nulu, prekida se glavni program i "skace" se na funkciju "detekcijaGeste()"
attachInterrupt
(0, detekcijaGeste, FALLING);
//Inicijalizacija biblioteke za senzor i provjera da li je senzor uopce spojen na Croduino
if
( apds.init() ) {
Serial.println(F(
"Inicijalizacija biblioteke za APDS-9960 senzor je uspjesna!"
));
}
else
{
Serial.println(F(
"Inicijalizacija biblioteke je neuspjesna. Senzor nije pronadjen. Provjeri spojeve!"
));
}
//Ako je inicijalizacija bila uspjesna, pokreni senzor
if
( apds.enableGestureSensor(
true
) ) {
Serial.println(F(
"Senzor geste je pokrenut i aktivan. Napravi neku gestu. :)"
));
}
else
{
Serial.println(F(
"Nije moguce pokrenuti senzor za gestu... :("
));
}
}
void
loop
() {
if
( isr_flag == 1 ) {
//Ako je gesta detektirana, isr_flag ce biti postavljena na 1.
detachInterrupt
(0);
//Nemoj vise detektirati geste, da bi se mogla ocitati trenutna gesta.
gesta();
//Ocitaj trenutnu gestu
isr_flag = 0;
//Vrati nazad zastavicu na 0, sto bi znacilo da se gesta jos nije dogodila.
attachInterrupt
(0, detekcijaGeste, FALLING);
//Ponovo postavi detekciju geste sada kada je Croduino procito o kojoj se gesti radilo.
}
}
void
detekcijaGeste() {
//Ukoliko je INT pin pao s logicke jedinice na logicku nulu, to znaci da je senzor ocitao neku gestu, pa je u glavnom programu ocitaj.
isr_flag = 1;
}
void
gesta() {
//Ovdje ocitavamo gestu s senzora i ispisujemo o kojoj gesti se radilo.
if
( apds.isGestureAvailable() ) {
Serial.print(
"Detektirana gesta: "
);
switch
( apds.readGesture() ) {
case
DIR_UP:
Serial.println(
"Gore"
);
break
;
case
DIR_DOWN:
Serial.println(
"Dolje"
);
break
;
case
DIR_LEFT:
Serial.println(
"Lijevo"
);
break
;
case
DIR_RIGHT:
Serial.println(
"Desno"
);
break
;
case
DIR_NEAR:
Serial.println(
"Blizu"
);
break
;
case
DIR_FAR:
Serial.println(
"Daleko"
);
break
;
default
:
Serial.println(
"Ne moze se odrediti."
);
}
}
}
U daljnjem kodu, vidjet’ ćemo kako se upotrebljava senzor za očitavanje razine crvene, zelene i plave bolje (RGB).