Raspberry – odbiornik muzyki dla słuchawek

Bluetooth – czy kabel? To podstawowe pytanie, które zadają sobie wszyscy kupujący nowe słuchawki. Każde rozwiązanie ma swoje zalety i wady. Połączenie przez bluetooth jest po prostu wygodniejsze. Niestety – czasami się zrywa, muzyka chrzęści albo włącza się jakiś dziwny tryb o jakości rozmowy z budki telefonicznej. Za tą samą cenę możemy zazwyczaj kupić słuchawki przewodowe o kilka klas lepsze. No i kabel nie zrywa muzyki.

Ja mam słuchawki przewodowe. Ale chciałbym korzystać z wolności, jaką daje bluetooth. Co więcej – używam telefonów z serii „rugged” – wzmocnionych, wodoodpornych, pyłoszczelnych. Dostanie się do gniazd wymaga tu usunięcia grubej zaślepki – co ani nie jest łatwe, ani wygodne.

Podobnie użytownic starszych zestawów grających – nie wyposażonych w bluetooth. Może fajnie by było wykorzystać ich głośniki transmitując bezprzewodowo dźwięk z telefonu?

W sprzedaży znajdziecie odbiorniki BT. Podłaczacie do nich słuchawki. Z Waszego telefonu łączycie się z nimi po BT. Ceny zaczynają się od 20 złotych aż do setek… Nie próbowałem ich i nie wiem jak dobrze działają. Ale po co wydawać kolejne pieniądze, skoro… wszystko leży w domu?

Zbuduję więc proste urządzenie, gdzie źródła dźwięku BT będą łączyć się do raspberry pi a ta – wyprowadzać sygnał audio na słuchawki.

Raspberry Pi Zero „W”

Do tego projektu użyję wersji Zero W. Jej zaletą jest niewielki rozmiar i wbudowany moduł BT. Wadą – brak wyjścia słuchawkowego. W tej roli użyję karty dźwiękowej.

Zacznijcie od samego początku:

  • Pobierzcie obraz raspbiana z raspberry.org/Downloads – najlepiej wersję Buster Lite,
  • Wypalcie obraz na karcie.

Teraz na widocznej partycji dodajcie plik 'ssh’ (bez rozszerzenia). Domyślnie ssh nie jest włączone (nie można się do raspberry dostać przez terminal). Stworzenie tego pliku uruchomi ssh przy starcie.

Co dalej nie rozwiązuje problemu komunikacji z Raspberry. Terminal będzie dostępny, ale jak Raspberry ma podłączyć się do sieci wifi? Na tej samej partycji stwórzcie plik 'wpa_supplicant.conf’ z następującą zawartością:

I jeszcze jeden szczegół dla tych, którzy mają filtrowanie MAC ustawione na routerze: musicie zalogować się na router i sprawdzić, jakie urządzenia się do niego łączą. Wtedy znajdziecie adres MAC RPi – i możecie dodać go do whitelist’y. Poznacie też jej adres IP.

Następnie, z dowolnego komputera w sieci (moja RPi ma adres 192.168.1.102, u Was jest zapewne inny) możecie się zalogować i uzupełnić system:

Ostatnia instrukcja ustawia hasło su – czasami się przydaje.

Karta muzyczna

RPi Zero nie ma wyprowadzonego wyjścia jack. Jest kilka sposobów podłączenia go. Ale w szafie znalazłem kartę muzyczną na USB.

Karta ta sprzedawana jest na portalach jako „USB DAC, PCM2704, COAXIAL, S/PDIF, karta dźwiękowa”. Kosztuje ok. 30 PLN. Podłącza się ją do USB za pomocą kabla drukarkowego. Możecie wybierać między wyjściem SPDIF (optyczne), kompozytowym lub słuchawkowym jackiem stereo. W moim projekcie tylko to ostatnie miało zastosowanie.

Po podłączeniu, karta zidentyfikowała się jako:

