Infracrveni senzori

Infracrveno svjetlo, senzor linije s LED-icom i fototranzistorom, daljinski upravljač i prijemnik na 38 kHz te zašto sunce zbunjuje senzore.

Crni daljinski upravljač šalje tamnocrvene crtkane zrake prema malom crnom IR prijemniku s tri nožice. Desno zelena pločica senzora linije s plavkastom LED-icom i crnim fototranzistorom, a ispod nje bijela traka papira s crnom prugom

Što je infracrveno svjetlo?

Infracrveno svjetlo je svjetlo koje naše oči ne vide. Kad bismo ga mogli vidjeti, u dugi bi bilo odmah iza crvene boje. Ime mu dolazi otud što mu je frekvencija niža od frekvencije crvenog svjetla: infra znači ispod. Osjetimo ga kao toplinu, kad stojimo uz peć ili na suncu.

Za senzore je zgodno jer ga ne vidimo: lampica može stalno svijetliti, a nikome ne smeta. Kamera mobitela ga djelomično vidi. Uperi daljinski upravljač za televizor u kameru mobitela i pritisni tipku: na zaslonu ćeš vidjeti kako LED-ica na vrhu daljinskog trepće.

Svjetlo ima valnu duljinu, koja se mjeri u nanometrima (nm). Naše oči vide od oko 380 nm (ljubičasto) do 750 nm (crveno). Infracrvene LED-ice u senzorima i daljinskim upravljačima svijetle na 850 ili 940 nm.

Senzor linije

Senzor linije ima dva dijela, jedan pokraj drugoga: infracrvenu LED-icu, koja svijetli prema podu, i fototranzistor, koji gleda koliko se svjetla odbije natrag.

Dva crteža senzora linije odozgo prema podu: lijevo plavkasta infracrvena LED-ica, desno crni fototranzistor. Lijevo je pod bijel i tamnocrvene zrake odbijaju se od njega natrag u fototranzistor. Desno je pod crna traka i zrake završe u njoj, a natrag se ništa ne odbije

  • Bijeli papir odbija mnogo svjetla, pa fototranzistor dobiva svjetlo.
  • Crna traka svjetlo upija, pa se gotovo ništa ne odbije.

Fototranzistor je tranzistor koji ne uključuje struja u bazu, nego svjetlo. Što više svjetla padne na njega, to više struje propušta.

Robot Maqueen ima dva takva senzora na donjoj strani, lijevi i desni. S njima prati crnu liniju u lekciji Senzori linije.

Zašto ih sunce zbunjuje?

Sunce ne daje samo svjetlo koje vidimo, nego i mnogo infracrvenog. Kad sunce obasja stazu, fototranzistor dobiva infracrveno svjetlo i iznad crne trake, pa misli da je ispod njega bijelo. Sjajna crna traka također odbija svjetlo kao bijeli papir. Zato staza za robota nije uz prozor, a traka je mat.

Koliko svjetla daje tijelo zagrijano na 5800 K (Sunce) i na 2800 K (žarulja sa žarnom niti) na svakoj valnoj duljini od 200 do 2100 nm, svaka krivulja do svog najvišeg dijela. Ispod je obojena traka vidljivog svjetla od 380 do 750 nm. Sunčeva krivulja ima vrh u vidljivom dijelu, a na crtkanoj crti od 940 nm još je na pola visine. Krivulja žarulje ima vrh oko 1000 nm, u infracrvenom dijelu
Graf je izračunat za tijelo zagrijano na temperaturu Sunčeve površine, oko 5800 K, i za žarulju sa žarnom niti, oko 2800 K. Sunce na 940 nm daje gotovo pola onoga što daje u najsvjetlijem dijelu. Stara žarulja daje najviše upravo infracrvenog svjetla: samo 8 % njezina svjetla vide naše oči, a ostalo je toplina. Zato i ona zbunjuje senzore linije, a LED rasvjeta gotovo nimalo.

Daljinski upravljač i prijemnik

Daljinski upravljač za televizor ima infracrvenu LED-icu. Kad pritisneš tipku, LED-ica pošalje poruku: niz kratkih bljeskova. Da prijemnik ne bi zbunili sunce i lampe u sobi, LED-ica u svakom bljesku treperi 38 000 puta u sekundi (38 kHz).

