Neues Feature: Fernsteuerung per Infrarot-Fernbedienung

Soeben habe ich einen Commit hochgeladen, der das Fernsteuern mittels Fernbedienung ermöglicht.

  • Aktivieren kann man dieses Feature in settings.h über die Direktive IR_CONTROL_ENABLE

  • Achte darauf, dass der GPIO nicht bereits anderweitig verwendet wird.

  • In der Develboard-spezifischen Config befindet sich ganz unten nun die Konfiguration dafür. Hier muss der GPIO (IRLED_PIN) festgelegt werden und auch, wie oft Aktionen (außer Lautstärke) ausgewertet werden. Das ist einfach dafür gut, dass man durch zu langes Drücken eine Aktion nicht doppelt ausführt (IR_DEBOUNCE).

  • Auch kann man dort die Kommandos zuweisen. Welche das bei dir sind, musst du ausprobieren. Einfach eine Taste x drücken und dann erscheint sowas in der seriellen Konsole:

Protocol=NEC Address=0x17F Command=0x6B Raw-Data=0x946B017F 32 bits LSB first

  • Aus diesem Kommando wäre nun z.B. die 0x6b zu extrahieren.

  • Ich habe jetzt einfach mal verschiedene Kommandos bereitgestellt, die ich für sinnig gehalten habe. Grundsätzlich kann man da auch welche hinzufügen, aber ich will es auch nicht übertreiben.

  • Getestet habe ich das Ganze hiermit (wenn auch nicht dort gekauft): IR Infrarot Empfänger für Raspberry Pi, Arduino, XBMC Kodi – VS1838B LIRC – MAKERSHOP.DE und der Fernbedienung meines AV-Receivers.

  • So eine Fernbedienung in der Art habe ich auch getestet, aber da passierte irgendwie nichts. Möglicherweise war sie kaputt; ich weiß es nicht.

  • vs1838b gibt es auch fertig auf Breadboards. Ich habe wirklich nur dieses Teil selbst benutzt; ohne jegliche Zusatzbeschaltung und ohne Breadboard.

  • Pinout:
    VS1838B-PINOUT

  • Tipp: Auf den von mir bereitgestellten PCBs gibt es hierfür (bisher) keinen Anschluss. Man kann jedoch, sofern man die Kopfhörerplatine nicht verwendet, sich von dem 6Pin-Header für die Kopfhörerplatine VCC + GND holen. Und zusätzlich auch den Headphone-Detect-GPIO als GPIO für Infrarot verwenden. Das Pinout ist auf den PCB aufgedruckt. Achte nur in diesem Falle unbedingt darauf, dass du HEADPHONE_ADJUST_ENABLE deaktivierst!

8 „Gefällt mir“

Ich habe es mit einer XBox One Media Fernbedienung getestet, damit funktioniert es einwandfrei.

MfG

1 „Gefällt mir“

Klasse. Vielen Dank +1
Probiere ich aus, sobald ich Zeit finde, meinen Espuino auszubauen.

So klappt jetzt.
Mega geil!

Das einzige was noch nicht so will ist Play/Pause. Das reagiert genau gleich und spielt nicht weiter nach Tastendruck (zwei unterschiedliche Taster)

Auch das Bluetooth Feature hab ich jetzt gestestet… :heart_eyes: :smiling_face_with_three_hearts:
Saugut!

Hier mein mapping für meine Fernbedienung.
Bild editier ich später rein.

#define RC_PLAY 0x15 // command for play
#define RC_PAUSE 0x43 // command for pause
#define RC_NEXT 0x9 // command for next track of playlist
#define RC_PREVIOUS 0x7 // command for previous track of playlist
#define RC_FIRST 0xC // command for first track of playlist
#define RC_LAST 0x6d // NOT IN USE command for last track of playlist
#define RC_VOL_UP 0x40 // Command for volume up (one step)
#define RC_VOL_DOWN 0x19 // Command for volume down (one step)
#define RC_MUTE 0xD // Command to mute ESPuino
#define RC_SHUTDOWN 0x2a // NOT IN USE Command for deepsleep
#define RC_BLUETOOTH 0x45 // Command to enable/disable bluetooth
#define RC_FTP 0x65 // NOT IN USE Command to enable FTP-server

