ATmega8 - Infravörös jelrögzítő

2013-07-20

 

Belefogtam, hogy megszelidítsem az infravörös távirányítókat. Számos klassz dologra lenne alkalmazható. Például lehetne vele olyan áramkört építeni, amihez nem kell külön billentyűzet. De hagyományosan lehetne vele távirányítani is valamit. Lehetne rejtett áramköröket működtetni, vagy kódzárat készíteni. Emlékeztem, hogy eltettük egy-két régen kimúlt készülék távirányítóját. Mire felforgattam a lakást, megdöbbentem mennyit spájzoltuk el.

Olvastam az Internetenm, hogy RC5 protokoll meg minden... gyere cipó, hamm bekaplak. Persze nem. Elkezdtem próbálgatni őket, nemsokára az őrület szélére kerültem. Sem a leírások nem stimmeltek, sem semmi nem stimmelt, már kezdtem a hajamat tépni. Gyakorlatilag szinte az összes távirányítóból más és más kód jött. Sajnos nincs tároló scope-om, ezért készítettem egy regisztrálót, amivel fel tudtam venni a kiadott jelet.

Az áramkör nem túl bonyolult. Valamikor réges-régen, egy régi középiskolában próbálkoztunk hasonló problémával. Célszerűbb fototranzisztor helyett komplett vevőegységet használni, mert több gondot is levesz a vállunkról. Előszőr is egy látszólag fekete műanyagba van öntve, ami valójában infravörös szűrő. Van benne egy autómatikus erősítés szabályozott vevőáramkör, ami a a bejövő jelet szűri is. Az adás tulajdonképpen 36kHz környéki (gyártótófüggő) impulzus csomagokat használ. Maguk az adatbitek inkább msec tartományba (megint gyártófüggő) esnek. Valójában az RC5 csak Philips protokolja, a különböző gyártmányok mást és mást használnak, ezért azután az adatbitek értelmezése is eltérő. Ami bizonyos, hogy az adás egy hosszú burst jellel kezdődik, hogy a vevő áramkörnek legyen ideje felébredni, és beállni rá. Ennek hossza is gyártófüggő.

Szóval egy ilyen 200Ft-os vevő kimenetén már ezt a szép szűrt digitális jelet kapjuk. Alaphelyzetben a kimenete H-ban van, amikor megjelenik az infravörös adás, lemegy L-ba. Itt látható a vevő egység bekötése:

Az eredeti terv az volt, hogy a INT0 megszakítás lábra jön be a jel, és majd megszakítás kezeléssel figyelem. Ezt az elképzelést azután egy időre félretettem, de a INT0 (PD2) ugyanúgy megfelelet bemenetenek, mint akármelyik másik port láb. Ez a drótgubanc valósítja meg a fenti kapcsolást:

Az áramkör úgy működik, hogy megnyomjuk a RESET gombot. Ekkor az áramkörünk a soros vonalon keresztül elküld egy KT-IRR üzenetet. Ezután ha a távirányítón lenyomunk egy gombot, rögzíti a jelet, majd soros vonalon elküldi a mért értékeket, majd a program befejeződik, a RESET gombbal lehet újraindítani. A soros vonali jelet egy terinál programmal lehet elkapni, én most a TeraTerm-et alkalmaztam, mert azt meg tudtam győzni, hogy 150 karakter széles legyen.

Alább látható néhány regisztrátum. Sajnos kicsit le kellett a végükből csípnem, mert nem fértek ki teljes hosszban. Ezt úgy kell értelmezni, hogy az első szakaszban vegyesen több távirányító az 1-es gomb lenyomása adott jele van, azt demonstrálandó, hogy mindegyik eltérő. A második szakasz úgy készült, hogy egy Sony távirányítón 1..0-ig végignyomkodtam a gombokat. A Sony SIRC protokolt használ. Utána egy Philips távirányító jön. Végül egy Auchan-ban egy híjján 1000Ft-os Somogyi (értsd dél-Tajvan-Kínai-dzsunka) univerzális (vagyis igazából semmire sem jó) távirányító jele van, amit megpróbáltam a 0126-os kóddal Sony kompatibilis üzemmódba kapcsolni. (Azért vettem egy ilyet, mert további terveim vannak, és ha valami reprodukálhatót akarok a későbiekben készíteni, ahhoz olyan távirányító kell, ami másnak is beszerezhető. Lehetne távirányítót építeni is. Előnye lenne, hogy olyan protokolt készíthetne az ember, amilyet akar, szóval teljesen secured lehetne. De sokkal drágább lenne, és bénán nézne ki. ) Az első számjegy msec-ben megadja a bevezető burst jel hosszát. Azután a / \ jelek szimbolizálják a jel fel és lefutását, a hexa számok pedig a jel hosszát lehet leolvasni, x 14usec-ben. Azért esett erre az értékre a választásom, mert a busrst jel frekvenciája általában 36kHz, vagyis 1/72000sec=14usec pontosabban nincs értelme mérni.