IR prijemnik je mali crni dio s tri nožice i kupolom. U njemu su fotodioda i sklop koji propušta samo svjetlo koje treperi 38 000 puta u sekundi. Sunce i lampe ne trepere tako, pa ih prijemnik gotovo ne primjećuje. Robot Maqueen također ima takav prijemnik.

Dva grafa kroz 8 ms. Gore: infracrvena LED-ica daljinskog šalje pet nizova gustih bljeskova, svaki dug 562,5 mikrosekundi, s kraćim ili duljim razmacima. Iznad su bitovi 0, 1, 1 i 0: kratki razmak je 0, dugi 1. Dolje: izlaz OUT prijemnika je 5 V, a za vrijeme svakog niza bljeskova pada na 0 V

Gornji red pokazuje što radi LED-ica daljinskog upravljača, a donji što prijemnik javlja na svom izlazu OUT: za vrijeme svakog niza bljeskova izlaz padne na 0 V. Bljeskovi su svi jednako dugi, a broj u poruci određuju razmaci između njih: kratki razmak je 0, a dugi 1.

Svjetlosna barijera

Infracrvena LED-ica i prijemnik mogu stajati i jedan nasuprot drugome, s dvije strane staze. LED-ica stalno svijetli prema prijemniku, a kad nešto prođe između njih, zraka se prekine. To je svjetlosna barijera: takve su u vratima dizala i na garažnim vratima, koja se ne zatvore dok je netko na putu. U lekciji Prepoznavanje kuglice barijera je jedan od načina da se kuglica prepozna bez dodira. Za razliku od fotootpornika, koji je spor, infracrveni senzori reagiraju za manje od milisekunde.

Infracrveni senzori na Arduino radionici

Od ovog mjesta stranica je za Arduino radionicu.

Senzor linije na Arduinu

Senzor linije (na primjer TCRT5000) spajamo ovako:

Shema: od 5V infracrvena LED-ica preko otpornika od 220 oma prema GND. Od 5V otpornik od 10 kΩ do kolektora fototranzistora, a kolektor je spojen i na A0. Emiter fototranzistora je na GND

  • LED-ica svijetli stalno, preko otpornika od 220 Ω. Na infracrvenoj LED-ici je oko 1,2 V, manje nego na crvenoj, pa je struja (5 V − 1,2 V) / 220 Ω ≈ 17 mA.
  • Fototranzistor je s otpornikom od 10 kΩ u djelilu napona, kao fotootpornik. Kad se svjetlo odbije, fototranzistor propušta struju i napon na A0 padne. Iznad bijelog analogRead(A0) daje mali broj, a iznad crnog velik, blizu 1023.

Prije pisanja programa uvijek izmjeri što senzor daje iznad bijelog, a što iznad crnog, i granicu postavi između njih. Senzor najbolje radi nekoliko milimetara iznad podloge. Što je senzor dalje, to je razlika između bijelog i crnog manja.

Gotovi moduli imaju uz senzor još i čip LM393, koji napon uspoređuje s granicom namještenom malim potenciometrom. Takav modul ima digitalni izlaz DO (0 ili 1) i često još analogni AO. Senzori linije na robotu Maqueen također javljaju samo 0 ili 1.

Trik protiv sunca

LED-icu senzora spoji preko otpornika na pin Arduina umjesto na 5V. Program tada izmjeri A0 dvaput: jednom s ugašenom LED-icom, kad fototranzistor vidi samo svjetlo iz sobe, i jednom s upaljenom. Razlika dvaju mjerenja je samo svjetlo koje je odbila podloga, a svjetlo sunca i lampi se poništi.

Daljinski upravljač na Arduinu

IR prijemnik (na primjer VS1838B) ima tri nožice: OUT, GND i VCC. Raspored nije isti na svim prijemnicima i modulima, pa ga prije spajanja provjeri na oznakama. VCC spoji na 5V, GND na GND, a OUT na D2.

Poruke čita biblioteka IRremote. Instaliraj je u Arduino IDE-u, u Library Manageru, kao Bounce2 u lekciji o tipkalima:

// C++
#include <IRremote.hpp>                // biblioteka IRremote, verzija 4

const int prijemnik = 2;               // izlaz OUT IR prijemnika

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(prijemnik);         // počni slušati
}

