Forum: Mikrocontroller und Digitale Elektronik Infrarot Empfänger "verschoben"


von Marco G. (flaschenpost)


Lesenswert?

Hi,

ich habe ein kleines Board mit Infrarotempfänger Keyestudio 
(http://www.keyestudio.cc/h-pd-78.html) an meinen Arduino gehängt und 
lese ihn mit der IRLib2 von Chris Young aus.

Anfangs läuft alles recht gut, gelegentlich aber "verhustet" sich der 
Empfänger und empfängt ab dann die Keys wiederholt anders.

Beispiel: Die Taste "OK" der mitgelieferten Fernbedienung empfängt er 
nach dem Start als "0x20D93043".

20D93043 = 100000110110010011000001000011

Tippt man aber ein wenig auf der Fernbedienung herum oder auch nur nach 
längerer Pause, kommt die Taste "OK" reproduzierbar als

D7E84B1B = 11010111111010000100101100011011

Auch alle anderen Tasten sind dann "verschoben".

Nach einem Arduino-Neustart kommt wieder die erste Variante.

Offenbar gibt es noch weitere "Verschiebungen", jetzt im Produktivmodus 
(ohne Debugger) hat er einmal anhaltend gar keine der beiden obigen 
Varianten erkannt (ich weiß aber nicht, was diesmal wirklich ankam, 
mangels Serial). Nach Restart des Gesamtsystems ging es dann wieder.

Kennt von euch einer den Effekt? Muss ich die IRLib2 gelegentlich 
"resetten"? Falls ja, habe ich noch keinen entsprechenden Befehl 
gefunden.

myReceiver.enableIRIn() rufe ich beim Aufwachen aus dem Ruhezustand aus. 
Ich habe auch schon versucht, nach jedem empfangenen "Befehl" ein 
enableIRIn() aufzurufen, aber das hat auch nicht geholfen.
1
#include <IRLibDecodeBase.h>
2
#include <IRLib_HashRaw.h>  //Must be last protocol
3
#include <IRLibCombo.h>     // After all protocols, include this
4
// Include a receiver either this or IRLibRecvPCI or IRLibRecvLoop
5
#include <IRLibRecv.h>
6
7
#define IR_PIN 2
8
9
IRdecode myDecoder;
10
11
IRrecv myReceiver(IR_PIN);    //create a receiver on pin number 2

Kennt den Effekt jemand, oder riecht das nach irgendeiner Fehlbedienung 
meinerseits? Ich verwende das Pin auch zum Aufwachen aus dem Schlafmodus 
(genau um per Fernbedienung Aktionen auslösen zu können).

Danke für jeden Hinweis!

Liebe Grüße
Marco

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Marco G. schrieb:
> "... mit der IRLib2 von Chris Young ..."

Muss man die kennen?

Statt eines Links auf das Breakout-Board wäre ein Link auf die von dir 
verwendete Bibliothek wesentlich hilfreicher - oder soll da jeder 
erstmal googlen?
https://github.com/cyborg5/IRLib2/tree/master/IRLib2

Funktioniert denn beim Board angegebene Code wie erwartet?

von Marco G. (flaschenpost)


Lesenswert?

Wolfgang schrieb:
> Marco G. schrieb:
>> "... mit der IRLib2 von Chris Young ..."
>
> Muss man die kennen?
>
> Statt eines Links auf das Breakout-Board wäre ein Link auf die von dir
> verwendete Bibliothek wesentlich hilfreicher - oder soll da jeder
> erstmal googlen?
> https://github.com/cyborg5/IRLib2/tree/master/IRLib2

Sorry, den Link wollte ich dazupacken, war dann aber von enableIRIn() 
abgelenkt... genau die ist es.


> Funktioniert denn beim Board angegebene Code wie erwartet?

Hm, was meinst du genau? Beim Test und nach dem Neustart liefert der OK- 
Knopf reproduzierbar den ersten Code.

Nach einigen verschiedenen Klicks (anderer Tasten) liefert er immer 
wieder den zweiten Code.

Alle anderen Signale werden ebenfalls in mindestens zwei verschiedenen 
Varianten erkannt. "*" im "sauberen" Zustand nach dem Start immer wieder 
0x7BB7E31F, im verrutschten Zustand immer wieder als 32C6FDF7.

Da ich keine vordefinierten Sony- oder Siemens- Fernbedienungen erkennen 
oder bedienen will, ist so eine "große" Lib vielleicht Overkill. Ich 
brauche nur einen (ausreichend toleranten) Vergleich mit zwei (oder an 
anderen Basteleien auch mal 6) vorgegebenen Signalen. Aber die gesamte 
Timing- und Signallogik zu implementieren (inklusive aller 
Anfängerfehler) wollte ich mir durch den Einsatz einer gut getesteten 
Lib ersparen.

Gruß
Marco

von grundschüler (Gast)


Lesenswert?

Zur Fehlersuche ir-signal messen und - z.B. - per lcd anzeigen lassen:

1
ir_signal_messen(){
2
  u8 found=0;
3
  u8 oldBit;
4
  u16 rc5code,i;//50
5
  oldBit=1;
6
  u8 zl=0;
7
  u8 endwhile=1,n=1;
8
  u8         j;
9
  u16 wertx,colx;
10
u16 tmp[150];
11
u16 check_mod;
12
  ir_cmd=0;
13
14
  while(endwhile){
15
    i=0;
16
    while(ir_pin && i<60001)i++;
17
    tmp[n]=i;//Speichert Anzahl der Ticks bis Flankenwechsel
18
    if(i==0)endwhile=0;
19
    i=0;
20
    while(!ir_pin && i<60001)i++;
21
    tmp[n+1]=i;
22
    if(i==0)endwhile=0;
23
    if(n<48)n=n+2;
24
  }
25
26
27
  lcd_goto(1,1);lcd_int(tmp[1]);
28
  lcd_goto(1,13);lcd_int(tmp[2]);
29
  lcd_goto(2,1);lcd_int(tmp[3]);
30
  lcd_goto(2,10);lcd_int(tmp[4]);
31
  lcd_goto(3,1);lcd_int(tmp[5]);
32
  lcd_goto(3,10);lcd_int(tmp[6]);
33
...

von Zeno (Gast)


Lesenswert?

Wolfgang schrieb:
> Statt eines Links auf das Breakout-Board wäre ein Link auf die von dir
> verwendete Bibliothek wesentlich hilfreicher - oder soll da jeder
> erstmal googlen?
> https://github.com/cyborg5/IRLib2/tree/master/IRLib2

Genau unter dem angegebenen Link gibt es den im Folgepost genannten 
Link.

Ich frage mich warum die Leute hier im Forum immer erst mal dumm 
angemacht werden. Das geht schon hiermit

Wolfgang schrieb:
> Muss man die kennen?

los.

Wer keine Lust hat sich mit dem Thema zu befassen, sollte es doch 
generell sein lassen.

Marco hatte doch detailiert beschrieben was er möchte, das sollte für 
Leute die das Board/die Lib kennen ausreichend sein.

von Marco G. (flaschenpost)


Lesenswert?

@Grundschüler: danke, fertiger Code auf dem Silbertablett...

Das heißt, im Wesentlichen auf die Library verzichten. Dein Code mit dem 
Tick-Zählen sieht aber dann doch überschaubar aus.

Dann werde ich heute das fertige "Kunstwerk" noch mal auseinander nehmen 
und mit Hilfe deines Codes debuggen.

Offenbar gibt es hier erst mal wenig Erfahrungen mit dieser konkreten 
Library (IRLib / IRLib2). Falls jemand eine bessere (einfache) Lib 
kennt, nehme ich auch gern Empfehlungen entgegen.

@Zeno: Danke für die Fürsprache! Ich kann andererseits die Genervtheit 
der "Profis" bei vielen Anfängerfragen verstehen und kenne auch die 
Sicht des Programmierers, der mit schlechten Fehlermeldungen 
konfrontiert wird ("irgendwas geht nicht!").

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marco G. schrieb:
> Offenbar gibt es hier erst mal wenig Erfahrungen mit dieser konkreten
> Library (IRLib / IRLib2). Falls jemand eine bessere (einfache) Lib
> kennt, nehme ich auch gern Empfehlungen entgegen.

IRMP

von grundschüler (Gast)


Lesenswert?

Marco G. schrieb:
> aber dann doch überschaubar

auch der Rest ist überschaubar. Die Art der Fernbedienung ergibt sich 
aus tmp1 zu tmp2
1
if(((tmp[1])/(tmp[2]/10))>7 && (tmp[1]/(tmp[2]/10))<13)//rc5
2
  //tmp[1]/f_ir=10
3
  f_ir=tmp[1]/10;
4
if(((tmp[1])/(tmp[2]/10))>17 && (tmp[1]/(tmp[2]/10))<22)//nec
5
  f_ir=tmp[1]/102;


Die Auswertung für NEC:
1
    ir_adr=0;ir_cmd=0;
2
      for(i=18;i>3;i=i-2) {
3
      ir_adr=(ir_adr<<1);
4
      if (tmp[i]/f_ir>11)ir_adr++;}
5
    ir_adr|=128;
6
7
      for(i=50;i>35;i=i-2) {
8
      ir_cmd=(ir_cmd<<1);
9
      if (tmp[i]/f_ir>11)ir_cmd++;
10
      }

auch kein Zauberwerk.

von Zeno (Gast)


Lesenswert?

Marco G. schrieb:
> @Zeno: Danke für die Fürsprache! Ich kann andererseits die Genervtheit
> der "Profis" bei vielen Anfängerfragen verstehen und kenne auch die
> Sicht des Programmierers, der mit schlechten Fehlermeldungen
> konfrontiert wird ("irgendwas geht nicht!").

Das haben nun mal Anfänger - genauso wie Lehrlinge - an sich, daß sie 
erst einmal lernen müssen. Dies bedeutet auch das Fragen aus Sicht des 
Profis nervig gestellt werden, weil es der Fragesteller einfach nicht 
besser weiß. Man kann dann den Fragesteller auch in einer anständigen 
Art und Weise darauf hinweisen - ohne beleidigend oder überheblich rüber 
zu kommen. Leider vergessen viele das sie irgendwann auch mal angefangen 
haben und über jede Hilfestellung froh waren.

Andere User User zeigen doch auf das es auch anders geht. Leider gibt es 
davon viel zu wenige.

von Marco G. (flaschenpost)


Lesenswert?

Falls jemand über diesen Thread hier auf Infrarot-Probleme stößt:

Wow, der Artikel zu IRMP (https://www.mikrocontroller.net/articles/IRMP) 
erklärt alles sehr gut, vielen Dank für den Tip und vor allem diese 
Seite!

Sobald der neue Empfänger da ist (die üblichen Wochen Anreisezeit), 
werde ich damit mal die Billigfernbedienung untersuchen und hier die 
Ergebnisse eintragen. Das "Altsystem" muss bis dahin mit gelegentlichen 
Neustarts betrieben werden, deshalb bis auf Weiteres nichts Neues von 
mir.

von Norbert S. (norberts)


Lesenswert?

Moin,

Ich hatte mal was ähnliches gebaut und die Fernbedienung hatte ein 
Protokoll, das ich ums verrecken nicht sinnvoll zuordnen konnte.
Die Pakete hatten eine maximale Länge aber ich konnte nichtmal erkennen, 
wieviele Bits das sein sollen.
Ok, ich war auch faul, sicherlich hätte man das rauskriegen können.
Was zu sehen war, waren "kurz" und "lang", entweder auf high oder low.
Ich wollte nur zwei Tasten erkennen, um die Glotze zu drehen.
Also habe ich das ganz eklig primitiv gemacht:
Ab dem ersten Wackeln am Pin wird einfach der Zustand des Pins und die 
Zeit seit dem letzten Toggeln aufgezeichnet. Jedes Toggeln ein Byte.
Beim Toggeln also 0 und Zeit kurz = 0, 0 und Zeit lang = 1, 1 und Zeit 
kurz = 2, 1 und Zeit lang = 3.
Das habe ich in ein Array gepackt, die gespeicherten Tasten ins Eeprom.
Wenn ein Array empfangen wurde, hab ich einfach die Arrays Element für 
Element verglichen und feddich.

Mehr Speicherverschwendung und langsamer geht wohl kaum aber das war 
extrem einfach zu programmieren.
Wenn ein ATmega 8 aber sonst nichts tun muß, ist es ja egal.
Als Endschalter habe ich den Motorstrom über ein Stück dünne lange 
Leiterbahn gemessen (Shunt) und ab einer bestimmten Stromgrenze wurde 
abgeschaltet.

Das war vielleicht das übelste Stück Quick'n'Dirty was ich je verbrochen 
habe aber es hat prima funktioniert.

Gruß,
Norbert

von Marco G. (flaschenpost)


Lesenswert?

Ja, mein Controller macht so wenig, dass ich normalerweise mal einen 
attiny probieren würde. Absurderweise (kleine Grenzfälle der 
Marktwirtschaft) finde ich die in kleinen Mengen aber nur für mehr Geld 
als die Atmega (328p für 5 Stück 4 Euro, die attiny ab > 1,70/Stück).

Eigentlich macht er nur eins: Lämpchen an oder Lämpchen aus. Aber 
Lämpchen aus dann mit Tiefschlaf, und per IR- Interrupt aus dem 
Tiefschlaf erwachend.

von Norbert S. (norberts)


Lesenswert?

Moin,

Für Bastler macht es bis auf Ausnahmen keinen Sinn, sich einen Tiny 
anzutun, also verwenden die meisten Mega 328 oder aufwärts.
Deswegen sind die in Kleinmengen billiger. Da muß der Bastelshop nicht 
soviel draufschlagen, weil sie in Massen gehen.
Tiny wird erst interessant, wenn Du ein paar k/a brauchst.

Ich löte die Dinger auch nicht mehr selbst. Der Frust bis das Ding dann 
läuft ist zwar zu 95% nahe null aber nachdem ich einmal zwei Platinen 
hintereinander nicht zum Laufen bekommen habe, hatte ich die Faxen 
dicke. Für Basteleien nur noch Arduinoboards vom Chinamann. Die sind 
auch so billig (inkl Quarz und U-Regler), da kriegt man kaum die Teile 
für und man kann sich immer ein paar hinlegen.

Bei mir ist das alles mit Elektronik und µC immer nur noch Mittel zum 
Zweck, nicht Bastelei als Selbstzweck.

Gruß,
Norbert

von Marco G. (flaschenpost)


Lesenswert?

Wird zwar langsam extrem Offtopic, aber: kennst du ein preiswertes 
Arduino-Teil, wo man den Spannungsregler und die Power-LED nicht erst 
rauslöten muss? Der Pro Mini braucht ja auch noch 10x so viel Strom wie 
nötig im Tiefschlaf...

Liebe Grüße,
Marco

von Marco G. (flaschenpost)


Angehängte Dateien:

Lesenswert?

So, falls noch jemand "On Air" ist: ich habe mal mit einer kleinen 
Interrupt-Routine die An- und Aus- Zeiten des IR- Moduls gemessen.

Gerundet:

Startimpuls: ca. 9.3 ms an, 4.5 ms aus.
Dann haben die Impulse ca. 0.6 ms Länge, die Info scheint in der Pause 
zu liegen. Die Pause ist entweder knapp 0.6ms oder etwas über 1.8ms.

8x 0.6ms, dann 8x 1.7ms, 6x 0.6ms, 1.7ms, ...


       0
       9304  4512
       572   556
       600   552
       572   580
       572   552
       596   552
       576   580
       576   552
       604   552
       576  1684
       608  1712
       548  1692
       572  1688
       600  1692
       572  1692
       572  1684
       608  1688
       576   548
       608   552
       576   576
       576   552
       604   552
       576   580
       572  1688
       576   576
       576  1688
       572  1688
       604  1684
       576  1692
       572  1688
       600  1688
       572   552
       600  1688
       576

Ich schau mal in der IRMP nach, was das ist.

von Marco G. (flaschenpost)


Lesenswert?

Also, die Dokumentation zum Infrarot in IRMP ist wirklich super! Damit 
ist prinzipiell alles erklärt, Pulse Distance Coding, ziemlich 
wahrscheinlich NEC.

Auch das Konzept von IRMP sieht genial aus, dynamisch rauszufinden, was 
bei aktueller Datenlage noch so alles in Frage kommt. Wirklich Respekt!

Was mir leider komplett fehlt, ist ein Einstieg in die Lib per Arduino. 
:-(

Das Pin steht in der irmpconfig.h, B6 ist aber am Crystal. Setze ich es 
um, z.B. auf B4, komme ich auch nicht weiter. Serial funktioniert nicht, 
wenn ich irmp.h einbinde. Irgendwie habe ich die Lib offenbar falsch 
eingebunden. :-(

Ich werde jetzt für diese eine Fernbedienung einfach mit den Interrupts 
(Change von Pin2) eine einfache, schlechte kleine Klasse bauen und 
hoffen, dass ich richtig schätze, wann ein Signal wirklich beendet ist 
und so.

Oder hat noch jemand einen Arduino-Port zur Hand? Die Links aus den 
anderen Forumsartikeln waren jetzt auch nicht so hilfreich...

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.