Neues Feature: Bluetooth Kopfhörer

Hi,
ich möchte Euch ein neues Feature vorstellen, ESPuino kann jetzt Musik über einen Bluetooth-Kopfhörer abspielen. Dazu ist keine weitere Hardware notwenig, wie das hier schon mal gemacht wurde.:

Es gibt einen neuen Modus OPMODE_BLUETOOTH_SOURCE. Dieser kann über eiine Modifier-Karte in der Weboberfläche oder über ein CMD an einer Taste aktiviert werden. Der Ablauf ist genau gleich zum bestehenden BT-Sink (ESPuino als BT-Lautsprecher) Modus. Der ESP startet neu und versucht sich mit dem angegebenen Device zu verbinden. Der Name muss derzeit noch in settings.h eingetragen werden im Wert nameBluetoothSourceDevice[] PROGMEM = "My POGS Wireless Headphone" . Kann später evt. auch über die Weboberfläche eingetragen werden, das ist bereits vorgesehen.
Beim Start in diesem Modus blinken die LEDs blau-violett, nach dem Pairing wechseln die auf Blau. Legt man jetzt eine Musikkarte auf wird der Sound auf den Kopfhörer gestreamt…

Vielen Dank auch an @Wolle der die Möglichkeit dazu in seiner Bibliothek geschaffen hat!
Freue mich auf Feedback…

6 „Gefällt mir“

Setzt das jetzt eigentlich Arduino2 voraus oder läuft das auch mit 1.0.6?
So oder so: Vielen Dank für deinen Support! :+1:

Nein, Arduino 1.0.6 oder 2.0.x läuft, beides getestet.

Es gibt nur wenige Einschränkungen:

  • Das erste Pairing ist etwas hakeilg. Aber das hatte ich auch schon so beim BT-Sink.
  • Die Samplingrate sollte 44.1 KHZ betragen, sonst gibt es Mickey-Maus Sound. Hatte jetzt nur eine Testdatei wo das Sampling anders war…
1 „Gefällt mir“

Noch eine Info zur Reichweite:

Ohne Gehäuse (hier liegt mein Test Lolin D32 Pro offen herum) komme ich mit dem POGS Kinder-Kopfhörer auf 3 Meter ruckelfreie Übertragung. Also etwas weniger als „normale“ Bluetooth Verbindungen, da geht’s 5-6 Meter je nach Gerät). Das sollte aber für den Betrieb reichen…

Ein Gedanken/eine Idee
Könnte man die RFID-karte mit der ID des Bluetooth-Empfängers verknüpfen und dadurch z.B. den Kopfhörer mit einem RFID-Tag versehen, um das pairing „Kinderleicht“ zu machen?

@tueddy Habe das Feature versucht zu testen. Bin dann zuerst in einen Compile-Fehler gelandet, weil constexpr für SinkDevice gefehlt hat. Hab’s dann gefixt und kompiliert. Karte habe ich angelernt und konnte auch in den BT-Source-Modus wechseln. Habe dann meinen „Jabra Evolve2 65“ angelernt und sowas ESP32 als auch der Kopfhörer haben „connected“ gesagt.
Es kam allerdings weiterhin die Musik nur aus dem Lautsprecher und nicht aus dem Kopfhörer. Weiterhin war der Neopixel ziemlich dunkel.

Könnte man machen, aber ob’s die Arbeit wert ist? Geht bei Kindern der Trend schon zum Zweit-BT-Kopfhörer? :thinking:
Es ist halt so, dass der Wechsel in einen BT-Modus als Modkarte läuft und dort ist es bisher unüblich, dass man Parameter eingibt. Das müsste man dafür dann umbauen. Und wenn man im BT-Source-Modus (Kopfhörer) ist und eine andere BT-Karte auflegt, dann wird man vermutlich, damit das auch sicher klappt, einen Neustart brauchen. Legt man die gleiche BT-Karte erneut drauf, wechselt man wieder in den „normalen“ Modus.
So oder so: Ich könnte das Feature nicht testen, weil ich nur einen BT-Kopfhörer im Haus habe.

