树莓派蓝牙音箱

来自 Alpine Linux

如何构建树莓派蓝牙音箱

本文介绍如何构建蓝牙音箱。本文正在积极编写中。目前它充满了错误,但会提供一些有用的提示。

开始之前

你需要

  • 一块树莓派
  • 一个蓝牙 USB 适配器(如果你的树莓派板载没有蓝牙)
  • 声卡和扬声器

文章完成度

  1. 测试所有内容
  2. 将每个后台任务转换为服务
  3. 更多关于蓝牙配对的调查

使扬声器工作

为了获得最佳效果,你需要一个专用的音频附加板和匹配的扬声器。更高端的无源扬声器需要合适的放大器(例如 HiFiBerry Amp2 或 IQaudIO IQaudIO DigiAMP+)。

我使用过全系列的 IQaudio 音频板,搭配不同的扬声器和耳机。我还建议使用专用的 USB 蓝牙适配器(不要购买最便宜的版本)。可以使用板载蓝牙和板载音频与耳机进行测试,但是由于丢包,音质不是很好。

一旦扬声器和声卡连接到树莓派,就可以安装一个全新的 Alpine Linux 版本了。Downloads 页面上的 armv7 版本几乎适用于所有树莓派。本 Wiki 有几篇关于在树莓派上安装 Alpine 的文章。

启用写入启动介质

 mount /media/mmcblk0p1 -o rw,remount

然后,启用板载声音

 echo "dtparam=audio=on" >> /media/mmcblk0p1/usercfg.txt

或者你的声卡(例如 IQaudIO)

 echo "dtoverlay=iqaudio-dacplus,unmute_amp" >> /media/mmcblk0p1/usercfg.txt

重启。

按照这些说明启用 ALSA。 总结一下

 apk add alsa-utils alsa-utils-doc alsa-lib alsaconf # the required software for sound
 aplay -l # should display a List of PLAYBACK Hardware Devices

在我的情况下,我的列表是

 **** List of PLAYBACK Hardware Devices ****
 card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones]
   Subdevices: 8/8
   Subdevice #0: subdevice #0
   Subdevice #1: subdevice #1
   Subdevice #2: subdevice #2
   Subdevice #3: subdevice #3
   Subdevice #4: subdevice #4
   Subdevice #5: subdevice #5
   Subdevice #6: subdevice #6

在你从扬声器播放任何内容之前,我建议调低音量。

 amixer

显示一个“简单控制”列表。对于我的耳机和板载声音,输出看起来像这样

 Simple mixer control 'Headphone',0
   Capabilities: pvolume pvolume-joined pswitch pswitch-joined
   Playback channels: Mono
   Limits: Playback -10239 - 400
   Mono: Playback 0 [96%] [0.00dB] [on]

在这种情况下,只有一个控制项“Headphone”,所以我发出此命令将最大音量降低到舒适的水平。(50%)

 amixer sset Headphone 50%

我使用的 IQaudIO DAC 有更多的控制项。我发出此命令来设置音量

 amixer sset 'Digital' 50 # quotes may be required if there are spaces in the control name

注意:可能存在几个相互关联的控件,其中一些控件默认情况下是静音的。ALSA(以及 Linux 上的其他音频软件)的文档记录非常不足,请尝试 `man amixer` 获取更多信息。有时,使用更可视化的控件来更改配置会更容易。

 alsamixer

最后,如果你发出此命令

 speaker-test -t wav -c 2

然后你应该从你选择的扬声器中听到重复的“Front Left, Front Right”。现在是时候设置蓝牙了。不要忘记保存你的更改 (lbu commit)。

蓝牙

我使用 Raspberry Pi 3 - Setting Up Bluetooth 作为参考,并进行了一些细微的修改,因为我使用的是 Pi 4。

树莓派 4

 apk add bluez
 btattach -B /dev/ttyAMA0 -P bcm -S 3000000 &
 # btattach -B /dev/ttyAMA0 -P bcm -S 115200 -N & # Pi 3 - not tested by me
 rc-service bluetooth start

编辑 /etc/mdev.conf 并启用蓝牙。这可以通过取消注释该行并将 btattach 更改为与 Pi 4 一起工作来完成。

/etc/mdev.conf 的内容

... # rpi bluetooth ttyAMA0 root:tty 660 @btattach -B /dev/ttyAMA0 -P bcm -S 3000000 & ...

/etc/bluetooth/main.conf 的更改

 Name = Pi-Bluetooth-Speaker   # This is what you'll see when connecting 
 Class = 0x41C                 # Adding audio playback and recording to this Bluetooth device
 DiscoverableTimeout = 0       # Always discoverable
 AlwaysPairable = true         # Always pairable
 PairableTimeout = 0           # no time limit
 AutoEnable=true               # starts Bluetooth when Linux 'sees' the Bluetooth device at boot

确保蓝牙在启动时启动

 rc-update add bluetooth

蓝牙的状态,包括配对的设备,保存在 /var/lib/bluetooth 中,因此你需要将其添加到 lbu 状态中

 lbu include /var/lib/bluetooth
 lbu commit && reboot

手动设备配对

 bluetoothctl
 [bluetooth]# discoverable on
 [agent] Confirm passkey 627133 (yes/no): yes
 [agent] Authorize service 0000110e-0000-1000-8000-00805f9b34fb (yes/no): yes

设备配对

 apk add python3 py3-dbus py3-gobject3

目前要使其工作,需要在编辑 bluez-simple-agent 使其始终返回成功后运行它。你需要注释掉一些行(通过在开头添加“#”)

 vi /usr/bin/bluez-simple-agent
 #import bluezutils
       def RequestConfirmation(self, device, passkey):
               #print("RequestConfirmation (%s, %06d)" % (device, passkey))
               #confirm = ask("Confirm passkey (yes/no): ")
               #if (confirm == "yes"):
               set_trusted(device)        
               return        
               #raise Rejected("Passkey doesn't match")

然后在后台运行修改后的代理,并配对你的设备

 bluez-simple-agent &
 lbu include /usr/bin/bluez-simple-agent
 lbu commit

注意: BlueZ 堆栈中的配对代理 自 Bluez 5.48 起,iPhone 在连接 BLE GAP 外围设备时需要配对,为什么? Raspbian Stretch 上的 Headless A2DP 音频流

bluez-alsa

在撰写本文时,bluez-alsa 仅在 community 存储库中找到,因此你需要编辑你的存储库列表

 vi /etc/apk/repositories

从 community 存储库中删除“#”,我的存储库是

 https://uk.alpinelinux.org/alpine/v3.14/community

这是最后的冲刺阶段。我们已经让蓝牙工作了,现在我们想将蓝牙链接到扬声器

 apk add bluez-alsa bluez-alsa-utils
 rc-update add bluealsa
 rc-service start bluealsa
 bluealsa-aplay &

Bluetooth Audio ALSA Backend bluez-alsa doc man bluealsa man bluealsa-aplay Linux 中的蓝牙音频:ALSA 和 LDAC

参见

树莓派博客关于 如何使用树莓派播放声音和制造噪音

有很多扬声器和放大器选项