Forum: Projekte & Code AVR ATmega48 RUWIDO Merlin IR Keyboard Dekoder (Pinchange Interrupt basiert)


von Guenter B. (gooofy)


Angehängte Dateien:

Lesenswert?

Hier ist ein kleines Nebenprodukt eines größeren AVR-basierten 
Embedded-Projekts, an dem ich dieser Tage arbeite: Ein pinchange 
Interrupt basierender, MIT-lizensierter Dekoder fuer die RUWIDO Merlin 
Infrarottastatur (gibt's derzeit fuer 2,95 EUR bei Pollin - und kommt 
sogar im US-Layout :) )

Was diese Implementierung grundsaetzlich von IRMP (welches ein tolles 
Projekt ist - meiner Erfahrung nach fuer alles ausser der Ruwido 
Tastatur ;) ) unterscheidet ist, dass der Timer nur als Zeitnormal 
genommen wird, die Interrupt-Routine wird dagegen nur dann aufgerufen, 
wenn tatsaechlich eine Veraenderung am Eingangspin eintritt 
(pinchange-Interrupt). Das Vorgehen hat einige Vorteile:

- geringere CPU-Last (weil die ISR nur aufgerufen wird, wenn wirklich 
was zu tun ist)
- robuster wenn viel andere CPU-Last auftritt (weil seltener Interrupts 
abzuarbeiten sind entsprechend geringer die Gefahr, welche zu verpassen)

Der Code erkennt auch das NEC-Protokoll und sollte an viele andere 
Protokolle angepasst werden koennen, DEBUG/LOG - Moeglichkeiten sind 
vorhanden. Die Schnittstelle / Datenstrukturen sind sehr aehnlich zu 
IRMP. Natuerlich darf mein Code und alle daraus gewonnenen Erkenntnisse 
in IRMP verwendet werden - falls hier jemand vom IRMP Projekt mitliesst 
:) Mehr infos siehe ir/ir.h und ir/ir.c .

Das enthaltene Test-Programm loggt einfach die erkannten IR-Events auf 
der seriellen Schnittstelle (38400 8N1):

IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x0AB4 flags=000 cnt=030 data=0x0AAACAB4
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x02B5 flags=000 cnt=028 data=0x02AAB2B5
IR:  adr=0x2AAB cmd=0x02B5 flags=000 cnt=028 data=0x02AAB2B5
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x2AAB cmd=0x0000 flags=001 cnt=016 data=0x00002AAB
IR:  adr=0x22D6 cmd=0x0867 flags=000 cnt=032 data=0x22D69867
IR:  adr=0x22D6 cmd=0x02CD flags=000 cnt=032 data=0x22D632CD
IR:  adr=0x22D6 cmd=0x0A75 flags=000 cnt=032 data=0x22D68A75
IR:  adr=0x22D6 cmd=0x00DF flags=000 cnt=032 data=0x22D620DF
IR:  adr=0x22D6 cmd=0x08D7 flags=000 cnt=032 data=0x22D628D7


0x2AAB ist RUWIDO, 0x22D6 ist NEC. Die Tastatur schickt dauernd events 
wenn eine Tastate gedrueckt gehalten wird (flags==0) und produziert auch 
key-up events, wenn sie losgelassen wird (flags==1).

Code haengt an diesem Posting, englischer Blogeintrag samt Bildchen 
dazu:

https://sites.google.com/site/guenterbartsch/blog/avratmega48ruwidomerlinirkeyboarddecoder

von Guenter B. (gooofy)


Angehängte Dateien:

Lesenswert?

Sorry, dem Anhang fehlte die File-Extension (war ein tar.gz). Hier 
nochmal mit extension.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Guenter B. schrieb:
> Was diese Implementierung grundsaetzlich von IRMP (welches ein tolles
> Projekt ist - meiner Erfahrung nach fuer alles ausser der Ruwido
> Tastatur ;) ) unterscheidet ist, dass der Timer nur als Zeitnormal
> genommen wird, die Interrupt-Routine wird dagegen nur dann aufgerufen,
> wenn tatsaechlich eine Veraenderung am Eingangspin eintritt
> (pinchange-Interrupt). Das Vorgehen hat einige Vorteile:

