-
        

Ergebnis 1 bis 7 von 7

Thema: Arduino mit Infrarot-Receiver: Auswertung?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.08.2010
    Alter
    18
    Beiträge
    114

    Frage Arduino mit Infrarot-Receiver: Auswertung?

    Anzeige

    Hallo Leute,
    ich hab mal ne Frage:
    Ich hab in diesem 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
    Verpackung eines PC´s:

    Bei Risiken und Funktionsproblemen Netzstecker durchbeißen und aus den PC aus dem Fenster werfen!

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.595
    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:

    Code:
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - -  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:



    Ok?
    Ciao sagt der JoeamBerg

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.785
    Blog-Einträge
    8
    Hallo

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


    Grafik von: http://www.freeduino.de/blog/apple-r...ler-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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.08.2010
    Alter
    18
    Beiträge
    114
    Bei meiner SONY-Fernbedienung lautet der Code, den mir Arduino aus dem Skript im Serial Monitor wiedergibt, so:
    Code:
    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?
    Verpackung eines PC´s:

    Bei Risiken und Funktionsproblemen Netzstecker durchbeißen und aus den PC aus dem Fenster werfen!

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.785
    Blog-Einträge
    8
    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:
    Code:
    // RC5 dekodieren mit invertierendem 36kHz-TSOP und Zaehlschleifen (ungetestet!) 14.05.2011 mic
    
    // http://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 ;)
    Geändert von radbruch (15.05.2011 um 15:38 Uhr) Grund: Code optimiert

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.08.2010
    Alter
    18
    Beiträge
    114
    Wie finde ich denn raus, ob meine Fernbedienung RC-5 ist?
    Verpackung eines PC´s:

    Bei Risiken und Funktionsproblemen Netzstecker durchbeißen und aus den PC aus dem Fenster werfen!

  7. #7
    Unregistriert
    Gast

    Infrarot Fernbedienung mit einem Arduino

    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

Ähnliche Themen

  1. ARDUINO ARDUINO l293D + MegaservoLib
    Von m1ch15inner im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 11.07.2011, 12:50
  2. Keine IR Verbindung mit USB-Receiver
    Von asuruuser im Forum Asuro
    Antworten: 12
    Letzter Beitrag: 05.12.2006, 16:04
  3. 4 Channel Receiver
    Von inschenjoer im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 18.11.2006, 16:29
  4. dtmf-receiver
    Von stanislaf im Forum Elektronik
    Antworten: 12
    Letzter Beitrag: 03.02.2006, 12:17
  5. USART Receiver
    Von B.Rust im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 01.12.2004, 22:17

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •