このページには 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
- Secondary UART は GPIO には現れず、Bluetooth に接続されている
- デフォルトでは UART0 が secandary となっている
- Linux デバイスとしては PL011 (UART0) が
/dev/ttyAMA0
、mini UART (UART1) が/dev/ttyS0
として見える
これらをまとめると次の状態です。
PL011 (UART0) | mini UART (UART1) |
---|---|
enabled | disabled |
secondary (Bluetooth) | primary |
従って、UART を GPIO で使おうと思うと、次のように変更する必要があります。
PL011 (UART0) | mini UART (UART1) |
---|---|
enabled | enabled |
primary | secondary (Bluetooth) |
Bluetooth を使える状態にしたまま GPIO で UART を使えるようにするための設定変更 #
Linux デバイスとしての UART は次のように見えるということです。
Linux デバイス | 説明 |
---|---|
/dev/ttyAMA0 | PL011 (UART0) |
/dev/ttyS0 | mini UART |
/dev/serial0 | primary UART |
/dev/serial1 | secondary 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=250
と dtoverlay=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