OK, also PPlay muss ich dann nochmal testen. Aber du hast schon Recht mit der Aussage, dass es das Gleiche macht. Normalerweise habe ich eine Taste und die macht halt genau das Gegenteil von dem, was gerade Zustand ist. Das passt so nicht 100% zu einer Fernbedienung. Daher habe ich kurzerhand beides auf die gleiche Aktion gemappt. Aber wieder anfangen zu spielen müsste es eigentlich.

Habe das gerade mal getestet und kann den Punkt nicht nachvollziehen. Wenn die Musik läuft, dann ist es egal, ob ich Play oder Pause drücke: der ESPuino geht dann in Pause. Und im Anschluss ist es wieder egal, welche Taste man drückt - es läuft dann wieder weiter.
Ja, man könnte es auch so ändern, dass Play nur im Pause-Modus was macht und Pause nur im Play-Modus, aber ob das einen Vorteil bringt, ist mal fraglich. Aber es hindert dich auf jeden Fall niemand dran, die Tasten auf der Fernbedienung so zu drücken und es wird funktionieren :slight_smile:

Ich hab das extra auf zwei Tasten gelegt, weil Du es auch so drin hast.
Eine ist mir natürlich auch lieber.
Dann versuch ich das nochmal.

Also hast Du beide Kommandos
RC_PLAY
RC_PAUSE
auf einen Befehl gelegt, versteh ich das richtig?

Ja, korrekt (Zeile 4375 als Referenz). Also das Logging ist marginal anders, aber die Auswirkungen sind identisch.

1 „Gefällt mir“

Das habe ich übrigens extra gemacht, weil ich vermutet hatte, dass es sonst Fragen gibt, warum es nicht Beides gibt :joy: Nötig wäre es natürlich tatsächlich nicht.
Eija, man lernt einfach beide Tasten (Pause und Play) an und dann kann man sich das aussuchen, welche Taste man benutzt.

hi @biologist
Könntest Du dir das bitte nochmal anschauen?

Kann leider sobald #define IR_CONTROL_ENABLE einkommentiert ist, nicht mehr kompilieren.
Scheint was mit dem doppelten case PLAYPAUSE zu tun haben.
Kann den Fehler leider nicht genau rauslesen.

Danke schon mal

Schaue ich mir heute Abend mal an. Danke für den Hinweis.

Hmm, also ich habe es gerade versucht zu kompilieren und es gab keinen Fehler. Poste mal welcher Fehler bei dir kommt.

Habe alles upgedated, clean und nochmal neu versucht zu kompilieren.

Das hier meckert er an.

Komisch. Beim ersten mal ging das auch problemlos.
Habe aber mal wieder ein git pull gemacht (wegen FLAC support) und die Play/Pause Geschichte angepasst.

Da muss man dann wohl mit einer Range arbeiten. Wundert mich jetzt irgendwie, dass der Fehler bei mir nicht auch geworfen wird.

Also mit einem Range kann man hier nicht arbeiten, da sich dahinter ja die Hexcodes der Fernbediendung befinden. Da ich den Fehler hier nicht provozieren kann, probiere bitte mal Folgendes und gib mir Feedback:

        switch (IrReceiver.decodedIRData.command) {
            case RC_PLAY:
            case RC_PAUSE: {
                if (rcActionOk) {
                    doCmdAction(CMD_PLAYPAUSE);
                    Serial.println(F("RC: Pause/Play"));
                }
                break;
            }

Also beim ersten Case wird die Deklaration entfernt, die Definition bleibt jedoch stehen.

Ok, habe den Fehler gefunden.
Play und Pause dürfen nicht auf den gleichen HexCode gesetzt werden.
Da kompiliert es dann nicht mehr.

Also funktioniert das hier, bei mir nicht (auch nicht mit dem von dir vorgeschlagenen anderen Code)

Also hast Du beide Kommandos
RC_PLAY
RC_PAUSE
auf einen Befehl gelegt, versteh ich das richtig?

Ist Ok für mich, solange ich das weiß.
Danke wie immer, für Deine schnelle Hilfe.

Ah ok, danke für die Rückmeldung. An sowas Triviales hatte ich gar nicht gedacht.
Habe den Hinweis eben in die Settings aufgenommen.

Wenn du dir mit der Handycamera die InfarotLED beim Drücken anschaust, siehst du sie im Handydisplay flackern.
Ist die Fernbedienung defekt, flackert nichts.

Wenn ich jetzt noch wüsste, wo ich demletzt die RC hingelegt habe, könnte ich es spontan mal testen :joy: Aber danke für den Hinweis.