PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino mit Infrarot-Receiver: Auswertung?



pro-bot128
15.05.2011, 12:40
Hallo Leute,
ich hab mal ne Frage:
Ich hab in diesem (http://www.freeduino.de/blog/apple-remote-mit-arduino-universeller-ir-empfang) Link eine Beschreibung für einen Arduino Infrarot-Empfänger erhalten.
Ich führe den Skript der Playground aus und öffne den Serial-Monitor. Wenn ich nun eine Taste meiner Fernbedienung drücke, steht dieser lange Code im Monitor. Nun weiß ich nicht, was ich damit jetzt anfangen soll... Wie kann ich jetzt eine If-Schleife programmieren, die abfragt ob eine bestimmte Taste(in meinem Falle ON/OFF) gedrückt wurde? Wenn man sie gedrückt hat, soll die LED(13) leuchten.

Ich hoffe ihr versteht meine Frage.

Danke
MfG roboter421

oberallgeier
15.05.2011, 13:16
Hi Kollege,

(bist Du jetzt pro-bot128 oder roboter421?? - oder eine multiple Persönlichkeit?) die Auswertung geschieht - in C - recht einfach; mit der Arduino Entwicklungsumgebung kenne ich mich nicht aus. Primär wichtig ist, dass Deine Software genau den IR-Code entziffert, den Deine Fernsteuerung sendet. Da es etliche verschiedene Codes gibt, könnte das ein Fehler sein. Nicht unüblich ist der RC-5-Code. Ich decodiere bei mir den Code in ein Adressbyte (RCAB) und ein Befehlsbyte (RCBB). Jede Taste sendet üblicherweise einen anderen Code, ich muss also nur auf diesen Code prüfen (in meinem Beispiel ohne Adressprüfung) , siehe hier:


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Es folgt RC5t_17a - es werden also nur die RCAB und RCBB geholt.
// RCBB == 16 => 0 gedrückt?
// RCBB == 27 => Pfeil "ab"wärts
// RCBB == 28 => Pfeil vorwärts
// RCBB == 36 => VOL lauter = rechts
// RCBB == 37 => VOL leiser = links
//
while (1) //
{ //
RC5t_17a (); // RC5 auslesen
if (RCBB == 16) // Ist "0" gedrückt?
{ //
SERVon = 1; // Servobetrieb erlauben
dklauf(); // Deckel auffahren
waitms ( 800); // und warten bis Deckel offen ist
SERVon = 0; // und Servobetrieb wieder verbieten
waitms ( 2000); // danach 2 sec warten
SERVon = 1; // Servobetrieb erlauben
dklzu(); // Deckel zufahren
waitms ( 800); // und warten bis Deckel zu ist
} // Ende if (RCBB == 16)
//
if (RCBB == 27) // "Pfeil ab-/rückvorwärts" gedrückt?
{ //
SERVon = 1; // Servobetrieb erlauben
dklauf(); // Deckel auffahren
waitms ( 800); // und warten bis Deckel offen ist
SERVon = 0; // und Servobetrieb wieder verbieten
ftst_13m(); // Fahrtest
SERVon = 1; // Servobetrieb erlauben
dklzu(); // Deckel zufahren
waitms ( 800); // und warten bis Deckel zu ist
} // Ende if (RCBB == 16)
//
if (RCBB == 28) // Ist "Pfeil vorwärts" gedrückt?
{ //
SERVon = 1; // Servobetrieb erlauben
dklauf(); // Deckel auffahren
waitms ( 800); // und warten bis Deckel offen ist
SERVon = 0; // und Servobetrieb wieder verbieten
ftst_13(); // Fahrtest
waitms ( 500); // danach etwas warten
SERVon = 1; // Servobetrieb erlauben
dklzu(); // Deckel zufahren
waitms ( 800); // und warten bis Deckel zu ist
} // Ende if (RCBB == 28)
//
} // Ende while (1)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Entsprechend dem Code wird dann die Aktion gefahren. Evtl. ist noch eine Zeitabfrage im while sinnvoll, wenn ohne Tastendruck ein default-Ablauf gewünscht wird. Und so einfach geht das dann:


http://www.youtube.com/watch?v=jgm9DhS7vS4

Ok?

radbruch
15.05.2011, 13:29
Hallo

Ich besitze zwar keinen arduino, habe mir aber trotzdem den oben verlinkten Artikel durchgelesen:

http://www.freeduino.de/files/images/apple_ir_sequenz.gif (http://www.freeduino.de/blog/apple-remote-mit-arduino-universeller-ir-empfang)
Grafik von: http://www.freeduino.de/blog/apple-remote-mit-arduino-universeller-ir-empfang

Sehr anschaulich! Da viele IR-Fernbedienungen RC5 mit 36kHz-Trägerfrequenz und einer Bitlänge von 1,778ms (1/36000*64) verwenden, kann man sich die Bitlängenmessung eigentlich sparen. Und wenn man die Bitlänge schon kennt, braucht man nach der Startflanke des Signals nur im richtigen Moment die Pegel der einzelnen Bits einzulesen. Basis für das Timeing wäre der Signalaufbau:
http://www.mikrokopter.de/de/IR-Protokolle.php#RC5

Besitzt der arduino eine Library die irgendwelche Zeitfunktionen zur Verfügung stellt? Oder kennst du einen guten Einstiegslink zum arduino?

Gruß

mic

pro-bot128
15.05.2011, 14:04
Bei meiner SONY-Fernbedienung lautet der Code, den mir Arduino aus dem Skript im Serial Monitor wiedergibt, so:


0 0
2480 0
2480 1
3028 1
3028 0
4284 0
4284 1
4828 1
4828 0
5488 0
5488 1
6032 1
6032 0
7288 0
7288 1
7836 1
7836 0
8488 0
8488 1
9036 1
9036 0
10292 0
10292 1
10844 1
10844 0
11496 0
11496 1
12044 1
12044 0
12696 0
12696 1
13244 1
13244 0
13896 0
13896 1
14448 1
14448 0
15100 0
15100 1
15648 1
15648 0
16300 0
16300 1
16848 1
16848 0
17504 0
17504 1
18052 1
18052 0
19308 0
19308 1
45272 1
45272 0
47748 0
47748 1
48300 1
48300 0
49552 0
49552 1
50100 1
50100 0
50756 0
50756 1
51300 1
51300 0
52556 0
52556 1
53104 1
53104 0
53760 0
53760 1
54308 1
54308 0
55560 0
55560 1
56108 1
56108 0
56764 0
56764 1
57308 1
57308 0
57964 0
57964 1
58512 1
58512 0
59168 0
59168 1
59712 1
59712 0
60368 0
60368 1
60916 1
60916 0
61572 0
61572 1
62120 1
62120 0
62772 0
62772 1
63320 1
63320 0
64572 0
64572 1
90536 1
90536 0
93020 0
93020 1
93564 1
93564 0
94824 0
94824 1
95368 1
95368 0
96024 0
96024 1
96572 1
96572 0
97828 0
97828 1
98372 1
98372 0
99028 0
99028 1
99572 1
99572 0
100828 0
100828 1


Sind die 1 und 0 die Zahlen, die auf der Internetseite die radbruch mir genannt hat, stehen?

radbruch
15.05.2011, 15:19
Oje, mit Sony-Code kenne ich mich überhaupt nicht aus. Ich mag mich auch grad nicht einlesen. Wenn du eine Fernbedienung mit RC5 verwenden würdest, könnte eine Funktion etwas so aussehen:

// RC5 dekodieren mit invertierendem 36kHz-TSOP und Zaehlschleifen (ungetestet!) 14.05.2011 mic

// https://www.roboternetz.de/community/showthread.php?53211-Arduino-mit-Infrarot-Receiver-Auswertung

#include <avr/io.h>

#define digitalRead(IRpin) !(PINA && (1<<0)) // Dummydefine für einen invertierenden TSOP-Eingang an PA0
#define LOW (0==1) // LOW ist false und...
#define HIGH !LOW // HIGH ist true ;)

int get_rc5_bitmuster(void) // RC5-Bitmuster einlesen mit Zaehlschleife
{
char bit=12; // 14Datenbits-12Startbits einlesen
int bitmuster=0; // Speicher für 14 RC5-Datenbits
int bitlaenge=0, count=0, dummy=0; // Bitlaenge, Zaehler für die Bitlaengen, Dummy

while(digitalRead(IRpin)==LOW) {} // warten auf Startbits
while(digitalRead(IRpin)==HIGH) {bitlaenge++;} // Dauer von zwei Startbits messen
bitlaenge/=2; // Bitlaenge berechnen
bitmuster=(1<<13)|(1<<12); // die Bits 13 und 12 im Bitmuster speichern (Startbits)
count=bitlaenge/4*3; // erster Lesezeitpunktdatenbits nach 3/4 der Bitlaenge
while(bit--) // weitere 12 Datenbits einlesen
{
while(count){count--; dummy++;}; // stimmt das Timeing???
if(digitalRead(IRpin)) // IR-Pegel einlesen...
bitmuster|=(1<<bit); // ...und abspeichern
count=bitlaenge; // naechster Lesezeitpunkt: 1/4+3/4 Bitlaenge oder eine Bitlaenge
}
while(count){count--; dummy++;} // eine Bitlaenge warten
return(bitmuster);
}

//

int main(void)
{
int RC5_Kommando;
while(1) RC5_Kommando=get_rc5_bitmuster();
return(0);
}
Ungetestet, aber das könnte mit einem invertierenden 36kHz-Tsop funktionieren, wenn diese beiden Schleifen ähnliche Ausführungszeiten besitzen würden:

while(digitalRead(IRpin)==HIGH) {bitlaenge++;}
while(count){count--; dummy++;}

Ohne Timer und Interrupts scheint mir das eine sehr einfache RC5-Funktion zu sein. Das muss ich bei Gelegenheit mal selbst testen ;)

pro-bot128
15.05.2011, 16:13
Wie finde ich denn raus, ob meine Fernbedienung RC-5 ist?

Unregistriert
13.06.2015, 08:59
Hi,

die Einträge hier sind zwar älter, aber vielleicht sucht ja doch der ein oder andere eine Anleitung. Ich habe lange gesucht und am Ende hat mir dieser Beitrag auf der Deskfactory.de geholfen:

http://deskfactory.de/arduino-infrarot-fernbedienung

viele Grüße,

Max