Du hast vollkommen recht: die Ruwido-Tastatur wird von IRMP nicht 
unterstützt. Die Idee, den PinChange-Interrupt zu verwenden, habe ich 
auch schon gehabt. Natürlich sinkt dadurch die CPU-Last. Ich wollte 
schon immer im IRMP einbauen, dass die Methode, ob PCINT oder Timer als 
Basis verwendet werden soll, konfigurierbar ist. Bisher habe ich die 
Arbeit daran aber gescheut. Da zudem IRMP mittlerweile auch auf PIC und 
STM32 portiert ist, weiß ich nicht, was da alles noch notwendig ist, um 
das Ganze noch portabel zu halten.

> Der Code erkennt auch das NEC-Protokoll und sollte an viele andere
> Protokolle angepasst werden koennen, DEBUG/LOG - Moeglichkeiten sind
> vorhanden. Die Schnittstelle / Datenstrukturen sind sehr aehnlich zu
> IRMP. Natuerlich darf mein Code und alle daraus gewonnenen Erkenntnisse
> in IRMP verwendet werden - falls hier jemand vom IRMP Projekt mitliesst

Ich lese mit - seit heute. Gute Arbeit, ich werde Dein Projekt weiter 
verfolgen :-)

Gruß,

Frank

von Guenter B. (gooofy)


Angehängte Dateien:

Lesenswert?

> Du hast vollkommen recht: die Ruwido-Tastatur wird von IRMP nicht
> unterstützt. Die Idee, den PinChange-Interrupt zu verwenden, habe ich
> auch schon gehabt. Natürlich sinkt dadurch die CPU-Last. Ich wollte
> schon immer im IRMP einbauen, dass die Methode, ob PCINT oder Timer als
> Basis verwendet werden soll, konfigurierbar ist. Bisher habe ich die
> Arbeit daran aber gescheut. Da zudem IRMP mittlerweile auch auf PIC und
> STM32 portiert ist, weiß ich nicht, was da alles noch notwendig ist, um
> das Ganze noch portabel zu halten.

kann ich gut nachvollziehen - IRMP hat eine enorme Breite, sowohl was 
Plattformen als auch Protokolle angeht (Hut ab!) - ich dachte ehrlich 
gesagt auch eher daran, den Ruwido-Support in IRMP zu verbessern - bin 
aber nicht sicher, wie schwierig das ist (ich steige durch den IRMP-Code 
nicht komplett durch, bin also nur eine begrenzte Hilfe).

Was mir aufgefallen ist: Die Tastatur arbeitet mit variabler Anzahl bits 
- mal sendet sie nur 16 (wenn eine Taste losgelassen wurde), mal 26 bis 
hin zu 33 bits, wenn eine Taste gedrueckt wird. Und leider kann man am 
Prefix nicht erkennen, wie viele Bits noch kommen werden.

Noch unangenehmer ist, dass die Tastatur nicht immer Pausen macht 
zwischen den einzelnen Paketen - vor allem, wenn man schnell tippt oder 
Tasten gedrueckt haelt oder mehrere Tasten gleichzeitig drueckt. Ich 
habe sogar beobachtet, dass Datenpakete einfach abgebrochen werden und 
sofort ein neues, vollstaendiges Paket beginnt.

Wirklich festhalten kann man sich nur an den Pausen: wenn man auf eine 
Pause trifft kann man recht sicher sein, dass die letzten 16 oder 26-33 
Bits gueltig gewesen sein muessten.

Weiss nicht, ob diese Erkenntisse hilfreich sind - war aber das, was 
mich Zeit und Nerven gekostet hat.



>
>> Der Code erkennt auch das NEC-Protokoll und sollte an viele andere
>> Protokolle angepasst werden koennen, DEBUG/LOG - Moeglichkeiten sind
>> vorhanden. Die Schnittstelle / Datenstrukturen sind sehr aehnlich zu
>> IRMP. Natuerlich darf mein Code und alle daraus gewonnenen Erkenntnisse
>> in IRMP verwendet werden - falls hier jemand vom IRMP Projekt mitliesst
>
> Ich lese mit - seit heute. Gute Arbeit, ich werde Dein Projekt weiter
> verfolgen :-)

