Raspberry Pi (RPi) には、本体に内蔵Bluetoothが搭載されています。でも性能向上を目指して、USB接続のUSB Bluetoothアダプタを使っています。RPi本体内蔵のBletoothは使用しないのでoffにしました。
RPiには外付けBTが有用
RPi 3, 4, ZeroにはWiFiとBluetoothが内蔵されていますが、あまり性能は良くないです。コストダウンでプリント基板の上に配線でアンテナが作ってあり、本格的なアンテナよりは性能が劣ると思います。(ちなみに、初期のRPi 3ではちゃんとしたアンテナ部品が基板上に搭載されていました。)また、アンテナ周囲のデジタル回路からのノイズも受けやすいと思われます。特にBLEのように小電力の場合はノイズの影響が大きいようです。
ノイズを低減するには、RPiに延長USBケーブルを付けて、USB接続のBluetoothアダプタを取り付けると良いと考えました。プリンストンのBluetooth 4.0 USBアダプタのように、CSRのチップを搭載したアダプタならば、Linux系OSにドライバが標準搭載されてます。RPi OSでも、このアダプタは、USBに挿すだけで、OOTB (Out Of The Box) で動作します。
USB Bluetooth アダプタを取り付けると、本体内蔵のBluetoothモジュールは不要になります。内蔵モジュールが動いていると悪影響を与えるかもしれませんし、間違って内蔵モジュールが使われてしまっては外付けアダプタを取り付けた意味がなくなります。なので、内蔵モジュールをoffにすることを考えました。
SwitchBotデバイスをBLE接続中
ちなみに、RPiのBluetoothアダプタには、SwitchBotのスイッチボットとカーテンを接続してます。SwitchBotのハブやクラウドは使用しない構成で、BLEでローカルにコントロールしています。
そのために、Homebridgeのプラグインとして、homebridge-switchbot-bleを使用してます。
このプラグインが、USB接続と内蔵のどちらのBTモジュールに接続しているのか確信が無いのですが、内蔵をoffにしたらそれも確実になります。
内蔵Bluetoothをoffにする
そこで、RPiの内蔵Bluetoothをoffにする方法を探して、設定しました。
動作状態を確認
まずはhciconfigコマンドで接続しているBluetoothデバイスを確認いました。
pi@raspberrypi:~ $ hciconfig hci1: Type: Primary Bus: UART BD Address: E4:5F:99:99:99:99 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:795 acl:0 sco:0 events:50 errors:0 TX bytes:1783 acl:0 sco:0 commands:50 errors:0 hci0: Type: Primary Bus: USB BD Address: 00:1B:99:99:99:99 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING RX bytes:1820 acl:0 sco:0 events:105 errors:0 TX bytes:2750 acl:0 sco:0 commands:105 errors:0
hci1とhci0という2個のアダプタがあるようで、hci1はUART (シリアル通信チップ?)、hci0はUSB接続です。USBなのが外付けしたプリンストンのUSBアダプタで、UART接続のものがRPi内蔵Bluetoothのようです。
rfkill listは、無線ユニットの状態を知るコマンドです。これを実行したところ、2個のBluetoothと1個のWiFiモジュールが動作していることが確認できました。
$ rfkill list 0: phy0: Wireless LAN Soft blocked: no Hard blocked: no 1: hci0: Bluetooth Soft blocked: no Hard blocked: no 2: hci1: Bluetooth Soft blocked: no Hard blocked: no
起動時に内蔵BTをoffにする
検索して探したところ、/boot/config.txt ファイルの最後に、
dtoverlay=disable-bt
という行を追加すると、起動時に内蔵Bluetoothをoffにできるらしいです。sudo vi /boot/config.txt コマンドで、この行を追加して、RPiを再起動しました。
非動作になったことを確認
再起動後に、再びはhciconfigコマンドを試しました。
pi@raspberrypi:~ $ hciconfig hci0: Type: Primary Bus: USB BD Address: 00:1B:99:99:99:99 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING RX bytes:1216 acl:0 sco:0 events:70 errors:0 TX bytes:2052 acl:0 sco:0 commands:70 errors:0
hci0だけになってます。UART接続のモジュールが消えて、USB接続のモジュールがhci0に繰り上がったようです。
rfkill listコマンドも再び試しました。
$ rfkill list 0: phy0: Wireless LAN Soft blocked: no Hard blocked: no 1: hci0: Bluetooth Soft blocked: no Hard blocked: no
こちらでもBluetoothが1個だけになっていることを確認しました。SwitchBotのデバイスは引き続きコントロールできましたので、外付けUSB Bluetoothアダプタがhci0として動作していることを確認できました。
まとめ
USB接続の外付けBluetoothアダプタを使っているので、RPi内蔵のアダプタをoffにしたいと思いました。それで、/boot/config.txt ファイルの最後に、dtoverlay=disable-bt という1行を追加したら、Raspberry Pi 4内蔵のBluetoothアダプタをoffにできました。
コメント