fotodiode, fototransistor en IR-Sensor met Arduino
inhoudsopgave:
omschrijving:
fotodiode, fototransistor en IR– Sensor met Arduino-een fotodiode is een apparaat dat, wanneer het door licht wordt opgewekt, in het circuit een proportionele stroom (en meetbaar) produceert. Op deze manier kunnen ze worden gebruikt als lichtsensoren, hoewel het waar is dat er fotodiodes zijn die bijzonder gevoelig zijn voor zichtbaar licht, zijn de overgrote meerderheid vooral in infrarood licht.
er moet rekening worden gehouden met het feit dat, ondanks een gedrag dat vergelijkbaar is met LDRs, een zeer belangrijk verschil (naast gevoeligheid voor andere golflengten) de responstijd is op veranderingen van duisternis naar verlichting en vice versa, die bij fotodiodes veel lager is.
net als standaarddiodes hebben fotodiodes een anode en een kathode, maar wees voorzichtig, om het te laten werken zoals we willen, moet een fotodiode altijd verbonden zijn met het circuit in omgekeerde polariteit. Natuurlijk, hetzelfde als bij Diodes gebruikelijk, normaal gesproken is de anode langer dan de kathode (als ze even lang zijn, moet de kathode op een of andere manier worden gemarkeerd).
de interne werking is als volgt: wanneer de fotodiode direct gepolariseerd is, heeft het licht dat erop valt geen noemenswaardig effect en daarom gedraagt het apparaat zich als een gewone diode. Wanneer er in omgekeerde richting gepolariseerd wordt en er geen lichtstraling aankomt, gedraagt het zich ook als een normale diode omdat de elektronen die door het circuit stromen niet genoeg energie hebben om er doorheen te gaan, zodat het circuit open blijft. Maar op het moment dat de fotodiode lichtstraling ontvangt binnen een lengtebereik van golfvorm, ontvangen de elektronen genoeg energie om de omgekeerde fotodiode barrière te kunnen “springen” en verder te gaan op je weg.
Voorbeeld1: hoe het gedrag van photodiode
te controleren om het gedrag te testen, kunnen we het onderstaande circuit gebruiken. Dit circuit is identiek aan dat wat we zagen met de LDRs, deze vervangen door een fotodiode (die wordt geïdentificeerd door een nieuw symbool dat we tot nu toe niet hadden gezien). De waarde van uw spanningsdeler zal afhangen van de hoeveelheid licht (infrarood) aanwezig in de omgeving: hogere weerstanden verbeteren de gevoeligheid wanneer er slechts één lichtbron en lagere weerstanden verbeteren wanneer er veel zijn (de zon zelf of de lampen zijn bronnen van Infrarood); een waarde 100 KΩ kan prima zijn om mee te beginnen. Laten we ook opmerken dat het de kathode van de fotodiode (de kortste terminal, vergeet niet) is die welke aansluit op de voeding.
de werking van dit circuit is als volgt: zolang de fotodiode geen infrarood licht detecteert, zal door de analoge ingang van het Arduino bord (in dit geval het nummer 0) een spanning van 0V worden gemeten omdat het circuit als een circuit geopend zal werken. Naarmate de lichtintensiteit op de fotodiode toeneemt, zal het aantal elektronen dat er doorheen gaat (dat wil zeggen de intensiteit van de stroom) toenemen. Dit houdt in dat, als het “pull-down” weerstand is vastgesteld, door de Wet van Ohm de spanning gemeten op de analoge input pin zal ook toenemen, tot een moment waarop bij het ontvangen van veel licht de fotodiode niet tot nauwelijks weerstand tegen de passage van de elektronen en dus de Arduino board leest een maximale spanning van 5V.
We hebben een LED aangesloten op PWM-uitgang pin # 5 zoals we deden toen we zagen dat de LDRs een zichtbare manier (pun intended) van het detecteren van de incidentie van infrarood licht op de fotodiode. Zoals u in de gebruikte code kunt waarnemen( hieronder getoond), hebben wij de LEIDENE helderheidsintensiteit van de hoeveelheid infraroodlicht gemaakt die door de fotodiode wordt gedetecteerd: hoe meer infraroodstraling wordt ontvangen, hoe helderder de LEIDENE zal zijn.
Programmering:
1
2
3
4
5
6
7
8
9
10
11
12
|
int photodiode_value;
int bright_LED;
void setup (void) {
Serial.beginnen(9600);
}
void loop (void) {
photodiode_value = analogRead(0);
serieel.println (photodiode_value);
bright_LED = map(photodiode_value), 0, 1023, 0, 255);
analogWrite (5, bright_LED);
vertraging(100);
}
|
uitleg programmeren:
ten Eerste Voor het ontvangen van de fotodiode waarde ik definieer type integer variabele
1
|
int photodiode_value;
|
Vervolgens definieer ik type integer variabele voor led-waarde “Waarde verzonden naar de LED”
1
|
int bright_LED;
|
in void loop functie eerst ontvang ik de waarde met behulp van analogRead functie en bewaar deze waarde in photodiode_value variabele en gebruik vervolgens serieel.println om waarden op seriële monitor af te drukken
1
2
3
|
photodiode_value = analogRead(0);
serieel.println (photodiode_value);
|
De helderheid van de LED is evenredig aan de hoeveelheid infrarood licht ontvangen
1
2
3
|
bright_LED = map(photodiode_value, 0, 1023, 0, 255);
analogWrite(5, bright_LED);
|
fototransistor:
een ander type lichtsensoren naast fotodioden worden fototransistors genoemd, dat wil zeggen lichtgevoelige transistors (ook normaal infrarood). De werking is als volgt: wanneer het licht op zijn basis valt, genereert het een stroom die de transistor in een geleidende staat brengt. Daarom is een fototransistor gelijk aan een gemeenschappelijke transistor met het enige verschil dat de basisstroom Ib afhankelijk is van het ontvangen licht. In feite zijn er fototransistors die op beide manieren kunnen werken: als fototransistors of als gemeenschappelijke transistors met een bepaalde specifieke basisstroom Ib.
de fototransistor is veel gevoeliger dan de fotodiode (door het effect van versterking van de transistor zelf), omdat de stromen die met een fotodiode kunnen worden verkregen, echt beperkt zijn. In feite kun je een fototransistor begrijpen als een combinatie van fotodiode en versterker, dus eigenlijk als we een zelfgemaakte fototransistor zouden willen bouwen, zou het genoeg zijn om aan een transistor een fotodiode toe te voegen, die de kathode van de fotodiode verbindt met de collector van de transistor en de anode met de basis. In deze configuratie zou de stroom die door de fotodiode wordt geleverd (die naar de basis van de transistor zou circuleren) β-maal worden versterkt.
in veel circuits vinden we een fototransistor op korte afstand van een infrarode LED met een compatibele golflengte. Dit paar componenten is nuttig voor het detecteren van de interpositie van een obstakel tussen hen (als gevolg van de onderbreking van de lichtbundel) en dus fungeren als schakelaars opticiens. Ze kunnen worden gebruikt in een veelheid van toepassingen, zoals in detectoren van het passeren van een creditcard (bij een geldautomaat) of de introductie van het papier (in een printer) of als tachometers, onder vele anderen. Een toerenteller is een apparaat dat de omwentelingen per minuut telt die worden gemaakt door een obstakel dat onderworpen is aan een wiel of blad dat draait (meestal als gevolg van de werking van een motor); het is dat wil zeggen, het wordt gebruikt om de rotatiesnelheid van een object te meten.
fototransistor bestaat uit twee aansluitingen die overeenkomen met de anode en de kathode van de LED, en twee aansluitingen die overeenkomen met de collector en de zender van een NPN-fototransistor. In het algemeen willen we de aansluitingen van de LED aansluiten op een gesloten circuit continu gevoed (anode aan bron, kathode aan grond), de collectorterminal van de foto-schakelaar naar een stroombron en de emitter terminal van de foto-schakelaar naar een digitale ingang van onze Arduino board, om zo het uiterlijk van de stroom te kunnen detecteren wanneer verlichting wordt ontvangen. Aan de andere kant, zou zowel deze Arduino raad input als de emitter aan door dezelfde Trek-Neer weerstand moeten worden geaard, om stabielere lezingen te verkrijgen (een typische waarde van 10 KΩ kan werken, maar afhankelijk van het circuit kan het behoefte hogere waarden zijn).
we kunnen het infrarood LED plus fototransistor paar ook vinden in sommige componenten die “optocouplers” of “optoisolator”worden genoemd. De schematische weergave is meestal als volgt:
in het algemeen werkt een optokoppelaar als een gesloten circuit wanneer het licht van de LED naar de basis van de transistor komt en open wanneer de LED uit is. De belangrijkste functie is het aansturen en tegelijkertijd isoleren van twee delen van een circuit die ze normaal werken bij verschillende spanningen (net als een gewone transistor zou doen, maar op een iets veiliger manier). Fysiek zijn ze meestal chips die bieden als ten minste vier pinnen (hetzelfde als de foto-schakelaars): twee die overeenkomen met de aansluitingen van de LED en twee die overeenkomen met de collector en de emitter van de fototransistor (hoewel ze nog een pin kunnen hebben die overeenkomt met de basis indien toegestaan, regelen ook standaard de intensiteit die er doorheen stroomt). Voorbeelden van optocouplers zijn de 4N35 of de CNY75, geproduceerd door verschillende bedrijven.
het LED-fototransistorpaar is ook nuttig voor het detecteren van objecten die zich op kleine afstand ervan bevinden. We zullen dit bestuderen in het gedeelte dat overeenkomt met afstandssensoren.
afstandsbediening met behulp van een IR-sensor:
een onmiddellijk praktisch nut van een paar infraroodontvangers (zoals een LED en een fotodiode / fototransistor) die zich op een bepaalde afstand bevinden, is het verzenden van “berichten” tussen hen. Dat wil zeggen, omdat infrarood licht niet zichtbaar is (en daarom niet “ergeren”), kunnen pulsen van een bepaalde duur worden uitgezonden en / of frequentie die enkele meters verder kunnen worden ontvangen en verwerkt zonder dat het “opgemerkt” wordt.”Het apparaat dat ze ontvangt, moet vervolgens worden geprogrammeerd om verschillende acties uit te voeren, afhankelijk van het type puls dat wordt gelezen.
in feite werkt elk apparaat dat werkt met een “afstandsbediening” het werkt op dezelfde manier, omdat in het voorste deel heb ik een sensor infrarood sensoren (ook wel “IR” sensoren, van het Engels “infrarood”) die de infrarood signalen uitgezonden door de afstandsbediening ontvangen. Binnenin zit een LED die pulsen van infrarood licht uitzendt volgens een bepaald patroon dat het apparaat de opdracht geeft om uit te voeren.: er is een knippercode om de TV aan te zetten, een andere om van kanaal te veranderen, enz.
hierboven hebben we gesproken over “IR-sensoren” en niet over fotodiodes / fototransistors, omdat de eerste iets geavanceerder zijn. In het bijzonder detecteren IR-sensoren geen infrarood licht, maar alleen dat dat (dankzij de integratie van een intern banddoorlaatfilter en een demodulator) wordt gemoduleerd door een draaggolf met een frequentie van 38 KHz + 3 KHz. Dit betekent in principe dat alleen de signalen waarvan de informatie wordt gedragen door een 38 KHz golfvorm worden gelezen. Dit om te voorkomen dat IR-sensoren ” gek ” worden wanneer ze het infrarood licht ontvangen dat van alle kanten komt (zon, elektrisch licht … op deze manier reageren ze alleen op zeer beton dat al gestandaardiseerd is.
een ander verschil met fotodiodes / fototransistors is dat IR-sensoren een binaire respons bieden: als ze een IR-signaal van 38 KHz detecteren, is de waarde die je van hen kunt lezen in de meeste gevallen laag (0 V), en als ze niets detecteren, geeft je lezing een hoge waarde (5 V). Dit gedrag wordt meestal “actief laag” of “laag-actief” genoemd.
voorbeelden van IR-sensoren kunnen TSOP32838 of de GP1UX311QS zijn. Als kenmerken de meest prominente hebben dat hun gevoeligheid bereik is tussen golflengten van 800nm tot 1100nm met een maximale respons op 940nm en nodig rond 5V en 3 mA te werken.
de TSOP32838-chip biedt drie pinnen: de meest linkse pin is de digitale uitgang van de sensor, de middelste pin moet geaard zijn en de meest rechtse pin moet geaard zijn. aansluiten op de voeding (tussen 2,5 V en 5,5 V).
Voorbeeld2:
hoe de LED met afstandsbediening aan te zetten met behulp van Arduino en, TSOP32838 IR-Sensor:
om de werking ervan te testen, konden we een circuit ontwerpen zoals het volgende. De spanningsdeler voor de LED kan tussen 200 en 1000 ohm zijn.
het idee is om de LED kort aan te zetten wanneer de IR-sensor een infraroodsignaal detecteert. Maar wees voorzichtig, niet zomaar een infrarood signaal is geldig, maar alleen dat gemoduleerd op 38 KHz. Daarom, om dit circuit te testen, kunnen we geen infrarood LED gebruiken: we moeten een afstandsbediening gebruiken die we bij de hand hebben (van een televisie, een DVD-speler, een computer, enz.). Zodra geladen op de Arduino-raad de schets aan volgende wordt voorgesteld, als wij die afstandsbediening bij de sensor van IRL richten en sommige van zijn knopen drukken, zouden wij het LEIDENE licht omhoog moeten zien. Op deze manier gebruiken we de IR sensor als ware het een schakelaar, die de LED verlicht terwijl het detecteren van dat signaal en schakelt het uit wanneer het niet meer wordt gedetecteerd.
de sensoruitgang wordt aangesloten op de digitale ingangspin2 van de Arduino-raad en de LED wordt aangesloten op zijn digitale uitgangspin12):
Programmering:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int irPin=2;
int ledPin=12;
void setup() {
pinMode(irPin,INPUT);
pinMode(ledPin,OUTPUT);
}
void loop() {
als(pulseIn(irPin,LAGE) > 0) {
delay(100);
digitalWrite(ledPin,HIGH);
vertraging(200);
digitalWrite(ledPin,LOW);
}
}
|
Programmeren toelichting:
ik Eerst definiëren type integer variabele voor IR-sensor en led
1
2
3
|
int irPin=2;
int ledPin=12;
|
in het setup-functie stel ik IR sensor als input en als output led
1
2
3
|
pinMode(irPin,INPUT);
pinMode(ledPin,OUTPUT);
|
Omdat het signaal uitgezonden door de sensor is normaal HOOG is, als de knop van een afstandsbediening wordt ingedrukt, verandert de LAAG. Wat de functie pulseIn () is om de schets te pauzeren totdat een signaal laag wordt gedetecteerd, waarvan de duur ons niet echt interesseert maar logischerwijs altijd groter zal zijn dan nul. Daarom, als de voorwaarde van de if betekent dat een knop op een afstandsbediening is ingedrukt
1
|
als(pulseIn(irPin,LAGE) > 0) {
|
Het is nodig om te wachten een bepaalde tijd (afhankelijk van de specifieke afstandsbediening model) na de detectie van de eerste LAAG signaal omdat elke druk op de knop produceert meerdere oscillaties tussen HOGE en LAGE waarden. Hoewel hij fysiek niets te zien heeft, kunnen we dit wachten begrijpen alsof het een manier was om een “bounce” te vermijden (fenomeen bestudeerd wanneer we de drukknoppen behandelen). Zodra deze wachttijd is verstreken, moet het signaal van de sensor zijn rusttoestand (hoge waarde) hebben bereikt.
1
|
vertraging(100);
|
we houden de LED een paar milliseconden aan. Gedurende deze tijd zal de schets niet in staat zijn om andere toetsaanslagen afkomstig van de afstandsbediening te detecteren. We hadden ook een bericht naar de “seriële monitor” kunnen sturen om de pulsatie te melden.
1
2
3
4
5
6
7
8
9
|
digitalWrite(ledPin,HIGH);
vertraging(200);
digitalWrite(ledPin,LOW);
}
}
|
Example3:
hoe ontvangt u de afstandsbediening op de seriële monitor met behulp van de TSOP32838 IR-Sensor met Arduino:
Download eerst de vereiste bibliotheek voor IR-sensor
Arduino IRremote library
schakelschema:
programmering:
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;
ongeldige instelling () {
serieel.beginnen(9600);
irrecv.enableirine();
}
void loop () {
if (irrecv.decoderen (&resultaten)!=0) {
if (resultaten.decode_type = = NEC) {
serieel.afdrukken (“NEC: “);
} else if (resultaten.decode_type = = SONY) {
serieel.afdrukken (“SONY: “);
} else if (resultaten.decode_type = = RC5) {
serieel.afdrukken (“RC5: “);
} else if (resultaten.decode_type = = RC6) {
serieel.afdrukken (“RC6: “);
} else if (resultaten.decode_type = = onbekend) {
serieel.print (“onbekend: “);
}
serieel.println (resultaten.waarde, HEX);
irrecv.hervatten();
}
}
|
Programmeren toelichting:
Eerste, ik importeer de vereiste library
1
|
#include <IRremote.h>
|
Vervolgens definieer ik de digitale input pin voor de ontvanger
1
|
int receiverPin = 11;
|
Dan heb ik het maken van een object met de naam “irrecv” van het type IRrecv
1
|
IRrecv irrecv(receiverPin);
|
dan verklaar ik een variabele van een speciaal type, “decode_results”.
1
|
decode_results resultaten;
|
Vervolgens Start ik de ontvanger niet in de step-functie void
1
|
irrecv.enableIRIn();
|
dan in void loop Kijk ik om te zien of een gemoduleerd ir patroon is gedetecteerd. Als dat zo is, lees ik het en ik houd het volledig in de speciale variabele “resultaten”, in hexadecimale getalvorm
1
|
if (irrecv.decoderen (&resultaten)!=0) {
|
Dan kijk ik naar wat voor soort handel patroon is, als het afkomstig is van een erkend door de bibliotheek
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
als (resultaten.decode_type = = NEC) {
serieel.afdrukken (“NEC:”);
} else if (resultaten.decode_type = = SONY) {
serieel.afdrukken (“SONY: “);
} else if (resultaten.decode_type = = RC5) {
serieel.afdrukken (“RC5: “);
} else if (resultaten.decode_type = = RC6) {
serieel.afdrukken (“RC6: “);
} else if (resultaten.decode_type = = onbekend) {
serieel.print (“onbekend: “);
}
|
en dan toon ik het ontvangen patroon (in hexadecimale formaat) op het seriële kanaal
1
|
serieel.println (resultaten.waarde, HEX);
|
Nadat het patroon is gedecodeerd, u luistert naar het detecteren van de volgende mogelijke patroon
1
2
3
|
irrecv.hervatten();
}
|
Example4:
hoe te maken van de afstandsbediening met behulp van TSOP32838 IR Sensor met de Arduino:
allereerst het downloaden van de vereiste library voor IR-sensor
Arduino IRremote bibliotheek
Gebruik dezelfde stroomkring zit als ik in het vorige project
Circuit diagram:
Programmering:
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
|
#inclusief <IRremote.h>
int curatorpin = 11;
IRrecv irrecv (curatorpin);
decode_results results;
void setup () {
Serial.beginnen(9600);
irrecv.enableirine();
}
void loop () {
int i;
if (irrecv.decoderen (&resultaten)!=0) {
action ();
voor (i = 0; i<2; I++) {
irrecv.hervatten();
}
}
}
void action () {
switch (results.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