Die Idee kam mir, weil meine Enkel das Gerät im Wechsel verwenden und mit ihren eigenen Kopfhörern verbinden. Das gibt es ja auch im „profi“-Bereich, wo über NFC direkt gekoppelt wird. War nur ein Gedanke, weil ich die derzeitige Lösung (setting.h Eintrag) für zu inflexible halte. Bin mal gespannt, wie es sich weiter entwickelt. Auf jeden Fall tolles Gerät mit vielen Möglichkeiten.

Da hast du auch absolut Recht. @tueddy hat ja schon in Aussicht gestellt, dass man das über die GUI konfigurieren könnte. Das machen wir dann auch. Für die ersten Wurf finde ich es aber absolut in Ordnung, dass man es so macht. Zumal @sonovice ja eh an der GUI rumbaut. Da macht es nicht so viel Sinn, sich nochmal Arbeit mit der aktuellen GUI zu machen.

@biologist Im Log müsste eine Meldung "Bluetooth source => audio: started" erscheinen, erst dann fängt das Streaming an und der Lautsprecher verstummt.
Ohne dieses Ereignis wird Audio normal weiter auf dem Lautsprecher ausgegeben. Evt. kannst Du mir den Log einmal zusenden.
Mit build_flags = -DCORE_DEBUG_LEVEL=5 bekommt man auch die detailierten Ereignisse auf Bluetooth Ebene.

@hnymphius Gute Idee, ich schaue mal ob das machbar ist. Änderungen an der Weboberfläche möchte ich aber aufgrund des laufenden Refactoring nicht machen…

@biologist hat mir von heftigen Streaming-Aussetzern berichtet die jetzt auch nachvollziehen konnte:

Der Audio-Task muss den Puffer ja ständig füttern den der Bluetooth-Task dann durch das Senden verbraucht.
Nun scheint der ESP32 in diesem Modus ziemlich am Anschlag zu sein. Der Puffer läuft immer wieder leer und das Audiosignal unterbricht. Das Problem tritt in Arduino 1.0.6 auf (Die vom ESPuino derzeit verwendete Version). Mit Arduino 2.0.x scheint der BT-Stack oder was auch immer optimiiert zu sein, so dass die Tasks mehr Rechenzeit bekommen, das Streaming läuft unterbrechungsfrei.

Einen Bugfix dazu habe ich hochgeladen, außerdem leuchten die LED auch im Pause-Modus blau. Mit den Korrekturen bekomme ich in 1.0.6 nur minimale Aussetzer zum Start der Übertragung. Bei 2.0.x überhaupt keine.

Wäre schön wenn sich hier noch ein Early-Adapter findet der das so bestätigen kann. Zum Testen reicht auch ein normaler BT-Lautsprecher. Wichtig das Ihr vor dem Test die Audio-Bibliothek auf den aktuellen Stand bringt.

So, ich habe meine Faulheit jetzt endlich mal überwunden und jetzt gerade deinen aktuellen Master-Branch mit dem heutigen Commit am Start. Und tatsächlich kann ich bestätigen, dass die Übertragung ohne Aussetzer funktioniert. Auch bei mp3s mit 320 kBit/s. Cool!
Getestet habe ich das mit einem Jabra Evolve2 65, also einem recht hochwertigen Headset, und damit kann ich problemlos hier in unserem EFH auch ein Stockwerk höher gehen. In den Stahlbeton-Keller jedoch nur ein Stück weit. Das deckt sich allerdings mit der Performance, die ich auch sonst habe, wenn ich das mit meinem Laptop gekoppelt habe.

Anmerkungen:
a) Beim Start von einem Titel gibt’s kurz ein komisches Geräusch. Passiert aber nicht bei allen Files. Find’s jetzt nicht dramatisch, aber man hört es deutlich.
b) Bei mir kommt weiterhin ein Compile-Fehler, weil nameBluetoothSinkDevice in der Settings.h fehlt. Hab’s eingetragen, dann geht’s.
c) Funktioniert mit 1.0.6 und auch mit 2.0.5. Mit 2.0.5 dauert der Connect zum Headset allerdings manchmal länger.

Hab’s in meinen Hauptzweig aufgenommen. Vielen Dank @tueddy für deine Arbeit! :+1:

1 „Gefällt mir“