Távirányító az infravörös távirányítóról
Munka közben a projekt Az IR távirányító kezelése nem fejeződött be, úgy döntöttem, hogy néhány megoldást külön jegyzetekre (projektekre) emelek ki, különösen mivel néhányuk már nem szerepel a projektben.
Ma beszélni fogok az infravörös parcellák feldolgozásának algoritmusáról. (Korábban már leírták az IR csomópontok dekódolásának egyik lehetséges lehetőségét. Az infravörös távvezérlővel dolgozunk).
IR vevőkészülék, a legolcsóbb és alacsony feszültségű (2,5-5,5 V-os) teljesítményt tudom használni TSOP31236 (26 rubel):
Használhatja a Discovery sorozat STM8 / STM32 sorozatában.
A különféle háztartási készülékek infravörös távirányítói által létrehozott parcellák (protokollok) formátuma nagyon nagy.
A protokollok fő különbségei a következők:
- A "0" és "1" kódolás különbségei
- különböző hosszúságú parcellák
- különbségek az automatikus ismétlődő csapatokban
Például itt az ilyen jeleket az egyik távirányító hozza létre (hogyan lehet rögzíteni az itt olvasható jeleket? Az IR-konzol jelzései a hangkártyára):
Leginkább a csomagok formátuma hasonló a kiterjesztett NEC protokollhoz:
Összegyűjtöttem egy táblázatot a protokollok összehasonlítására (természetesen nem teljes, csak itt találtam):
Amint látja, elég nehéz a program protokollok dekódolására alkalmas program írása, túl sok különbség van köztük.
Különösen, ha figyelembe vesszük, hogy az impulzusidők száma (mind a szinkronizációs impulzusok kódolásához, mind a "0" és "1" kódoláshoz) lényegesen több, mint kettő.
Azonban az aktuális feladathoz (menedzsment) egyszerűen csak "elfogadni" és egyedileg kell azonosítani a csomagokat bármely konzolról, ez megkönnyíti a feldolgozási algoritmus egyszerűsítését.
Az algoritmus két kulcspontja:
Használjon relatív kódolást, vagyis az előző és az aktuálisan vett impulzus időtartamának összehasonlításával döntést hoz az aktuális impulzus "0" vagy "1" kódolásaként. Ha az aktuális impulzus rövidebb vagy hosszabb, mint az előző, az aktuális impulzust "1" -nek kódoljuk, különben "0" -ként.
Megjegyzés: Az impulzus az IR vevő kimeneti jelének azonos szélei közötti időintervallum.
A következő impulzussorozatot fogadták el.
1) A csomag első értéke csak összehasonlításra szolgál és nem kerül mentésre;
2) A második érték kisebb, mint az első, tehát az első bit "1" -nek felel meg;
3) A harmadik érték kisebb, mint a második, ezért a második bit "1";
4) A negyedik érték megegyezik a harmadik értékkel, ezért a harmadik bit "0";
A feldolgozás után megkapjuk a következő "110101" bináris szekvenciát.
Megszereztük a sorozat vágott a bal N-bit (Azért választottam a három bit bennük megkapja a preambulum és bit ismétlése), és ha a bitek számát kapott több mint 64, akkor csak az utolsó 64 bit. Az eredményül kapott sorrend a "zsugorodás" két bájtra történő mentését egy ciklikus redundáns kóddal (CRC16) (hash-kód) használja.
Algoritmus az infravörös vevőkészülék parcelláinak feldolgozásához (dekódolásához)
Az egyik időzítő az IR vevők dekódolására szolgál.
Az időzítőnek tartalmaznia kell egy rögzítőcsatornát egy külső I / O vonalról.
A munka magyarázata:
Megjegyzés az ábrához:
1) A számláló felméri a regiszterregiszter értékét. 2) Érkezéskor egy lefutó él (lehet változtatni emelkedő, amikor a kimeneti jel infravörös vevő nem fordított, bár általában úgy vélik, hogy az irányt a rögzítés nem befolyásolja az algoritmus) elfogott időzítő értéke számláló regiszter, és létrehoz egy megfelelő megszakítás. 2.1) A megszakításkezelőben a rögzített értéket elolvassa és a számláló nullázódik. 2.2) A kapott impulzusidők (kullancs időzítő), amelyek két csoportra oszthatók: az impulzusok rövidebb, mint 10 ms tartják információkat is (azaz, információkat tartalmaz a kód) gombot, az impulzusok hosszabbak, mint 10 ms vagy nullára vett határolójelként parcellák (t .. vagyis az előfeltétel kezdete). 3) Ha az infravörös vevõ kimeneti jelének leesési élét nem érkezik meg 20 ms-n belül, akkor egy interrupt generálódik (a második idõzítõ csatorna). Ez az esemény a csomag átvételének végét rögzíti.
Az algoritmus a vizsgálatot egy mikrokontroller STM8S003F3, időzítő neki a legegyszerűbb, ami világosan fogja végrehajtani ezt az algoritmust más mikrokontroller STM8 / STM32.
Időzítés beállítása (standard ST könyvtár használata):
A mikrokontroller a beépített RC oszcillátorral 16 MHz-en érkezik.
Kezelő (befogás és túlcsordulás):
Beviteli impulzusok sorozata:
A csomag átvételének vége (időtúllépéssel) és a csomag áttörési kódjának átvétele ("tömörítés"):
Parcellák fogadása és események készítése.
Véleményem szerint a beérkezett parcellák feldolgozása sokkal hosszabb ideig tart, mint maga a vétel (dekódolás), ami befolyásolhatja a parcellák vételét (átadás, hibák stb.).
Ebben az összefüggésben a feldolgozó kódot "kicsomagoljuk" a csomagdekódolóból egy másik kezelőhöz, amelyet minden 10 ms-ra hívunk.
Megpróbálom elmagyarázni, hogy ez hogyan működik (az időskála nem teljesül):
A legegyszerűbb lehetőség, ha csak egy csomag kerül feldolgozásra.
Vétel után a vétel befejezése jelzője be van állítva (ir_decoder.is_received).
A csomagkezelőben a csomag kézhezvételének végét jelző zászló ellenőrzi (és visszaállítja), ha be van állítva, akkor a csomagkód olvasható. Az olvasott csomagkódot "ismert" -el ellenõrizzük, véletlenszerûség esetén a "gomb megnyomása" esemény generálódik (feldolgozva).
130 ms elteltével (ez az idő magában a kezelőben számolódik), a "gomb megnyomva" esemény generálódik (feldolgozva).
A változat bonyolultabb, ha két különböző parcellát dolgoznak fel.
Az első fogadása után az "A" fogadási vége vége van.
A csomagkezelőben a zászló ellenőrzésre kerül, és a csomagkód olvasható, ha támogatott, akkor az esemény "gombja megnyomva" generálódik (feldolgozva) "A".
A második premissza jön a az időszak végén 130 ms, mivel a „független” kezelésekor helyesen vett és helyesen gyakorolják összes esemény küldjön „A”, azaz: az esemény „gomb megnyomásakor”, „B” és az esemény „gomb megnyomásakor”, „A”.
A 130 ms elteltével (ez az idő a kezelőben számolva) generálódik (feldolgozva) a "B gomb" nyomógombot.
A kezelő kódja nem eredményez.
Ez mind egyelőre.