void loop() {
  if (IrReceiver.decode()) {           // stigla je cijela poruka
    if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
      Serial.println("tipka se drži");
    } else {
      Serial.print("Protokol: ");
      Serial.print(getProtocolString(IrReceiver.decodedIRData.protocol));
      Serial.print(", adresa: 0x");
      Serial.print(IrReceiver.decodedIRData.address, HEX);
      Serial.print(", naredba: 0x");
      Serial.println(IrReceiver.decodedIRData.command, HEX);
    }
    IrReceiver.resume();               // spreman za sljedeću poruku
  }
}

Otvori Serial Monitor i pritišći tipke daljinskog upravljača. Svaka tipka ima svoju naredbu, a adresa kaže kojem je uređaju poruka namijenjena. Zapiši naredbe tipki koje želiš koristiti, pa ih u programu usporedi s IrReceiver.decodedIRData.command. Brojevi su heksadecimalni, pa u programu pišeš 0x45, a ne 45.

Na Unu IRremote koristi brojač vremena Timer2, isti kao tone(). Ne mogu raditi zajedno, a ne radi ni PWM na pinovima 3 i 11.

Kako izgleda poruka

Mnogi daljinski upravljači koriste način slanja koji se zove NEC:

  • poruka počinje bljeskom od 9 ms i stankom od 4,5 ms, da se prijemnik pripremi;
  • slijede 32 bita: adresa, pa ista adresa obrnuto, naredba, pa ista naredba obrnuto. Obrnuti dijelovi služe za provjeru: ako se ne slažu, poruka se odbaci;
  • svaki bit je bljesak od 562,5 µs i stanka: kratka (562,5 µs) za 0, a duga (1687,5 µs) za 1. Bit 0 traje 1,125 ms, a bit 1 2,25 ms;
  • cijela poruka traje najviše oko 86 ms. Dok tipku držiš, daljinski svakih 108 ms šalje kratku poruku ponavljanja. Program je ispisuje kao tipka se drži.

Svaki je bljesak zapravo 21 treptaj na 38 kHz, svakih 26,3 µs po jedan.

Što smo naučili?

  • Infracrveno svjetlo naše oči ne vide. Infracrvene LED-ice svijetle na 850 ili 940 nm, a kamera mobitela ih vidi.
  • Senzor linije ima infracrvenu LED-icu i fototranzistor: bijelo svjetlo odbija, a crno ga upija.
  • Sunce i stare žarulje daju mnogo infracrvenog svjetla i zbunjuju senzore linije.
  • Daljinski upravljač šalje bljeskove koji trepere na 38 kHz, a prijemnik propušta samo njih i za vrijeme bljeska daje 0 V.
  • Poruke daljinskog čita biblioteka IRremote. Na Unu ne radi zajedno s tone().

Mali kviz

1. Zašto senzor linije razlikuje crnu traku od bijelog papira?
Bijeli papir odbija infracrveno svjetlo natrag u fototranzistor, a crna traka ga upija. Fototranzistor iznad bijelog dobiva mnogo svjetla, a iznad crnog gotovo ništa.
2. Robot dobro prati liniju u učionici, a uz prozor na suncu ne. Zašto?
Sunce daje mnogo infracrvenog svjetla. Fototranzistor ga dobiva i iznad crne trake, pa misli da je ispod njega bijelo.
3. Zašto LED-ica daljinskog upravljača treperi 38 000 puta u sekundi?
Prijemnik propušta samo svjetlo koje treperi tako brzo. Sunce i lampe ne trepere na 38 kHz, pa ih prijemnik ne primjećuje i ne zbunjuju ga.
4. Senzor linije je spojen kao na shemi. Daje li analogRead(A0) veći broj iznad bijelog ili iznad crnog?
Iznad crnog. Tada se gotovo ništa ne odbije, fototranzistor ne propušta struju i otpornik od 10 kΩ drži A0 blizu 5 V.
5. Koliko traju bit 0 i bit 1 u NEC poruci?
Bit 0 traje 1,125 ms (bljesak i kratka stanka od po 562,5 µs), a bit 1 2,25 ms (bljesak od 562,5 µs i stanka od 1687,5 µs).
6. Program čita daljinski s IRremote i svira zvukove s tone(). Zašto ne radi?
Na Unu i IRremote i tone() koriste Timer2, pa ne mogu raditi zajedno. Za zvuk treba drugi način, na primjer modul DFPlayer, ili drugi Arduino.