mikrocontroller.net

Forum: Projekte & Code Universeller IR-Receiver für viele Protokolle


Autor: Frank Boe (frank_boe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei ein Stückchen Code zum IR-Empfang.
Es ist theoretisch für so gut wie alle Fernbedienungsprotokolle 
einsetzbar.

Die Idee dahinter:
Die Kenntnis des Übertragungsprokolls ist nicht notwendig, es kommt nur 
darauf an, für jede Taste auf der FB einen anderen Wert zu bekommen.

Das Programm misst die Hi-und Lo Zeiten der Übertragung, speichert sie 
in einer temporären Tabelle, normiert sie und wendet dann eine 
Hashfunktion (hier der Einfachheit halber CRC32, weil der STM32 das in 
Hardware kann, es gehen aber auch andere nicht zu einfache 
Hashfunktionen) darauf an.

Ergebnis ist ein 32-Bit Wert, der für jede Taste auf der FB anders ist.

Bei manchen Protokollen bekommt man mehrere Werte, das liegt an den 
Protokollen selbst. In diesem Fall einfach den ersten benutzen... :-)

Die Normierung ist der Knackpunkt, und noch verbesserungswürdig, 
allerdings gehen bereits jetzt sämtliche bei mir im Betrieb und in den 
Schubladen "endgelagerten" befindliche Fernbedienungen problemlos :-)
Das ein oder andere Protokoll wird sicherlich nicht funktionieren, aber 
das allermeiste geht, glaube ich.
Wichtig ist, daß das zur FB passende IR-Empfänger-IC benutzt wird (u.a. 
passende Trägerfrequenz) , andernfalls sinkt die Erkennungsrate 
drastisch.


Portierbar auf so gut wie jede andere CPU (nat. auch AVR), es braucht 
nur einen Eingangspin, einen Timer, sowie eine gute Hashfkt. 
(http://de.wikipedia.org/wiki/Hash)

Autor: Name (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und dass funktioniert wirklich ?

Autor: Frank Boe (frank_boe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Name schrieb:
> Und dass funktioniert wirklich ?

Viel besser als man angesichts des kurzen Quelltextes glauben mag.

Bei meiner SIRCs (Sony) FB die ich hauptsächlich in meinem aktuellen 
Projekt verwende z.B. habe ich bisher keinen einzigen Empfangsfehler 
festgestellt.

Man kann das ganze noch geschickter mittels eines Input-Capture machen,
zugunsten einer leichteren portierbarkeit habe ich allerdings die 
Version ohne gepostet. Wenn die CPU viel mit anderen 
(höherpriorisierten) Interrupts zu hat, ist Input-Capture auf jeden Fall 
besser.

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch ein interessanter ansatz, einfach garnicht zu erkennen, was der 
hersteller senden wollte, sondern nur pulse durch einen CRC32 wursteln.

Wie siehts da beim rc5-protokoll mit dem togglebit aus? das wird man 
doch eigentlich nicht einzeln erkennen können, oder?

Autor: Frank Boe (frank_boe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Di Pi schrieb:
> auch ein interessanter ansatz, einfach garnicht zu erkennen, was der
> hersteller senden wollte, sondern nur pulse durch einen CRC32 wursteln.
>
> Wie siehts da beim rc5-protokoll mit dem togglebit aus? das wird man
> doch eigentlich nicht einzeln erkennen können, oder?

Einzeln nicht. Wozu auch - wenn man will kann man das Toggelbit - das in 
einem anderen Rückgabewert (ir_getkeypress()) resultiert - auswerten.

Auch Wiederholungscodes sind so natürlich auswertbar - wenn man möchte.

Autor: Frank Boe (frank_boe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei ein Bugfix.
Ein kl. Fehler führte u.U. zu zusätzlich "erkannten" Bits.
Jetzt noch stabilere Erkennung.

Autor: Frank Boe (frank_boe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich die Buggy-Version von ganz oben löschen ?

Autor: Frank Boe (frank_boe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier eine Hashfunktion, die auf einem AVR wesentlich schneller und 
kürzer als CRC32 ist, und für die IR-Routine ausreichend zu sein 
scheint:

Es handelt sich um einen abgespeckten Jenkins hash 
http://en.wikipedia.org/wiki/Jenkins_hash_function
int hash;

static inline void hash_reset(void) 
{
    hash=0;
}

static inline void hash_calc(uint32_t dat) 
{
    hash += dat;
    hash += (hash << 10);
    hash ^= (hash >> 6);
}

static inline uint32_t hash_get(void) 
{
    return hash;
}

Autor: Tommy R. (tommy_r)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei der IR Code fuer STM32f4. Vielleicht erspart das dem ein oder 
anderen etwas Arbeit.

Die urspruengliche Version war etwas inkonsistent mit der Handhabung 
einiger Konstanten -> Ebenfalls geaendert (z.B. fixe Groesse TIM6)

Ist ausgelegt fuer Pin E9.

Autor: Info (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, ich dachte, http://www.mikrocontroller.net/articles/IRMP macht das 
auch per Hash. Stimmt aber nicht.

Autor: Frank B_. (frank_b) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin ja neugierig: Hat das jemand benutzt ?

Bin gerade dabei das für Arduino auf einem Teensy (ARM 96MHZ, 128KB 
Flash, 64KB RAM) umzubasteln.

Frank.

Autor: hobbychemiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Boe schrieb:
> Hier eine Hashfunktion, die auf einem AVR wesentlich schneller und
> kürzer als CRC32 ist, und für die IR-Routine ausreichend zu sein
> scheint:

Fehlt da nicht eine schleife?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.