Ok, czyli nasza karta ma identyfikator 1. Teraz ustawimy ją jako domyślną (na podstawie tutaj):

Ostatnia linijka powinna wygenerować szum na zmianę na lewym i prawym kanale. Podłączając słuchawki możecie sprawdzić, czy wszystko jest ok.

BT i audio

Ok, nasza RPi odgrywa teraz dźwięk przez nią generowany i wyprowadza ją na jacka. Teraz musi zamienić się w odbiornik BT i przekazywać dźwięk na wyjście audio. Nie ma co kombinować – ktoś już to zrobił za nas:

  • https://raspberrypi.stackexchange.com/questions/47708/setup-raspberry-pi-3-as-bluetooth-speaker
  • https://www.raspberrypi.org/forums/viewtopic.php?t=161944
  • https://www.instructables.com/id/Turn-your-Raspberry-Pi-into-a-Portable-Bluetooth-A/
  • https://raspberrypi.stackexchange.com/questions/47708/setup-raspberry-pi-3-as-bluetooth-speaker
  • https://www.raspberrypi.org/forums/viewtopic.php?f=38&t=247892
  • https://www.raspberrypi.org/forums/viewtopic.php?t=235519

Działam:

Dodatkowo (niezbyt eleganckie, ale innego rozwiązania nie znalazłem):

  • Ustawiam automatyczne logowanie użytkownika PI :sudo raspi-config”: Boot Options/ Desktop/ CLI /Console Autologin
  • Wymuszam przekazywanie audio na jack’a: „sudo raspi-config”: Advanced Options/ Audio/ Force 3.5 mm
  • Edytuję .bashrc:

Problemy z połączeniem

Pacjent: telefon z Android 9. Problem: brak połączenia.

Sprawa skomplikowała się w momencie, gdy mój telefon podłączał się do RPi… czasami. Powoli eliminowałem kolejne scenariusze. W rezultacie naprowadził mnie wpis na stackexchange. Problem występuje w momencie, gdy do RPi podłącza się urządzenie, które nie jest zaufane. Jasne, używając bluetoothctl i instrukcji 'trust xx:xx:xx:xx:xx:xx’ (z adresem mac) – można to zrobić ręcznie. Ale chyba nie o to chodzi, żeby grzebać po konsoli za każdym razem jak chcemy posłuchać muzyki z nowego urządzenia.

Poniższe rozwiązanie jest dalekie od ideału. Czasem trzeba się podłączać 1-2 razy aż ustawi się flaga „trusted” na danym urządzeniu. Za to nie wymaga logowania do konsoli.

Inspiracją był wpis na circuitdigest. Potrzebny będzie expect:

Teraz 3 skrypty: pierwszy ustawia wszystkie sparowane urządzenia w tryb „trusted” (pamiętajcie o chmod +x bt_trust_all.sh):

Powyższy skrypt potrzebuje adresów mac sparowanych urządzeń (bt_list_mac.expect):

I ten który dodaje mac’i w bluetoothctl (bt_trust.expect):

A jak to-to uruchomić? Ano dodałem do udev: w „/lib/udev/rules.d/90-pi-bluetooth.rules” linijkę:

Pamiętajcie, żeby po zmianach w udev zaaplikować reguły (z konta su):

Podsumowanie

Ok, mam już działający odbiornik BT oparty na Raspberry Pi Zero W. Testowałem z Nokia 6 i K&M Drive 6s. Dźwięk jest akceptowalny… zdarzają się drobne zacięcia, dźwięk wydaje się być mniej „soczysty” – ale działa to na tyle dobrze, że postanowiłem nieco rozwinąć projekt.

Teraz czas by go uniezależnić od gniazdka i w coś opakować. Ale to już inna historia:)

Zapraszam do komentowania na Facebook.

Źródła

  • Karta USB – jak ustawić
  • https://unix.stackexchange.com/questions/334386/how-to-set-up-automatic-connection-of-bluetooth-headset