Upload
gogo-p
View
213
Download
1
Embed Size (px)
DESCRIPTION
v
Citation preview
Vidljivi senzori
Infrared
LM393 analogni foto senzor
HC-SR501 senzor pokreta
TCS230-prepoznavanje boja
LM393
Dva diferencijalna pojaala
Ulazi: 2-36V
Napajanje 1-18V
LM393 A/D modul
Napajanje VCC 5V
GND
D0 Digitalni izlaz
signal nizak ako je vrijednost ispod
predodreene (trimer) i visok ako je iznad predodreene
A0 analogni izlaz
toan naponski signal 0-5V
Konkretan senzor kod nas spojen je foto dioda,
a moe biti bilo koja osjetljiva komponenta
LM393-foto
LM: VCC 5V : arduino
LM: GND GND: arduino
LM: A0 A0: arduino
LM: D0 D2: arduino
Pomiite trimer na ploici ime utjeete kada e se digitalni signal prebaciti (osjetljivost)
Trimer ne utjee na analognu vrijednost
int switch_state;
int LightAnalogValue;
void setup()
{
pinMode(LEDPIN, OUTPUT);
Serial.begin(9600);
}
void loop()
{
switch_state = digitalRead(2);
if (switch_state == LOW){
Serial.println("Digital Signal ON ");
}else{
Serial.println("Digital Signal OFF ");
}
LightAnalogValue = analogRead(14);
Serial.print("Analog Value (0 to 1023)");
Serial.println(LightAnalogValue,DEC);
delay(500);
}
Passive infrared sensor (PIR sensor)
Objekti koji su na temperaturi veoj od apsolutne nule emitiraju toplinsku energiju u formi radijacije
Nevidljivo ljudskom oku
NE emitira nikakvu energiju
Biljei energetski potpis objekta ispred njega
U jezgri je piroelektrini materijal koji biljei djelovanje vanjske energije
Passive infrared sensor (PIR sensor)
Biljei promjenu energije u polju,a time i pomak
Mora postojati gradijent promjene kako ne bi biljeio male objekte (muhu) ,a biljeio vee objekte (psa, ovjek).
Dva senzorna elementa su poveza preko diferencijalnog
pojaala
Na taj nain promjena u prostoru povienje temperature prostora nee biti otkrivena
Pojava novoga objekta nee jednako djelovati na oba senzora.
HC-SR501
4.5-20V
Logiki jedan: 3.3V ,
logika nula: 0V,
Dva moda kroz jumper:
L ne ponavljaj okida
Kada ga se okine, postavi 0 u 1 i dri vrijeme dranja, onda vraa u 0 i dri vrijeme blokiranja
H ponavljaj okida
Dri visoko za vrijeme pojave , nakon svake pojave dri uvijek odreeno vrijeme, nema prelaska u 0 do isteka zadnje pojave
Vrijeme dranja: 5-200sekundi (promijenjivo)
Vrijeme blokiranja pojave: 2.5sekundi
Kut djelovanja
HC-SR501
HC: GNDGND:Arduino
HC: 5V5V::Arduino
HC: PinD3 :Arduino
int analogPin = 3;
int val = 0;
void setup()
{
Serial.begin(9600); // setup serial
}
void loop()
{
val = analogRead(analogPin); // read the input pin
Serial.println(val); // debug value
delay(1000);
}
TCS230
Pretvorba svjetlosti u frekvenciju
Kombinira silikonske fotodiode sa pretvaraem frekvencije u struju
ip sadri 4x6, 8x8 ili 16x16 fotodioda.
Svaka fotodioda ima svoj filter
ima plavi filter
ima zeleni filter
ima crveni filter
nema filtera
Kroz intenzitet svijetlost fotodioda na razliite filtere mogue je odrediti boju.
Diode su ispomo da tonije osvjetle predmet
TCS230
Vdd 2.7 5V
OE omogui rad
OUT frekvencija
S0,S1 Skaliranje izlazne frekvencije
S2,S3 Odabire eljenih fotodioda
TCS230 - algoritam OE pin na nisko (omogui rad)
S0=1, S1=0 20% skaliranja vala
S2=0, S3=0 -> Crvena
Priekaj neko vrijeme
Izmjeri period pravokutnog vala na OUT, intenzitet crvene boje
S2=0, S3=1 -> Plava
Priekaj neko vrijeme
Izmjeri period pravokutnog vala na OUT, intenzitet plave boje
S2=1, S3=1 -> zelena
Priekaj neko vrijeme
Izmjeri period pravokutnog vala na OUT, intenzitet zelene boje
S2=1, S3=0 -> normalna
Priekaj neko vrijeme
Izmjeri period pravokutnog vala na OUT, intenzitet svjetlosti
TCS230
Spajanje:
TCS OUT D2: Arduino
TCS S0 D6 : Arduino
TCS S1 D5 : Arduino
TCS S2 D4 : Arduino
TCS S3 D3 : Arduino
TCS OE GND: Arduino (omoguen rad)
TCS VCC 5V : Arduino
TCS GND GND : Arduino
Kako izmjeriti vrijeme perioda pravokutnog
napona?
Odgovor moramo ui debelo u hardware sa kojim raspolaemo
Atmega328p ima ugraeni timer/counter koji emo upotrijebiti
Datasheet poglavlje 17 (uglavnom je potrebno cijelo proitati)
Ili koristiti timerOne library
TimerOne library
Timer1 na Atmelu: 16MHz
Max Period = (Prescale)*(1/Frequency)*(2^17) Time per Tick = (Prescale)*(1/Frequency)
Library koristi D9 i D10
Timer.initialize(mikrosekunde)
Inicijalizacija timera (default 1s)
Timer.setperiod(mikrosekunde)
Minimum period=1 (1MHz), maksimum=8388480 (8.3sek)
Timer.pwm(pin,duty,period)
Generira pravokutni signal na pinu (D9 ili D10), duty=0-1023,opcionalno period u mikrosekundama
Timer.attachinterrupt(funkcija,period)
Zove funkciju nakon intervala u mikrosekundama. Prekid ne smije biti sloen da ne bi bio ponovno pozvan jer se nikada nee zavriti u main petlji ako se prekidi samo zovu.
Timer.setPwmDuty(pin,duty)
Postaviti duty za pin
Timer.detachInterrupt(), Timer.disablePwm(pin) i Timer.read() (vrijeme od zadnjeg preljeva timera)
PrescaleTime per counter
tickMax Period
1 0.0625 uS 8.192 mS
8 0.5 uS 65.536 mS
64 4 uS 524.288 mS
256 16 uS 2097.152 mS
1024 64uS 8388.608mS
TCS230 kako mjerimo Postavimo prekid na D2 (na D2 smo spojili out od senzora)
attachInterrupt(0, TSC_Count, RISING);
U funkciji prekida zbrajamo varijablu na svaku promjenu napona (pola periode) void TSC_Count(){ g_count ++ ; }
Inicijaliziramo timer (1sek)
Svake sekunde ulazimo u provjeru to smo prikupili Timer1.attachInterrupt(TSC_Callback);
Prvi puta pokreemo crvenu,
drugi puta itamo crvenu (pamtimo) i pokreemo zelenu
Trei puta itamo zelenu (pamtimo) i pokreemo plavu
etvrti puta itamo plavu (pamtimo) i pokreemo bez filtera
Peti puta i dalje iskaemo jer ekamo da nas u glavnoj petlji resetiraju
Loop petlja resetira varijablu na poetak mjerenja ispie vrijednosti i nakon toga eka 4 sekunde (oekivano e timer odraditi puni ciklus)
#include
#define S0 6 // Please notice the Pin's define
#define S1 5
#define S2 4
#define S3 3
#define OUT 2
int g_count = 0; // count the frequecy
int g_array[3]; // store the RGB value
int g_flag = 0; // filter of RGB queue
float g_SF[3]; // save the RGB Scale factor
void TSC_Init()
{
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
digitalWrite(S0, LOW); // OUTPUT FREQUENCY SCALING 2%
digitalWrite(S1, HIGH);
}
// Select the filter color
void TSC_FilterColor(int Level01, int Level02)
{
if(Level01 != 0)
Level01 = HIGH;
if(Level02 != 0)
Level02 = HIGH;
digitalWrite(S2, Level01);
digitalWrite(S3, Level02);
}
void TSC_Count()
{
g_count ++ ;
}
void TSC_Callback()
{
switch(g_flag)
{
case 0:
Serial.println("->WB Start");
TSC_WB(LOW, LOW); //Filter without Red
break;
case 1:
Serial.print("->Frequency R=");
Serial.println(g_count);
g_array[0] = g_count;
TSC_WB(HIGH, HIGH); //Filter without Green
break;
case 2:
Serial.print("->Frequency G=");
Serial.println(g_count);
g_array[1] = g_count;
TSC_WB(LOW, HIGH); //Filter without Blue
break;
case 3:
Serial.print("->Frequency B=");
Serial.println(g_count);
Serial.println("->WB End");
g_array[2] = g_count;
TSC_WB(HIGH, LOW); //Clear(no filter)
break;
default:
g_count = 0;
break;
}
}
void TSC_WB(int Level0, int Level1) {
g_count = 0;
g_flag ++;
TSC_FilterColor(Level0, Level1);
Timer1.setPeriod(1000000); // set 1s period
}
void setup()
{
TSC_Init();
Serial.begin(9600);
Timer1.initialize(); // defaulte is 1s
Timer1.attachInterrupt(TSC_Callback);
attachInterrupt(0, TSC_Count, RISING);
delay(4000);
for(int i=0; i