Távvezérlős lámpa

Mire tudjuk használni amit eddig tudunk? Hát persze, csinálhatunk vele egy távkapcsolós lámpát!

Egyszerűen várni kell az első infra jelre, majd akkor bekapcsolni a lámpát. A következőnél meg kikapcsolni.

Ez nagyon hasonlít a nyomógombos lámpakapcsoló projektre:

const int LED=13;
const int SENSOR=0;

bool isOn;

void setup() {
    pinMode(LED, OUTPUT);
    pinMode(SENSOR, INPUT_PULLUP);
}

void loop() {
    if (digitalRead(SENSOR)==0) { 
      // lámpa be vagy ki
      isOn=!isOn;
      if (isOn) {
        digitalWrite(LED,HIGH);
      }
      else {
        digitalWrite(LED,LOW);
      }        
    }
}

Egy a gond: ez most össze-vissza működik! Bár a szemünkkel úgy látjuk, hogy egy gombnyomás a távvezérlőn folyamatos jelet ad, de valójában nem. Minden gombnyomás egy-egy nagyon gyors morzekód, és 10-15x be-ki kapcsolgatja emiatt a lámpát. A végén lehet, hogy jó lesz, lehet, hogy nem.

Ezt egy kicsit nehéz elképzelni. Megmutatom, mi történik!

Az idődiagram

Nos, ha valami be-ki kapcsol, azon megváltozik a villany. Eddig jók vagyunk. A villany nagyságát például a multiméter nevű műszerrel lehet megmérni. Ez így néz ki:

Egy multiméter

A multiméter azért multi, mert többféle dolgot tud megmérni, és azért méter, mert az angol "meter" szó azt jelenti, hogy mérő. Szóval, ez egy mindenmérő, mármint minden olyan dolgot mér, ami az elektronikában előfordul. Természetesen a villany nagyságát is megméri, amit hivatalosan feszültségnek nevezünk, és volt-ban mérünk.

Egyszerűen a fekete megy az áramkör GND pontjára, a piros pedig arra a pontra, amit mérni akarsz. Ha csinálsz az A-starral egy villogó led programot, és a kimentre rakod a multimétert, akkor azt mutatja, hogy:

0.00 V 
(kis idő múlva) 
5.00 V 
(kis idő múlva) 
0.00 V 
(kis idő múlva) 
5.00 V

be-ki, fel-le, fel-le, mivel egy szellő hintáztatja az ágat... ja ez egy másik mese. Szóval amikor bekapcsolsz egy kimenetet, akkor 5V lesz rajta a GNDhez képest, ezért világít a rákötött led. Eddig semmi újdonság.

Húzzunk bele

Ok, de mi van, ha ez a led kicsit gyorsabban pislákol? Ha mondjuk csak 200 milliszekundumig van bekapcsolva, akkor már a multiméter kicsit nehezen követi, és mindenféle butaságot mutat.

De mi van, ha a másodperc töredék részéig van csak bekapcsolva? Még ha a multiméter képes is lenne megmérni, a szemünkkel nem tudnánk leolvasni! Bármi, amit 40ms-től rövidebb ideig látunk, az agyunk számára nem értelmezhető külön. Egy 1ms-os be-ki kapcsolást lehetetlen látni!

Akkor hogyan?

Ehhez egy okosabb mérőeszköz kell, ami nem csak a villany nagyságát tudja megmérni, hanem képes ebből idő szerint grafikont rajzolni. A vízszintes tengelyen az eltelt idő, a függőlegesen pedig a mért villany. Igazán nem mágia. Az eszköz neve oszcilloszkóp, próbáld meg kimondani :)

Egy oszcilloszkóp

Mivel szép kis grafikont kapunk, a be-kikapcsolás ideje lehet akár 1 milliszekundum, sőt, még annál is rövidebb a valóságban - itt csak az számít, hogy a képernyőn kapunk belőle egy egy cm-es csíkot lenn, amikor ki van kapcsolva, és fenn, amikor be van kapcsolva.

Mi jön ki az infravevőből?

Az infravevőből egy kód jön ki, ami rövidebb-hosszabb jelek sorozata, olyan, mintha minden gombhoz egy-egy morze-kód tartozna. Persze igaziból nem morze, de az elv azonos: valahogyan a bekapcsolt idők és a szünetek hosszával fejezünk ki információt.

Jól megmértem, hogy mi jön ki, amikor megnyomunk egy gombot, és így néz ki:

Egy gombnyomás az oszcilloszkópon

Mit látunk itt? A vízszintes tengely az idő, és a kép alján van egy zöld 2ms/div jelzés. Ez azt jelenti, hogy vízszintesen egy-egy pöttyös osztás között a valóságban 2ms idő telik el.

Ezek szerint első saccra kb. 8ms-ig bazsevál a kimenete az infravevőnek össze-vissza, szóval ez nem egy sima gomb. A felső pici ábrán az látszik, hogy ezek a bazseválások kb. 10ms-ként ismétlődnek. Ez is olyan gyors, hogy az emberi szem nem érzékeli. De szerencsére van oszcilloszkópos mérés, most már látjuk, hogy mi a gond.

A gond csak az, hogy a program minden egyes ilyen pici be-ki kapcsolásra reagál.

Fogjuk be a szemünket!

Mi lenne, ha az első jel után picit befognánk a szemünket? Ekkor a sok további pici jel nem zavar!

const int LED=13;
const int SENSOR=0;

bool isOn;

void setup() {
    pinMode(LED, OUTPUT);
    pinMode(SENSOR, INPUT_PULLUP);
}

void loop() {
    if (digitalRead(SENSOR)==0) { 
      // lámpa be vagy ki
      isOn=!isOn;
      if (isOn) {
        digitalWrite(LED,HIGH);
      }
      else {
        digitalWrite(LED,LOW);
      }
      delay(500); // Kicsit nem figyelünk a többi apró jelre        
    }
}

Na, így már egész jó, átmenetileg!

Miért bazsevál az infravevő?

Ez az egész macera azért van, mert meg kell különböztetni, hogy melyik gombot nyomták meg. Természetesen azt is jó lenne megkülönböztetni, hogy melyik eszköznek szól a parancs, hiszen nem lenne jó, hogyha a tévé bekapcsolásakor ugyanazzal a gombnyomással a légkondit maxihidegre állítanánk.

Megmértem, hogy egy távvezérlő két gombja közt mi a különbség:

Két gombnyomás közti különbség

Hogyan megy adat az infravevőn?

Ok, szóval morzézik. De mit és hogyan? Erre sajnos sok, egymástól nagyon különböző szabványos megoldás létezik. A legelterjedtebb megoldás neve nem Morze-kód, hanem RC-5 kód.

Az elv egyszerű:

(Ha fényt érzékel az infra érzékelő, akkor lesz 0V a kimenetén, ezért néz ki a dolog fordítva.) Idődiagramon nézve a bazseválásból most már látszanak a bitek!

RC5 kommunikáció

A teljes 14 bites kód úgy néz ki, hogy: