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.

1 „Gefällt mir“

@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“

Hey,

ich bin gerade dabei meine Box komplett neu aufzusetzen und würde gerne auch Bluetooth für Kopfhörer einbinden. Jedoch ist meine Kleine noch zu klein um das hinzubekommen mit der Modifikationskarte. Das würde sie nicht verstehen warum sie immer wechseln muss wenn sie normal hören möchte. Gibt es eine Möglichkeit beide Modi zu aktivieren und wenn sich ein BT Gerät verbindet, dass die Musik dann nur dort abgespielt wird?
Hab einen D1 mini pro. Geht das (mit ggfls. anderen Einschränkungen) mit diesem oder auch gerne mit einem anderen Gerät? Speicher sollte beim Pro ja wesentlich mehr vorhanden sein als beim normalen.

Viele Grüße

Der D32 pro besitzt einen ESP32 Wrover. Der hat zwar mehr Flash-Speicher, aber hier geht’s um den RAM. Und der ist gleich. Das Problem ist halt, dass die BT-Lib sehr viel Speicher braucht.
Aber @tueddy kann dazu bestimmt was sagen :slight_smile:.

1 „Gefällt mir“

Das wird klappen wenn Du immer im Modus OPMODE_BLUETOOTH_SOURCE startest:

Solange kein BT-Kopfhörer verbunden ist spielt der Player normal über Lautsprcher ab. Erst wenn eine Kopfhörer Verbindung da ist wird der Lautsprecher ausgeschaltet. Wird die Kopfhörer-Verbindung getrennt spielt die Musik wieder über den Lautsprecher.
Allerdings hatte ich in meinen Tests auch schon „Hänger“ beobachtet, d.h. die Umschaltung klappte nicht mehr.

WLAN ist in diesem Modus deaktiviert! Ob das dann praktikabel ist musst Du mal ausprobieren…

2 „Gefällt mir“

Hi,
ich habe jetzt auch mal versucht einen Bluetooth Kopfhörer anzumelden. Es ist ein günstiger aus dem Actionmarkt (10 Euro). Mit Windows und meinem iPhone funktioniert er ganz gut, nur leider bekomme ich den nicht an die ESPuino Box gebunden…

  • Firmware ist Stand von heute
  • Karte eingerichtet und aufgelegt
  • LEDs wechseln die Farbe auf weiß-lila
  • der Kopfhörer ist im Pairing Mode und an kein anderes Gerät angemeldet

Dann gehts aber leider nicht weiter… keine Verbindung zwischen Box und Kopfhörer…

So meldet sich der Kopfhörer unter Windows:
image

und eingetragen habe ich ihn so:

constexpr const char nameBluetoothSourceDevice PROGMEM = „ACT-BHP-JR“;

Habe ich was falsch gemacht?

Im Serial-Monitor siehst Du dann die gefundenen Geräte & evt. auch die Ursache warum sich der Kopfhörer nicht verbinden will.

Danke für die Antwort.
Für Serial muss ich die Box dann erstmal auseinander nehmen… da komme ich leider im eingebauten Zustand nicht dran. Melde mich wenn ich ein Log habe.

Ist das dieser Kopfhörer?

Der Preis ist ja Hammer - Da würde ich meine Frau losschicken, die geht dort gern shoppen :wink:
Kommt da auch halbwegs vernünftiger Ton raus?

Hi,

ja genau dieser Kopfhörer ist das. Klang ist ganz ok. Mein Sohn findet ihn auf jeden Fall gut. Ist halt nicht vergleichbar mit nem 100€+ Kopfhörer. Die maximale Lautstärke finde ich auf kindergerecht. Und USB-C Ladebuchse und auch noch n Klinkeneingang.

Ich habe den debuglevel angepasst und das hier ist die Ausgabe, wenn ich die Kopfhörer Karte drauf lege (Kopfhörer liegt eingeschaltet neben der Box):


| | / | | _ \ _ _ () _ __ ___
| | _ \ | |
) | | | | | | | | ’
\ / _
| |
) | | __/ | || | | | | | | | | () |
|
____| |
/ || _,| || || |_| ___/
Rfid-controlled musicplayer

[ 1143 ] Software-revision: 20230214-1
[ 1147 ] Git-revision: unknown
[ 1150 ] ESP-IDF version: v3.3.5-1-g85c43024c
[ 1154 ] Wakeup was not caused by deepsleep: 0
[ 1158 ] Versuche SD-Karte wird im SD_MMC-Modus (1 Bit) zu mounten…
[ 1164 ] SD card type: [ 1166 ] SDHC
[ 1168 ] SD-Kartengröße / freier Speicherplatz: 30436 MB / 5068 MB
[ 1175 ] FTP-User wurde aus NVS geladen: esp32
[ 1179 ] FTP-Passwort wurde aus NVS geladen: esp32
[E][Preferences.cpp:472] getString(): nvs_get_str len fail: btDeviceName NOT_FOUND
[ 1203 ] PN5180 firmware version=3.5
[ 1207 ] RFID-Tags koennen jetzt gescannt werden…
[ 1709 ] Bluetooth source started, connect to device: ‚ACT-BHP-JR‘
[ 1710 ] Freier Heap-Speicher nach Setup-Routine: 63052
[ 1711 ] PSRAM: 4192456 bytes
[ 1712 ] Flash-size: 16777216 bytes
[ 1719 ] Neue Lautstärke empfangen via Queue: 3
[ 10003 ] Aktuelle Batteriespannung: 4.09 V
[ 10004 ] Aktuelle Batterieladung: 97.06 %
[ 35027 ] RFID-Karte erkannt: (ISO-14443) ID: 12-74-84-e4
[ 35031 ] RFID-Karte empfangen: 018116132228
[ 35051 ] Playlist-Generierung: cached
[ 35078 ] Freier Speicher: 57800
[ 35079 ] Anzahl gültiger Files/Webstreams: 33
[ 35079 ] Modus: Alle Tracks eines Ordners zufällig
[ 35083 ] Neue Playlist empfangen mit 33 Titel(n)
[ 35084 ] Free heap: : 58648
[ 35132 ] info : PSRAM found, inputBufferSize: 283615 bytes
[ 35133 ] info : buffers freed, free Heap: 58648 bytes
[ 35133 ] info : Reading file: „/Hoerspiele/08 - Paw Patrol/032.MP3“
[ 35156 ] info : MP3Decoder has been initialized, free Heap: 35020 bytes
[ 35156 ] ‚/Hoerspiele/08 - Paw Patrol/032.MP3‘ wird abgespielt (1 von 33)

Action - Meine Frau hat bereits zugeschlagen und ich habe den Maxxter hier bereits liegen.
Im Vergleich zum MyPogs-BT Kopfhörer ist der nicht so wertig aber kostet eben auch nur 1/6…

Dein Log enthält leider nicht die gewünschten Bluetooth-Ausgaben. Hast Du das Projekt mit „build“ neu erzeugt?

[ 1709 ] Bluetooth source started, connect to device: ‚ACT-BHP-JR‘

Das sagt nur mit welchem BT-Device sich die Box verbinden möchte, Logging könnte für diese Fehlersuche noch verbessert werden.

Ich werde mal schauen ob wann ich das testen kann…