Az éter hullámain

Az előző bejegyzésben volt róla szó, hogy nem feltétlen kell a meglévő beltéri egységünket szétszedni és átforrasztani, építhetünk helyette saját rádióvevőt is. A mai témánk ennek az opciónak a körüljárása lesz.

Ez a megközelítés annyira távol esik a hardver hack-eléstől, hogy még szét se kell szednünk a készüléket. A termék leírásában megtaláljuk a szükséges információkat, mint például azt, hogy 433,9 MHz-en küldözgeti a jelet. Kedvenc kínai webáruházunkból rendelhetünk is egy 433,9 MHz-es vevő egységet, én konkrétan ezt a modellt választottam, mindenféle különösebb megfontolás nélkül, de szerencsére bevált.

Következhet a türelmes várakozás, hogy elteljen az egy hónap körüli szállítási idő. Addig is, ha nagyon unatkozunk szétszedhetjük az egyik beltéri egységet és ráköthetjük egy Raspberry Pi-ra. :)

A csomag megérkezése után szomorúan szembesülhetünk a ténnyel, hogy az antennákat nem applikálták rá az eszközre, így nem ússzuk meg a forrasztgatást. Miután ezt megtettem, az első gondolatom az volt, hogy rákötöm a vevőegység adatkimenetét egy LED-re, csak hogy lássam, hogy van-e ott valami mozgolódás, ha megnyomom a csengőt.

Amit érdemes figyelni, hogy a videó elején random villog a LED, aztán már csak egy kis vibrálás érzékelhető a folyamatos világításhoz képest. Ezt követi egy hosszabb idejű lekapcsolás és felkapcsolás, majd újrakezdődik a random villogás. A csengő által küldött jel a "folyamatos" világítás és a hosszabb lekapcsolás/felkapcsolás lehet. A többi zaj egy kicsit nyugtalanító. Rengeteg szemét jön, amit figyelmen kívül kell hagyni majd valahogy.

Részletesebb elemzés

Jó lenne egy kicsit pontosabban látni, hogy mi is történik. Ráköthetnénk mondjuk egy logikai elemzőt az adatkimenetre, hátha abból kiderül, hogy mi is folyik itt. Szerencsére ebből is léteznek olcsó, kínai modellek, amit megrendelhetünk (én konkrétan ezzel mentem, de elég nagy a választék), majd az újabb hónap várakozás után haladhatunk is tovább a projekttel.

A gépen a PulseView nevezetű szoftvert győztem meg arról, hogy fogadja az adatokat. Alább látszik, hogy hogyan is néz ki egy csengő gombnyomás.

Az elején és a végén ott a random zaj, aztán egy sűrűbb, rendezettebb rész, amit egy hosszú kikapcsolás és bekapcsolás zár le. Ez szépen egybevág azzal, amit a LED-en tapasztaltunk. Nézzük meg egy kicsit közelebbről azt a rendezettebb részt:

Ezen a ponton vált át a random zaj a rendezettebb részbe. Úgy tűnik a jeladó ugyanazt a mintát ismétli kis szünetekkel, nagyjából száz alkalommal.

Még közelebbről megvizsgálva kétféle mintát vélhetünk felfedezni az ismétlődő mintán belül is. Az egyik, amikor egy hosszabb magas állapotot egy rövidebb alacsony állapot követ, ezt akár el is nevezhetjük bináris egyesnek, valamint egy rövid magas állapot, amit egy hosszabb alacsony állapot követ, amit hívhatunk akár bináris nullának is.

Nem tudjuk mit jelent ez a 17 bit, az is lehet, hogy az utolsó bit nem része az adatnak, hanem az ismétlődő minták közti elválasztóhoz tartozik. Ez esetben csak 16 bitünk van, ami mégis csak kerekebb. A jó hír viszont az, hogy ilyen mélységekig nem is kell belemennünk a dologba, mivel minden csengetésnél ugyanaz az adat, ezért nekünk most ez a jelentés nélküli minta is elég a projektünkhöz.

A készülék

A beltéri egységet először egy Arduino Uno-val próbáltam helyettesíteni, de nem igazán sikerült belőle ugyanazt a mintát kiszedni, mint amit a logikai elemző mutatott. Lehet, hogy túl lassú a hardver ahhoz, hogy egy ilyen sűrű jelet fel tudjon pontosan dolgozni, vagy én szúrtam el valamit, lényeg, hogy váltottam egy Teensy 3.1-es modellre, amivel sokat javult a helyzet.

Szerencsére az Arduino-ra megírt kódon nem kellett sokat változtatni, hogy működjön az új környezetében is. Először csak kiírattam vele a soros konzolra, hogy mennyi ideig van magas és alacsony állapotban a jel.

unsigned long high_value = 0;
unsigned long low_value = 0;
unsigned long prev_time = 0;

void setup() {
  Serial.begin(9600);

  attachInterrupt(23, rising, RISING);
}

void loop() {}

void rising() {
  low_value = micros() - prev_time;
  prev_time = micros();

  Serial.print("H");
  Serial.print(high_value);
  Serial.print(", L");
  Serial.println(low_value);

  attachInterrupt(23, falling, FALLING);
}

void falling() {
  high_value = micros() - prev_time;
  prev_time = micros();

  attachInterrupt(23, rising, RISING);
}

Egész könnyű volt kiszúrni az ismétlődő mintát:

H631, L140
H632, L142
H630, L144
H242, L533
H626, L145
H629, L146
H239, L536
H239, L532
H627, L143
H627, L146
H239, L536
H238, L535
H240, L532
H627, L143
H241, L534
H241, L534
H626, L1683

Némi ingadozással ugyan de szépen látszik a bináris nulla és egyes mintánk valamint az utolsó bit után következő nagyobbacska szünet is. Már csak le kell cserélni a konzolra írást a csengetés detektálásra és meg is vagyunk:

const unsigned short target = 60612;
unsigned short value = 0;

void rising() {
  // [...]

  if (high_value >= 620 && high_value <= 640 && low_value >= 130 && low_value <= 150) {
    value = (value << 1) + 1;
  }
  else if (high_value >= 230 && high_value <= 250 && low_value >= 520 && low_value <= 550) {
    value = value << 1;
  }
  else if (low_value > 1500) {
    value = 0;
  }

  if (value == target) {
    Serial.println("Ding-dong");
  }

  // [...]
}

A kód ugyan működik, de azért vannak benne huncutságok. Például a 17. bitet nem olvassa be (már ha ugye az az adat része, amit nem tudunk), az utána lévő hosszabb szünetet arra használja, hogy lenullázza az éppen aktuálisan összerakott értéket. De jobb is így, mert a short-ban el se férne.

Aztán mivel egy sokszor ismétlődő mintáról van szó, így egy csengetés során több "Ding-dong" üzenet is generálódik. Bár koránt sem annyi, amennyi minta egyébként érkezik. Ezt valószínűleg a határértékek szabadabb megválasztásával tudnánk orvosolni. Az igazi talán az lenne, ha figyelnénk a jelsorozatot lezáró hosszú alacsony és magas jelet is, de ezt meghagyom házi feladatnak.

Ha még ezek után sincs elegünk a rádiójelekből, érdekes projekt lehet még a jeladó beüzemelése is. Például egy saját csengő gomb készítése a beltéri egységeinkhez, vagy egy olyan univerzális gomb, ami az összes lehetséges jelet elküldi és minden beltéri egységet megcsenget. :)

Mást se szeretnél jobban, mint azonnal értesülni a friss tartalmakról? A legjobb helyen jársz! Feliratkozhatsz az oldal RSS feed-jére vagy követheted a blogot Twitteren.