Bluetooth を使える状態にしたまま GPIO で UART を使うための設定

このページには Raspberry Pi の UART のデフォルトの設定と、Bluetooth を使える状態にしたまま GPIO で UART を使えるようにするための設定方法について書いてあります。

Raspberry Pi OS で Bluetooth を使える状態にしたまま GPIO で UART を使うための設定 #

Raspberry Pi の UART のデフォルト状態 #

UART に関する公式ドキュメントを見ると次のような情報が記載されています。

  • Raspberry Pi Zero, 1, 2, 3 は PL011 (UART0) と mini UART (UART1) の2つの UART がある
  • デフォルトでは PL011 (UART0) は有効化されており、mini UART (UART1) は有効化されていない
  • UART には Primary と Secondary がある
  • Primary UART は GPIO 14/ 15 が送受信用に割り当てられ、それぞれがピン番号 8/ 10 に割り当てられている
  • デフォルトでは primary UART は Linux コンソールにも割り当てられている

GPIO pin assingment 出典: 公式ドキュメント GPIO

  • Secondary UART は GPIO には現れず、Bluetooth に接続されている
  • デフォルトでは UART0 が secandary となっている
  • Linux デバイスとしては PL011 (UART0) が /dev/ttyAMA0、mini UART (UART1) が /dev/ttyS0 として見える

これらをまとめると次の状態です。

PL011 (UART0)mini UART (UART1)
enableddisabled
secondary (Bluetooth)primary

従って、UART を GPIO で使おうと思うと、次のように変更する必要があります。

PL011 (UART0)mini UART (UART1)
enabledenabled
primarysecondary (Bluetooth)

Bluetooth を使える状態にしたまま GPIO で UART を使えるようにするための設定変更 #

Linux デバイスとしての UART は次のように見えるということです。

Linux デバイス説明
/dev/ttyAMA0PL011 (UART0)
/dev/ttyS0mini UART
/dev/serial0primary UART
/dev/serial1secondary UART

Raspberry Pi OS をインストールした状態でデバイスを見てみると次のように表示されます。 Secondary UART が有効化されており、それが PL011 (UART0) に該当することがわかります。

$ ls -l /dev/
...
lrwxrwxrwx 1 root root           5 Dec 13 22:57 serial1 -> ttyAMA0
...

Mini UART を secondary UART として Bluetooth で使用する設定をするためには /boot/config.txt ファイルに core_freq=250dtoverlay=miniuart-bt を追記すればよいということです。

sudo sed -i -e '$ a \\n# UART\n core_freq=250\n dtoverlay=miniuart-bt' /boot/config.txt

設定を有効化させるためにリブートします。

リブート後、Linux デバイスを見ると次のように期待通りの設定になっています。

$ ls -l /dev/
...
lrwxrwxrwx 1 root root           5 Dec 13 22:57 serial0 -> ttyAMA0
lrwxrwxrwx 1 root root           7 Dec 13 22:57 serial1 -> ttyS0

なお、Bluetooth を mini UART で使う影響として、最大利用可能なボーレートが下がります。

また、シリアルコンソールが有効になっているままだと、UART がうまく動かない場合があります。 公式の無効化の説明のとおり、 raspi-config コマンドでシリアルコンソールを無効化するか、下記のコマンドで直接シリアルコンソールを無効化することもできます。

sudo sed -i -e 's/console=serial0,115200 //' /boot/cmdline.txt