PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR-FernbedienungsempfangsProblem



Robot2000
20.08.2009, 15:59
Hi!

Ich wollte meinen Asuro mit einer fernbedienung steuern.

Das geht ja mit


void SerRead(unsigned char *data, unsigned char length, unsigned int timeout)

also z.B.:


SerRead(data, 18, 0)

null für unendlich und 18 bei einer IR-Fernbedienung geht gut.


wenn ich jetzt aber eine schleife



while(1){

SerRead(data, x, y);

if(data=="WWwxxc"){
FrontLED(ON);
}

}


eingebe, und für

x einen wert z.B. 13 einsetze
y einen Wert z.B. 2000, für 2 sek., oder 2 milliesek. (da is ja noch die while-schleife)


klappt das nicht.



die fernbedienung sendet zwar 13 zeichen, allerdings klappt es erst richtig wenn er's 2mal ausließt, also 28 zeichen. (es gibt auch tasten mit 12 oder 14 zeichen)


außerdem klappt das mit

SerRead(data, 28, y)

nur, wenn y=0 ist.




hat jemand eine idee, was ich tun könnte?
(falls ichs unverständlich erklärt habe, bitte melden :) )


Vielen Dank



P.S.: Ich glaube, es könnte noch daran liegen, dass die schleife ja immer ein paar teusenstel sekunden dauert. Wenn die fernbedienung nicht exakt den auslesevorgang trifft, ließt der dann

cwwwxx

anstatt

wwwxxc

was ja falsch ist.

ich hab auch schon versucht alles 2mal auszulesen, und mit einer schleife den anfang zu suchen.

also so:

cwwwxxcwwwxx

das hat aber auch nicht richtig geklappt.

könnte es daran liegen?


Das allererste Zeichen in den empfangen Daten wird dabei mit ’T’ (Timeout)
überschrieben.

das heißt also, dass bei

SerRead(data, 28, 2)


in wirklichkeit nicht

wwwxxc

sondern

Twwxxc

empfangen wird??

radbruch
20.08.2009, 16:42
Hallo

Bevor ich mich tiefer ins Thema reindenke würde ich gerne was klarstellen:

Versuchst du mit voller Absicht den Fernbedienungscode mit der seriellen Schnittstelle einzulesen? Oder weißt du nicht, dass die gesendeten Daten einer Fernbedienung völlig anders codiert sind als die Daten einer RS232-Schnittstelle.

Gruß

mic

Valen
20.08.2009, 16:51
Das mit den letzter wert im SerRead stimmt. Er wartet einer zeit die diesen anzahl von zeichen enspricht. Also 2000 ist den zeit von 2000 zeichen, das it 20.000 bits, und mit 2400 baud ubertragung gleich 8,33 sekunden bis er weiter geht in dem while schleife. (und dann den timeout zeichen "T" reinsteckt, was aber schwer zu entdecken ist, weil die "T" auch gewunscht ubergesendet ist, ... machts aber nichts in diesen fall)

Deshalb geht SerRead(data,y,0); gut, weil es nur die anzahl von y abwartet.

Aber mit ganzen worter ("WWxxc") ist das ein bischen fehlerhaft. Asuro muss den zeichen genau so in diesen folge empfangen. Wenn einer diesen zeichen nicht uberkommt wirdt wirdt das ganze empfangene wort geloscht (weil es nicht stimmt), und in dem nachtste SerRead gehts weiter. Besser ist es die einzelne zeichen zu empfangen und in deinem program die reihefolge zu uberwachen. Wenn es stimmt muss er etwas tun wie den led anschalten.

Robot2000
20.08.2009, 17:22
erst mal danke, für deinen nützlichen hinweis :)



Besser ist es die einzelne zeichen zu empfangen und in deinem program die reihefolge zu uberwachen.

wie soll ich das machen? Die Fernbedienung sendet ja ununterbrochen (bei knopfdruck)