Vegyes
19-/1E\2B/25\2A/24\2B/24\2B/24\2B/24\2B/24\2B/24\2B/24\52/25\2B/24\52/24\53/24\2B/24\52/24\2B/24\53/24\52/24\53/24\52/25\52
19-/20\2B/24\2B/25\2B/24\2B/25\2B/24\2B/25\2B/24\2B/25\2B/24\53/24\2C/24\2B/25\52/25\53/24\2C/FF\A3/24\2C/24\2B/24\2C/24\2B
06-/5F\25/1E\25/63\25/1E\25/1E\25/1F\25/1E\25/62\25/62\25/1E\25/FF\25/61\26/1E\25/62\25/1F\25/1E\25/1E\25/1F\25/61\25/62\25
0A-/34\79/38\3F/37\3F/38\3E/38\3E/38\3E/38\3F/37\3F/38\3E/38\3E/38\3F/73\3E/FF\3E/38\7A/38\3E/38\3E/38\3F/37\3F/38\3E/38\3E
5A-/FF\28/6C\2A/21\28/21\2A/21\2A/6B\29/6D\28/21\2A/21\29/22\28/6C\29/6B\2A/6C\28/22\29/21\2A/6B\29/6D\28/21\2A/21\29/22\28
5A-/FF\2A/6D\28/21\2A/21\28/6E\29/22\27/24\28/6D\27/24\28/22\29/6D\28/6D\28/23\28/6D\28/6D\2A/21\28/6D\2A/22\27/6E\29/6D\28
Sony RMT-CF15CPAD 1-2-3-4-5-6-7-8-9-0

19-/20\2B/24\2C/24\2B/24\2B/25\2B/24\2B/25\2B/24\2C/24\2B/25\52/25\2B/24\2B/25\53/24\53/25\2B/FF\A2/25\2B/24\2B/25\2B/24\2B
19-/20\54/23\2D/22\2D/23\2D/23\2B/24\2D/23\2C/23\2D/22\2B/25\55/23\2A/25\2D/22\55/23\54/23\2B/FF\A4/23\52/25\2D/22\2D/23\2D
19-/20\2B/24\53/25\2A/25\2D/23\2A/25\2B/24\2B/25\2D/22\2D/23\54/23\2D/23\2D/22\55/23\54/23\2B/FF\A3/25\2A/25\55/23\2A/25\2B
19-/20\54/23\54/23\2B/25\2D/22\2D/23\2B/24\2B/25\2C/23\2B/25\55/22\2B/25\2C/23\53/25\54/23\2D/FF\A2/25\53/24\53/25\2C/23\2B
19-/20\2C/23\2B/25\54/23\2B/25\2A/25\2B/24\2B/25\2D/23\2C/23\53/24\2D/23\2D/22\53/25\54/23\2B/FF\A4/23\2B/24\2B/25\54/23\2B
19-/20\54/23\2B/25\54/23\2D/23\2A/25\2B/25\2C/23\2D/23\2C/23\53/25\2B/24\2B/25\54/23\54/23\2D/FF\A4/23\55/22\2D/23\53/24\2D
19-/20\2A/25\53/25\54/23\2B/25\2A/25\2D/23\2C/23\2D/22\2D/23\53/25\2A/25\2B/24\53/25\54/23\2B/FF\A4/23\2D/23\52/25\53/24\2D
19-/20\53/24\53/24\55/23\2C/24\2A/25\2B/24\2D/23\2D/22\2B/25\53/24\2D/23\2B/24\53/25\52/25\2D/FF\A4/23\53/25\54/23\53/24\2D
19-/20\2C/23\2D/23\2C/23\55/23\2C/23\2B/24\2B/25\2D/23\2A/25\53/24\2B/25\2D/22\55/23\53/24\2D/FF\A5/23\2C/23\2D/23\2C/23\53
19-/20\2B/24\2B/25\54/23\55/22\2D/23\2D/23\2A/25\2D/22\2D/23\53/25\2C/23\2C/23\55/23\54/23\2D/FF\A4/23\2D/22\2D/23\55/23\54
Philips RCT video rt112 1-2-3-4-5-6-7-8-9-0