Ich muss gleich dazusagen, dass ich an dem IR-Code an sich gar nicht 
mehr so viel machen werde in naechster Zeit - wie gesagt, ist Teil eines 
groesseren Embedded Projekts und da gibt es noch einiges an anderer 
Firmware zu schreiben, dem werde ich mich bald zuwenden. Aber, heute 
gibt es auf jeden Fall noch ein Update: Ich habe einen kleinen FIFO 
eingefuehrt (8 Slots) in dem die IR-Eingaben gepuffert werden - damit 
auch ein langsames main() diese halbwegs sicher abholen kann - Update 
haengt an diesem Posting.


Gruesse,

   Guenter

von Fridolin O. (muebau)


Lesenswert?

Hi,
siehst du irgendwo Schwierigkeiten beim Versuch das Ganze auf einen 
USBasp zu portieren (atmega8, 12Mhz; INT0 PD2, PB0, PB1 belegt).
Es wäre ja noch ein Interrupt frei (INT1). Wie kritisch sind die 12 Mhz?

Ziel ist eine HID USB Tastatur mit V-USB zu bauen.

muebau

von Guenter B. (gooofy)


Lesenswert?

Hi!

Fridolin Onteca schrieb:
> Hi,
> siehst du irgendwo Schwierigkeiten beim Versuch das Ganze auf einen
> USBasp zu portieren (atmega8, 12Mhz; INT0 PD2, PB0, PB1 belegt).
> Es wäre ja noch ein Interrupt frei (INT1).

kenne den usbasp selber leider nicht - der freie Interrupt ist aber auf 
jeden fall schonmal ein Anfang :) Spontan frage ich mich noch, ob das 
v-usb in Timingprobleme laufen kann, wenn es durch den 
Hardware-Interrupt gestoert wird


> Wie kritisch sind die 12 Mhz?

Timer1 wird als Zeitnormal verwendet - die Konstanten in ir/ir.c
1
#define RUWIDO_SHORT_MIN 10
2
#define RUWIDO_SHORT_MAX 16
3
4
#define RUWIDO_LONG_MIN  23
5
#define RUWIDO_LONG_MAX  30
6
7
#define RUWIDO_MIN_NUM_BITS  26
8
#define RUWIDO_MAX_NUM_BITS  33
9
10
...

sind dann alle in Timer-Einheiten experimentell ermittelt - und die 
stimmen dann natuerlich nicht mehr, wenn sich der CPU-Takt aendert. 
Naheliegend gibt es zwei Loesungsmoeglichkeiten:

- Timer umkonfigurieren, dass er wieder so schnell wie mit 16MHz laeuft
- die Werte oben umrechnen (t * 12 / 16 muesste eine guten Startwert 
liefern)


> Ziel ist eine HID USB Tastatur mit V-USB zu bauen.

oh, das klingt natuerlich wie ein schoenes Projekt :)

viele gruesse,

   guenter

von Vlad T. (vlad_tepesch)


Lesenswert?

Fridolin Onteca schrieb:
> Ziel ist eine HID USB Tastatur mit V-USB zu bauen.

aber warum dann usbasp?
es gibt auf der V-USB-Seite auch Beispielprojekte, die direkt eine 
HID-Tastatur implementieren.

von Fridolin O. (muebau)


Lesenswert?

Vlad Tepesch schrieb:
> Fridolin Onteca schrieb:
>> Ziel ist eine HID USB Tastatur mit V-USB zu bauen.
>
> aber warum dann usbasp?
> es gibt auf der V-USB-Seite auch Beispielprojekte, die direkt eine
> HID-Tastatur implementieren.

Hi,
nun der USBasp wird von mir nur als billige Hardwareplattform verwendet. 
Seit dem es den für ~$3 (ca. 3 €) bei ebay.com aus China gibt, verwende 
ich den oft für solche Spielereien. Die Bauteile sind bei Reichelt 
teurer als diese kompletten Platinen.

muebau

BTW:
Sollte jemand eine ähnlich billige Alternative kennen immer her damit.

von Alexander (Gast)


Lesenswert?

Hallo,

ich habe mal den Decoder mit V-USB zusammengestrickt. Näheres hier: 
Beitrag "RUWIDO Merlin IR-USB-HID Receiver"

Gruß,

Ali

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.