wwwxxcwwwxxcwwwxxcwwwxxc usw.

also da geht nix einzeln.

Kann man das irgendwie umgehen?

(das problem ist ja, dass die Knöpfe verschiedene Längen senden.
Einer sendet 27, einer 28, einer 29..)

ansonsten wärs ja einfach..

radbruch
20.08.2009, 17:42
Hallo

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=21463

Mein Ansatz war alle Fernbedienungsbits direkt am TXD-Pin abzufragen:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=31262
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=43683

Die aktuelle asuro-Library (v2.7rc3?) kann auch Fernbedienungen auslesen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=33174

Gruß

mic

Robot2000
20.08.2009, 18:54
danke, durch deine links bin ich hierrauf gestoßen:

https://www.roboternetz.de/phpBB2/viewtopic.php?p=87737#87737

ich werd das mal testen und studieren.

Robot2000
21.08.2009, 15:28
Also irgendwie hat das nicht geklappt (meine fernbedienung scheint da nicht kompatibel zu sein).


folgendes sendet meine fernbedienung:

]]]×ÝwuÕWWWUÝ€]]]×ÝwuÕWWWUÝ für links

]]]×ÝwuÕWWWÕ× €]]]×ÝwuÕWWWÕ× für rechts


und da ist auch schon das erste Problem:

der code für rechts ist ein zeichen länger als der für links.

Und selbst wenn sie gleich lang wären, gings trotzdem nicht, da das timeout nicht klappt.


Ich hab folgende Codes probiert:






..
int Z=0;
unsigned char data;

while(Z==0){
SerRead(data, 1, 5);
if (data=w){
Z=1;
}
}
FrontLED(ON);
..


klappt aber nicht.
dieser hingegen schon:



..
unsigned char data;

SerRead(data, 1, 0);

FrontLED(ON);

..

Valen
21.08.2009, 16:04
Mit einer tv-fernbedienung geht das aucht nicht. Ein fernbedienung benutzt das RC5 protocol, ( oder rc4 oder rc6 nach wie modern es ist). Das iest einer complet andere art von codierung. Das stimmt nicht uberein mit das USART protocol fur SerRead und SerWrite. Deshalb hat Radbruch du diesen 4 links gegeben. Ich hatte gedacht du benutzt deine RS232 IR modul mit hyperterminal fur eingeben eines commando. Vielleicht hat deiner fernbedieunung auch einer andere tragerfrequenz der den ir empfanger auf deiner asuro nicht gut erkent.

Erst mus du verstehen wie die RC5 code wirkt, und dan mus du den PD0 pin (das ist den RX eingang fur seriellen emphang) uberwacht werden auf signal anderungen. Und dein program muss selbst den bits in das signal herausforderen/entdecken. Nicht einfach fur einer anfanger.

radbruch
21.08.2009, 16:44
Hallo

Die Links oben sollten dir eigentlich auf die Sprünge helfen. Es kann nicht funktionieren, weil im Datenstrom für die RS232-Schnittstelle nicht nur Daten sondern auch Steuerbits (Start-, Stop-, Parity-Bit) übertragenen werden. Die Fernbedienung sendet ihre Bits am Stück und wartet nicht nach 8 Bits bis der USART die Daten weggeschaufelt hat. Alles was du so "empfängst" solltest du eher unter Zufall denn unter Daten ablegen.

Hier zeige ich am RC5-Code wie die einzelnen Bits der Fernbedienung gelesen und gemessen werden können:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=403101#403101

Wenn die Trägerfrequenz nicht paßt (der asuro verwendet standartmässig 36kHz) sollte der Empfang schon bei geringem Abstand unmöglich sein.

Gruß

mic

Robot2000
21.08.2009, 19:02
Es funktioniert doch.
Aber nur, wenn die zeit auf unendlich eingestellt ist (was blöd ist, da man dann keine tastsensoren abfragen kann.)