树莓派蓝牙音箱
如何构建树莓派蓝牙音箱
本文介绍如何构建蓝牙音箱。本文正在积极编写中。目前它充满了错误,但会提供一些有用的提示。
开始之前
你需要
- 一块树莓派
- 一个蓝牙 USB 适配器(如果你的树莓派板载没有蓝牙)
- 声卡和扬声器
文章完成度
- 测试所有内容
- 将每个后台任务转换为服务
- 更多关于蓝牙配对的调查
使扬声器工作
为了获得最佳效果,你需要一个专用的音频附加板和匹配的扬声器。更高端的无源扬声器需要合适的放大器(例如 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
的内容
/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
参见
树莓派博客关于 如何使用树莓派播放声音和制造噪音
有很多扬声器和放大器选项