0A-/34\3E/38\79/38\3E/39\3E/38\3E/38\3E/38\3E/39\3E/38\3E/38\3E/38\3F/73\3E/FF\3E/38\3E/38\79/39\3E/38\3E/38\3E/38\3E/39\3C
0A-/34\79/38\3E/38\3E/39\3D/39\3E/38\3E/38\3E/39\3E/38\3E/38\3E/73\78/FF\3E/38\7A/38\3E/38\3C/3A\3E/38\3E/38\3F/38\3E/38\3E
0A-/34\3E/38\79/38\3E/39\3E/38\3E/38\3E/38\3E/38\3F/38\3E/38\3E/74\3E/38\3E/FF\3C/3A\3E/38\78/3A\3E/38\3E/38\3E/38\3E/39\3E
0A-/34\79/38\3E/38\3E/39\3C/3A\3E/38\3E/38\3E/39\3E/38\3C/75\79/39\3E/FF\3E/38\78/3A\3E/38\3E/38\3E/38\3E/39\3E/38\3E/38\3C
0A-/33\40/37\7B/36\40/37\40/36\40/36\40/36\3E/38\40/37\40/71\7B/72\40/FF\3C/3A\3E/38\78/3A\3E/38\3C/3A\3E/38\3E/39\3C/3A\3E
0A-/34\77/3A\3E/38\3E/39\3E/38\3E/38\3E/38\3E/39\3C/3A\3E/73\3F/38\79/FF\3E/38\7A/38\3E/38\3C/3A\3E/38\3E/39\3E/38\3E/38\3E
0A-/34\40/36\7B/36\3F/37\41/36\3E/38\40/36\3F/37\41/36\40/71\40/37\40/36\40/FF\3F/38\3C/3A\79/39\3E/38\3E/38\3C/3A\3E/38\3E
0A-/33\7E/34\40/36\40/36\41/36\40/36\40/36\40/36\41/71\7B/36\41/36\40/FF\40/36\7B/37\40/36\40/36\42/34\3E/39\41/35\40/36\40
0A-/34\7B/36\40/36\40/37\40/36\40/36\40/36\3F/37\43/6F\7C/36\40/71\42/FF\40/36\7B/37\41/35\40/36\40/36\41/36\40/36\40/36\40
0A-/33\41/36\7B/36\40/36\41/36\42/34\40/36\40/36\41/36\40/36\40/36\40/37\40/FF\40/37\42/34\79/38\41/36\42/34\42/34\40/36\41
Somogyi URC20 (0126) 1-2-3-4-5-6-7-8-9-0

19-/22\26/2B\26/2B\26/2B\26/2B\26/2A\26/2B\26/2B\54/26\26/2A\26/2B\26/2B\26/FF\A5/25\26/2B\25/2B\26/2B\26/2B\26/2B\26/2B\26
19-/22\52/28\26/2B\26/2A\26/2B\27/2A\26/2B\26/2B\52/27\27/2A\26/2B\26/2B\26/FF\A5/25\54/26\26/2B\26/2B\26/2B\25/2B\26/2B\26
19-/22\26/2B\56/23\27/2A\27/2A\26/2B\26/2B\26/2B\56/23\27/2A\26/2B\26/2B\26/FF\A6/23\27/2A\56/24\26/2B\26/2B\26/2A\27/2A\27
19-/22\58/22\56/24\26/2A\27/2A\27/2A\26/2B\26/2B\56/24\26/2A\27/2A\26/2B\26/FF\A7/23\56/24\55/24\26/2B\26/2B\26/2B\26/2B\26
19-/22\27/2A\26/2B\54/26\26/2B\26/2B\25/2B\26/2B\56/24\26/2B\27/29\27/2A\26/FF\A6/23\27/2A\26/2B\56/24\26/2B\26/2B\26/2A\26
19-/22\56/24\26/2B\55/24\27/2A\28/29\28/29\28/29\56/23\27/2A\28/29\2A/27\26/FF\A6/24\54/26\27/29\56/24\26/2B\28/29\28/29\27
19-/22\26/2B\54/26\55/24\28/29\26/2B\26/2B\26/2B\54/26\26/2A\26/2B\26/2B\2A/FF\A7/23\28/29\54/26\55/24\27/2A\26/2B\26/2B\26
19-/22\58/22\56/24\57/22\27/2A\27/2A\26/2B\26/2B\56/24\26/2A\27/2A\26/2B\26/FF\A7/23\56/24\55/24\54/26\26/2B\26/2B\26/2A\27
19-/22\26/2B\26/2B\26/2B\55/24\27/2A\26/2B\26/2B\54/26\26/2A\27/2A\26/2B\28/FF\A6/24\27/29\28/29\28/29\54/26\28/28\28/29\28
19-/22\56/24\26/2B\26/2B\55/24\27/2A\28/29\26/2B\56/24\26/2A\27/2A\26/2B\26/FF\A7/23\56/23\27/2A\28/29\56/24\28/29\26/2B\27

