fotodiodă, fototranzistor și senzor IR cu Arduino
cuprins
descriere:
fotodiodă, fototranzistor și senzor IR cu Arduino– o fotodiodă este un dispozitiv care, atunci când este excitat de lumină, produce în circuit un flux proporțional de curent (și măsurabil). În acest fel, pot fi făcute servesc ca senzori de lumină, deși, deși este este adevărat că există fotodiode deosebit de sensibile la lumina vizibilă, marea majoritate sunt în special în lumina infraroșie.
trebuie luat în considerare faptul că, în ciuda faptului că are un comportament în aspect similar cu LDR-urile, o diferență foarte importantă față de acestea (în plus, sensibilitatea la alte lungimi de undă) este timpul de răspuns la schimbările de la întuneric la iluminare și invers, care în fotodiode este mult mai mic.
la fel ca diodele standard, fotodiodele au un anod și un catod, dar aveți grijă, pentru ca acesta să funcționeze așa cum dorim, o fotodiodă trebuie să fie întotdeauna conectată la circuit în polaritate inversă. Desigur, la fel ca în cazul diodelor comune, în mod normal anodul este mai lung decât catodul (dacă acestea au o lungime egală, catodul trebuie marcat într-un fel).
funcționarea sa internă este următoarea: atunci când fotodioda este polarizată direct, lumina care cade pe ea nu are un efect apreciabil și, prin urmare, atât dispozitivul se comportă ca o diodă comună. Când este polarizat în sens invers și nu ajunge nicio radiație luminoasă, se comportă și ca o diodă normal, deoarece electronii care curg prin circuit nu au suficientă energie pentru a trece prin el, astfel încât circuitul rămâne deschis. Dar în momentul în care fotodioda primește radiații luminoase într-un interval de lungime de formă de undă, electronii primesc suficientă energie pentru a putea “sări” bariera fotodiodă inversă și a continua pe drum.
exemplu 1: Cum să verificați comportamentul fotodiodei
pentru a testa comportamentul acesteia, putem folosi circuitul de mai jos. Acest circuit este identic cu cel pe care l-am văzut cu LDR-urile, înlocuindu-le cu o fotodiodă (care este identificată printr-un nou simbol pe care nu l-am văzut până acum). Valoarea divizorului dvs. de tensiune va depinde de cantitatea de lumină (Infraroșu) prezentă în mediu: rezistențele mai mari îmbunătățesc sensibilitatea atunci când există o singură sursă de lumină, iar rezistențele mai mici o îmbunătățesc atunci când există multe (soarele în sine sau lămpile sunt surse de infraroșu); o valoare de 100 K HECTOLIXT poate fi bine pentru început. De asemenea, observăm că este catodul fotodiodei (cel mai scurt terminal, amintiți-vă) cel care se conectează la sursa de alimentare.
funcționarea acestui circuit este după cum urmează: atâta timp cât fotodioda nu detectează lumina infraroșie, prin intrarea analogică a plăcii Arduino (în acest caz numărul 0) se va măsura o tensiune de 0V, deoarece circuitul va acționa ca un circuit deschis. Pe măsură ce intensitatea luminii pe fotodiodă crește, va crește numărul de electroni care trec prin ea (adică intensitatea curentului). Acest lucru implică faptul că, pe măsură ce rezistența “pull-down” este fixă, prin Legea lui Ohm tensiunea măsurată la pinul de intrare analogic va crește, de asemenea, până la un moment în care, atunci când primește multă lumină, fotodioda nu provoacă aproape nici o rezistență la trecerea electronilor și, prin urmare, placa Arduino citește o tensiune maximă de 5V.
am adăugat un LED conectat la PWM ieșire pin # 5 Cum am făcut când am văzut LDRs pentru a avea un mod vizibil (joc de cuvinte destinate) de a detecta incidența luminii infraroșii pe fotodiodă. După cum puteți observa în codul utilizat (prezentat mai jos), am făcut intensitatea luminozității LED a cantității de lumină infraroșie detectată de fotodiodă: cu cât este mai mare radiația infraroșie primită, cu atât LED-ul va fi mai luminos.
programare:
1
2
3
4
5
6
7
8
9
10
11
12
|
int photodiode_value;
int bright_LED;
configurare void(void) {
Serial.începe(9600);
}
buclă void (void) {
photodiode_value = analogRead(0);
Serial.println (photodiode_value);
bright_LED = hartă (photodiode_value, 0, 1023, 0, 255);
analogWrite (5, bright_LED);
întârziere(100);
}
|
explicație programare:
în primul rând pentru primirea valorii fotodiodei definesc variabila de tip întreg
1
|
int photodiode_value;
|
apoi definesc variabila de tip întreg pentru valoarea led “valoarea trimisă la LED”
1
|
int bright_LED;
|
în funcția buclă void mai întâi este primesc valoarea folosind funcția analogRead și stoca aceste valori în variabila photodiode_value și apoi utilizați serial.println pentru a imprima valori pe monitor serial
1
2
3
|
photodiode_value = analogRead(0);
Serial.println (photodiode_value);
|
luminozitatea LED-ului este proporțională cu cantitatea de lumină infraroșie primită
1
2
3
|
bright_LED = hartă (photodiode_value, 0, 1023, 0, 255);
analogWrite (5, bright_LED);
|
fototranzistor:
un alt tip de senzori de lumină în plus față de fotodiode se numesc fototranzistori, adică tranzistori sensibili la lumină (de asemenea, în mod normal infraroșu). Funcționarea sa este după cum urmează: când lumina cade pe baza sa, este generează un curent care aduce tranzistorul într-o stare conductivă. Prin urmare, un fototranzistor este egal cu un tranzistor comun, cu singura diferență că curentul de bază Ib depinde de lumina primită. De fapt, există fototranzistoare care pot funcționa în ambele moduri: fie ca fototranzistoare, fie ca tranzistoare comune cu un anumit curent de bază Ib.
fototranzistorul este mult mai sensibil decât fotodioda (datorită efectului de câștig al tranzistorului în sine), deoarece curenții care pot fi obținuți cu o fotodiodă sunt într-adevăr limitați. De fapt, puteți înțelege un fototranzistor ca o combinație de fotodiodă și amplificator, deci, de fapt, dacă am dori să construim un fototranzistor de casă, ar fi suficient să adăugăm la un tranzistor comun o fotodiodă, conectând catodul fotodiodei la colectorul tranzistorului și anodul la bază. În această configurație, curentul livrat de fotodiodă (care ar circula spre baza tranzistorului) ar fi amplificat de o mie de ori.
în multe circuite putem găsi un fototranzistor la mică distanță de un LED care emite infraroșu cu o lungime de undă compatibilă. Acest cuplu de componente este util pentru detectarea interpunerii unui obstacol între ele (datorită întreruperii fasciculului de lumină) și, prin urmare, acționează ca comutatoare opticieni. Acestea pot fi utilizate într-o multitudine de aplicații, cum ar fi detectoarele de trecere a unui card de credit (la un bancomat) sau introducerea hârtiei (într-o imprimantă) sau ca tahometre, printre multe altele. Un tahometru este un dispozitiv care numără virajele pe minut făcute de un obstacol supus unei roți sau lame care se rotește (de obicei datorită funcționării unui motor); adică este folosit pentru a măsura viteza de rotație a unui obiect.
fototranzistorul este format din două terminale corespunzătoare anodului și catodului LED-ului și două terminale corespunzătoare colectorului și emițătorului unui fototranzistor NPN. În general, vom dori să conectăm bornele LED-ului la un circuit închis alimentat continuu (anod la sursă, catod la masă), terminalul colector al comutatorului foto la o sursă de alimentare și terminalul emițător al comutatorului foto la o intrare digitală a plăcii noastre Arduino, pentru a putea detecta astfel apariția curentului atunci când se primește iluminarea. Pe de altă parte, atât această intrare de bord Arduino ca emițător ar trebui să fie împământat la prin același rezistor pull-down, pentru a obține citiri mai stabile (o valoare tipică de 10 K INKT pot lucra, dar în funcție de circuitul poate fi nevoie de valori mai mari).
putem găsi, de asemenea, LED infraroșu plus pereche fototranzistor în unele componente numite “optocuploare” sau “optoizolator”. Reprezentarea schematică este de obicei astfel:
în linii mari, un optocuplor acționează ca un circuit închis atunci când lumina vine de la LED la baza tranzistorului și se deschide atunci când LED-ul este oprit. Funcția sa principală este de a controla și, în același timp, de a izola două părți ale unui circuit pe care în mod normal funcționează la tensiuni diferite (la fel ca un tranzistor comun, dar într-un mod ceva mai sigur). Fizic acestea sunt, de obicei, chips-uri care oferă ca cel puțin patru pini (la fel ca switch-uri foto): două corespunzătoare bornelor LED-ului și două corespunzătoare colectorului și emițătorului fototranzistorului (deși pot avea încă un știft corespunzător bazei, dacă este permis, controlează intensitatea care curge prin el și ca standard). Exemple de optocuploare sunt 4N35 sau CNY75, fabricate de diverse companii.
perechea LED-fototranzistor este utilă și pentru detectarea obiectelor situate la distanțe mici de acesta. Vom studia acest lucru în secțiunea corespunzătoare senzorilor de distanță.
cum se face telecomanda folosind senzorul IR:
o utilitate practică imediată a unei perechi emițător-receptor infraroșu (cum ar fi un LED și o fotodiodă / fototranzistor) situată la o anumită distanță este trimiterea “mesajelor” între ele. Adică, deoarece lumina infraroșie nu este vizibilă (și, prin urmare, nu “enervează”), pot fi emise impulsuri de o anumită durată și / sau frecvență care pot fi recepționate și procesate la câțiva metri distanță fără să fie “observat”.”Dispozitivul care le primește trebuie apoi programat pentru a efectua diferite acțiuni în funcție de tipul de puls citit.
de fapt, orice dispozitiv care funcționează cu o “telecomandă” funcționează într-un mod similar, deoarece în partea sa din față trebuie să am un senzor senzori infraroșii (numiți și senzori “IR”, din engleza “infraroșu”) care primesc semnalele infraroșii emise de telecomandă. Și ceea ce este în interior este practic un LED care emite impulsuri de lumină infraroșie urmând un anumit model care semnalează dispozitivului ordinea care trebuie efectuată: există un cod de clipire pentru a porni televizorul, altul pentru a schimba canalele etc.
mai sus am vorbit despre “senzori IR” și nu despre fotodiode / fototranzistoare, deoarece primele sunt ceva mai sofisticate. Mai exact, senzorii IR nu detectează nicio lumină infraroșie, ci doar că (datorită încorporării unui filtru intern de bandă și a unui demodulator) este modulată de o undă purtătoare cu o frecvență de 38 KHz + 3 KHz. Aceasta înseamnă practic că vor fi citite doar semnalele ale căror informații sunt transmise de o formă de undă de 38 KHz. Acest lucru este pentru a preveni ca senzorii IR să devină “nebuni” atunci când primesc lumina infraroșie care există venind din toate părțile (soare, lumină electrică … în acest fel răspund doar la foarte concret deja standardizat.
o altă diferență cu fotodiodele / fototranzistoarele este că senzorii IR oferă un răspuns binar: dacă detectează un semnal IR de 38 KHz, valoarea pe care o puteți citi de la ei în majoritatea cazurilor este scăzută (0 V), iar dacă nu detectează nimic, citirea dvs. oferă o valoare ridicată (5 V). Acest comportament este ceea ce se numește de obicei “activ scăzut sau” slab activ “.
Exemple de senzori IR pot fi TSOP32838 sau GP1UX311QS. Ca caracteristici cele mai proeminente au că gama lor de sensibilitate este între lungimi de undă de 800nm la 1100nm cu un răspuns maxim la 940nm și au nevoie de aproximativ 5V și 3 mA pentru a funcționa.
cipul TSOP32838 oferă trei pini: orientat spre spate emisferic, pinul din stânga este ieșirea digitală furnizată de senzor, pinul din mijloc trebuie să fie împământat și pinul din dreapta trebuie să fie împământat. conectați-vă la sursa de alimentare (între 2,5 V și 5,5 V).
Exemplu2:
cum să porniți led-ul cu telecomandă folosind Arduino și, senzor IR TSOP32838:
pentru a testa funcționarea acestuia, am putea proiecta un circuit ca cel următor. Divizorul de tensiune pentru LED poate fi cuprins între 200 și 1000 ohmi.
ideea este să porniți scurt LED-ul atunci când senzorul IR detectează un semnal infraroșu. Dar aveți grijă, nu orice semnal infraroșu este valabil, ci doar cel modulat la 38 KHz. Prin urmare, pentru a testa acest circuit, Nu putem folosi nici un LED infraroșu: trebuie să folosim un buton de control telecomandă pe care îl avem la îndemână (de la un televizor, un DVD player, un computer etc.). Odată încărcat pe placa Arduino schița prezentată la Next, dacă îndreptăm telecomanda către senzorul IR și apăsăm unele dintre butoanele sale, ar trebui să vedem LED-ul aprins. În acest fel, vom folosi senzorul IR ca și cum ar fi un comutator, care luminează LED-ul în timp ce detectează acel semnal și îl oprește atunci când nu mai este detectat.
ieșirea senzorului este conectată la pin2 de intrare digitală a plăcii Arduino și LED-ul este conectat la pin12 de ieșire digitală):
programare:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int irPin=2;
int ledPin = 12;
void setup () {
pinMode (irPin, intrare);
pinMode (ledPin, ieșire);
}
buclă void () {
dacă (pulseIn(irPin, scăzut) > 0) {
întârziere(100);
digitalWrite (ledPin, mare);
întârziere(200);
digitalWrite (ledPin, scăzut);
}
}
|
explicație programare:
mai întâi definesc variabila de tip întreg pentru senzorul IR și led
1
2
3
|
int irPin = 2;
int ledPin=12;
|
în funcția de configurare am setat senzorul IR ca intrare și led-ul ca ieșire
1
2
3
|
pinMode (irPin, intrare);
pinMode (ledPin, ieșire);
|
deoarece semnalul emis de senzor este în mod normal ridicat, atunci când este apăsat butonul unei telecomenzi, acesta se schimbă la scăzut. Ce funcția pulseIn () este de a întrerupe schița până când un semnal este detectat scăzut, a cărui durată nu ne interesează cu adevărat, dar logic va fi întotdeauna mai mare decât zero. Prin urmare, dacă starea if înseamnă că a fost apăsat un buton de pe o telecomandă
1
|
dacă (pulseIn(irPin, scăzut) > 0) {
|
este necesar să așteptați un anumit timp (care va depinde de modelul specific de telecomandă) după detectarea primului semnal scăzut, deoarece fiecare apăsare a butonului produce oscilații multiple între valorile ridicate și cele scăzute. Deși fizic nu are nimic de văzut, putem înțelege această așteptare ca și cum ar fi o modalitate de a evita o “săritură” (fenomen studiat atunci când tratăm butoanele). Odată ce acest timp de așteptare a trecut, semnalul de la senzor ar fi trebuit să revină la starea de repaus (valoare ridicată).
1
|
întârziere(100);
|
ținem LED-ul aprins câteva milisecunde. În acest timp, schița nu va putea detecta alte apăsări de taste provenite de la telecomandă. De asemenea, am fi putut trimite un mesaj “monitorului Serial” prin care să anunțăm pulsația.
1
2
3
4
5
6
7
8
9
|
digitalWrite (ledPin, mare);
întârziere(200);
digitalWrite (ledPin, scăzut);
}
}
|
Exemplu3:
cum să primiți comanda telecomenzii pe monitorul serial folosind senzorul IR TSOP32838 cu Arduino:
în primul rând descărcați biblioteca necesară pentru senzorul IR
Arduino IRremote library
diagrama circuitului:
programare:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <IRremote.h>
int receiverPin = 11;
IRrecv irrecv(receiverPin);
decode_results results;
configurare void () {
Serial.începe(9600);
irecv.enableIRIn();
}
buclă void () {
dacă (irecv.decoda (& rezultate) !=0) {
dacă (rezultate.decode_type = = NEC) {
Serial.imprimare (“NEC: “);
} altfel dacă (rezultate.decode_type = = SONY) {
Serial.imprimare (“SONY: “);
} altfel dacă (rezultate.decode_type = = RC5) {
Serial.imprimare (“RC5: “);
} altfel dacă (rezultate.decode_type = = RC6) {
Serial.imprimare (“RC6: “);
} altfel dacă (rezultate.decode_type = = necunoscut) {
Serial.print (“necunoscut: “);
}
Serial.println (rezultate.valoare, HEX);
irecv.reluare();
}
}
|
programare explicație:
în primul rând, am importa biblioteca necesară
1
|
#includeți <IRremote.h>
|
apoi definesc pin-ul de intrare digital pentru receptor
1
|
int receiverPin = 11;
|
apoi creez un obiect numit” irecv ” de tip Irecv
1
|
IRrecv irrecv (receiverPin);
|
apoi declar o variabilă de tip special,”decode_results”.
1
|
decode_results rezultate;
|
apoi pornesc receptorul în funcția void step
1
|
irecv.enableIRIn();
|
apoi, în void loop mă uit să văd dacă a fost detectat vreun model ir modulat. Dacă da, am citit-o și o păstrez în întregime în variabila specială “rezultate”, sub formă de număr hexazecimal
1
|
dacă (irecv.decoda (& rezultate) !=0) {
|
apoi mă uit la ce fel de model de tranzacționare este, dacă este de la unul recunoscut de bibliotecă
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
dacă (rezultate.decode_type = = NEC) {
Serial.imprimare (“NEC:”);
} altfel dacă (rezultate.decode_type = = SONY) {
Serial.imprimare (“SONY: “);
} altfel dacă (rezultate.decode_type = = RC5) {
Serial.imprimare (“RC5: “);
} altfel dacă (rezultate.decode_type = = RC6) {
Serial.imprimare (“RC6: “);
} altfel dacă (rezultate.decode_type = = necunoscut) {
Serial.print (“necunoscut: “);
}
|
și apoi arăt modelul primit (în format hexazecimal) pe canalul serial
1
|
Serial.println (rezultate.valoare, HEX);
|
odată ce modelul a fost decodat, reactivați ascultările pentru a detecta următorul model posibil
1
2
3
|
irecv.reluare();
}
|
Example4:
cum se face telecomanda folosind senzorul IR TSOP32838 cu Arduino:
mai întâi descărcați biblioteca necesară pentru senzorul IR
Biblioteca IRremote Arduino
utilizați același circuit pe care l-am folosit în proiectul anterior
diagrama circuitului:
programare:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#includeți <IRremote.h >
int receiverPin = 11;
IRrecv irrecv(receiverPin);
decode_results rezultate;
void setup(){
Serial.începe(9600);
irecv.enableIRIn();
}
buclă void () {
int i;
dacă (irecv.decoda (& rezultate)!=0) {
acțiune();
Pentru (i=0; i<2; I++) {
irecv.reluare();
}
}
}
acțiune void () {
comutator (rezultate.value) {
case 0x37EE: Serial.println(“Favorites”); break;
case 0xA90: Serial.println(“On/off”); break;
case 0x290: Serial.println(“Mute”); break;
case 0x10: Serial.println(“1”); break;
case 0x810: Serial.println(“2”); break;
case 0x410: Serial.println(“3”); break;
case 0xC10: Serial.println(“4”); break;
case 0x210: Serial.println(“5”); break;
case 0xA10: Serial.println(“6”); break;
case 0x610: Serial.println(“7”); break;
case 0xE10: Serial.println(“8”); break;
case 0x110: Serial.println(“9”); break;
case 0x910: Serial.println(“0”); break;
case 0x490: Serial.println(“Increase volume”); break;
case 0xC90: Serial.println(“Decrease volume”); break;
case 0x90: Serial.println(“Increase channel”); break;
case 0x890: Serial.println(“Decrease channel”); break;
default: Serial.println(“Other button”);
}
delay(500);
}
|
Leave a Reply