第10回: GPIOを汎用UARTとして使用する方法

オンボードでBluetoothをサポートしているラズパイ3やZero Wと、そうじゃないラズパイではUART(シリアル通信)の仕様が異なります。
そのため、ラズパイの種類によりGPIOでUARTを使うための設定が異なります。分かりにくかったのでまとめてみました。

1. ラズパイのUART仕様

ラズパイ公式のUARTのドキュメントを読み解いていきます。

2つのUART(PL011とmini UART)があって振る舞いが違います。

The SoCs used on the Raspberry Pis have two built-in UARTs, a PL011 and a mini UART. They are implemented using different hardware blocks, so they have slightly different characteristics.

The Raspberry Pi UARTs

 

振る舞いの差ですが、具体的にはPL011に対してmini UARTには次のような機能制限があります。

  • ブレークを検出できない
  • フレームエラーを検出できない
  • パリティビットを使えない
  • タイムアウト割り込を使えない
  • DCD, DSR, DTR, RI信号がない

The particular deficiencies of the mini UART compared to the PL011 are :

  • No break detection
  • No framing errors detection
  • No parity bit
  • No receive timeout interrupt
  • No DCD, DSR, DTR or RI signals

Further documentation on the mini UART can be found in the SoC peripherals document here.

The Raspberry Pi UARTs

 

Bluetoothの有無で、UARTのデフォルト構成が異なります。

  • Bluetoothあり
    • プライマリUART: mini UART, シリアルコンソールで使用中
    • セカンダリUART: PL011, Bluetoothモジュールに接続されている
  • Bluetoothなし
    • プライマリUART: PL011 (説明がないけど)シリアルコンソールで使用中
    • セカンダリUART: (説明がないけど)なし

By default, on Raspberry Pis equipped with the wireless/Bluetooth module (Raspberry Pi 3 and Raspberry Pi Zero W), the PL011 UART is connected to the Bluetooth module, while the mini UART is used as the primary UART and will have a Linux console on it. On all other models, the PL011 is used as the primary UART.

The Raspberry Pi UARTs

 

デバイスファイルの対応は、

  • miniUART : /dev/ttyS0
  • PL011: /dev/ttyAMA0
  • プライマリ UART: /dev/serial0(シンボリックリンク)
  • セカンダリ UART: /dev/serial1(シンボリックリンク)

In Linux device terms, by default, /dev/ttyS0 refers to the mini UART, and /dev/ttyAMA0 refers to the PL011. The primary UART is the one assigned to the Linux console, which depends on the Raspberry Pi model as described above. There are also symlinks: /dev/serial0, which always refers to the primary UART (if enabled), and /dev/serial1, which similarly always refers to the secondary UART (if enabled).

The Raspberry Pi UARTs

 

Blutoothありのラズパイ3のデバイスファイルを確かめてみました。プライマリ(serial0)はminiUART(ttyS0)へ、セカンダリ(serial1)はPL011(ttyAMA)へのシンボリックリンクになっています。

 

Blutoothなしのラズパイ2のデバイスファイルを確かめてみました。プライマリ(serial0)はPL011(ttyAMA0)へのシンボリックリンクになっています。セカンダリ(serial1)はありません。

 

シリアルコンソールの設定は、/boot/cmdline.txtで確認できます。

ラズパイ3です。console=serial0、つまり、mini USB(ttyS0)がコンソールとして使われています。

 

ラズパイ2です。console=serial0、つまり、PL011(ttyAMA0)がコンソールとして使われています。

 

以上、Bluetoothの有無による仕様の違いを実際に確かめてみました。

 

2. GPIOを汎用UARTとして使用するには

GPIO14及び15(ピンヘッダの8番及び10番)を汎用UARTとして利用するには、PL011(/dev/ttyAMA0)経由で入出力を行います。ただし、このデバイスファイルは、デフォルトで、BlutoothありラズパイではBluetoothモジュールに繋がっており、Bluetoothなしラズパイではシステムコンソールで利用されているため、このままではGPIOでUARTを使う事が出来ません。そこで、次の手順で設定を変更します。

Bluetoothありラズパイの場合

Bluetoothの割り当てをmini UARTに変更します。

再起動後、デバイスファイルを確認すると、プライマリ(serial0)がPL011(ttyAMA0)へ、セカンダリ(serial1)がmini UART(ttyS0)へ、プライマリとセカンダリがスイッチしています。

 

プライマリとセカンダリがスイッチした結果、/boot/cmdline.txtの設定により、serial0つまりPL011(ttyAMA0)がシリアルコンソールになってしまうので、serial0serial1に修正します。あるいは、後述の方法で、シリアルコンソール自体を無効にしてもOKです。

 

Bluetoothなしラズパイの場合

PL011(/dev/ttyAMA0)がシリアルコンソールに使われているため、シリアルコンソール自体を無効にします。

sudo raspi-configの後、[5 Interfacing Options] > [P6 Serial] > [いいえ] > [はい] > [了解]と進みます。

 

設定が済んだら再起動です。
デバイスファイルを確認すると、特に変化はありません。

 

/boot/cmdline.txtからは、console=serial0,115200の記述が消えています。

 

これでシリアルコンソールが無効になり、GPIOを汎用UARTに利用できるようになりました。

 

以上、ラズパイのGPIOを汎用UARTとして使用する方法でした。


目次

第1回: セットアップに必要なもの
第2回: SDカードにRaspbianをインストールする
第3回: 起動!
第4回: リモートログインするための設定
第5回: リモートログインして設定を続行する
第6回: パッケージ管理システムapt
第7回: RSA公開鍵認証でリモートログインする
第8回: Pythonの仮想環境を整える
第9回: MJPG-streamerを導入する
第10回: GPIOを汎用UARTとして使用する方法
第11回: GPIOでLチカ
第12回: I2CデバイスBME280で温湿度と気圧をモニタする

第13回: (未定)


2019/06/19: 初版