Alább látható az áramkörhöz tartozó program. A MINTA értékével lehet meghatározni, hány félperiódust mérjen az áramkör. Páratlan számot célszerű alkalmazni, mert az első szám a bevezető burst hossza, Előszőr 100usec-os lépésekben, majd az adatok félperiódusait 14usec-es lépésekben méri. A távirányítók tulajdonképpen egy gomb lenyomását követen nem csak egyszer adják le a kódot, hanem folyamatosan ismétlik Két kód között ismét jön a hosszabb szünet, ez látható, amikor FF hosszúságú szakaszt találunk a regisztrátumban. Ezért oda kellett figyelni a programban, hogy a számláló ne pördüljön át. Az OPTO-nál lehet megadni esetleg eltérő lábat, amit figyelni kell. Remélem részletesebben nem kell a programot magyarázni, ebben már bevetettem a legújabb megoldásaimat, amiről az előző lapomon írtam.



/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2013.07.19.
*   Chip         -  Atmel ATmega8
*   Compiler     -  avr-gcc (WinAVR)
*
*   KT IRR - Infra Reed Recorder
*   
********************************************************************************
*
*   AVR  4 - PD2 (INT0) - TSOP 2236 2
*   AVR  1 - NRES       - switch 4k7-tel felhuzva
*   AVR 15 - PB1        - LED 470R-el felhuzva
*
*******************************************************************************/

#define F_CPU                4000000             // orajel 4MHz
#define MINTA                51




#include "tkiraaly_atmega8.h"
#include <util/delay.h>




#define OPTO_0               BTC( PIND, 2)
#define OPTO_1               BTS( PIND, 2)




void usart_putc( U8);                  // USART egy karakter kuldese
void usart_puthexc( U8);               // 1 hexadecimalis szamjegy kiirasa
void usart_puthex( U8);                // 1 byte kiirasa hexadecimalisan




int main( void)
{
   U8 d[ MINTA+ 1];                    // mert idok
   U8 c;                               // szamlalo
   U8 i;                               // index d[]-hez
   USART_SET_9600_8N1;
   PIN_B1_OUT;                         // LED

   usart_putc('K');
   usart_putc('T');
   usart_putc('-');
   usart_putc('I');
   usart_putc('R');
   usart_putc('R');
   usart_putc( 13);

   while( OPTO_1);                     // varakozas, amig nincs jel
   c= 0;
   while( OPTO_0)                      // bevezeto szakasz merese msec
   {
      _delay_us(100);
      c++;
   }
   d[ 0]= c;
   i= 1;
   while( i < MINTA)
   {
      c= 0;
      while( OPTO_1)                   // szunet
      {
         _delay_us(14);                // 1/(36kHz*2)
         if( c < 255) c++;             // ne forduljon at
      }
      d[ i]= c;
      i++;
      c= 0;
      while( OPTO_0)                   // jel
      {
         _delay_us(14);
         if( c < 255) c++;
      }
      d[ i]= c;
      i++;
   }
   i= 0;                               // kiiras
   usart_puthex( d[ i++]);
   usart_putc( '-');
   while( i < MINTA)
   {
       usart_putc( '/');
       usart_puthex( d[ i++]);
       usart_putc( '\\');
       usart_puthex( d[ i++]);
   }
   usart_putc( 13);
   for(;;);
   return 0;
}



        
void usart_putc( U8 c)                 // USART egy karakter kuldese
{
    while( BTC( UCSRA, UDRE));         // 1, ha kesz az adat fogadasara
    UDR= c;
}



 
void usart_puthexc( U8 c)              // 1 hexadecimalis szamjegy kiirasa
{
   c&= 0x0F;
   if( c < 10) c+= '0';
   else        c+= 'A'- 10;
   usart_putc( c);
}



 
void usart_puthex( U8 c)               // 1 byte kiirasa hexadecimalisan
{
   usart_puthexc( c >> 4);
   usart_puthexc( c);
}

Itt a vége, fuss el véle, legytek az én vendégeim, innen letölthetitek a hozzávalókat összecsomagolva.