【Raspberry Pi Pico入門 – 10】シリアル通信(UART)をしてみる

2023年9月4日Raspberry Pi Pico入門,基本編Arduino,Raspberry Pi Pico

概要

今回は「UART」と呼ばれるシリアル通信を使ってRaspberry Pi PicoとPCの通信をやってみます。
UARTとはマイコンでよく使われる通信方式の一つです。Raspberry Pi PicoにはUSB経由でUARTを使ってPCと通信する機能が付いているので、これを使ってPCに情報を送ってみます。

UARTがどういうものかざっくり説明すると、仕組みはモールス信号とほぼ同じです。電圧のHighを1、Lowを0とし、High/Lowを定期的に切り替えることで1と0の情報を相手に伝える方法です。詳しくは解説のところで説明します。

実行環境

IDE:Arduino IDE 2.1.1
MCU:Raspberry Pi Pico

回路

今回はRaspberry Pi Pico単体で動かします。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。

void setup() {
  Serial.begin(115200);
  Serial.println("Serial Start.");
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println(digitalRead(LED_BUILTIN));
  delay(1000);
  
  digitalWrite(LED_BUILTIN, LOW);
  Serial.println(digitalRead(LED_BUILTIN));
  delay(1000);
}

動作確認

Raspberry Pi Picoの内蔵LEDが点滅すればLEDの制御は成功です。

Arduino IDEにはシリアル通信で送られてきた情報を表示する機能が付いています。
右上の①シリアルモニタをクリックしてシリアルモニタを表示します。次に右下の②baudと表示されているところを「115200 baud」に設定します。

この設定をした時に1と0が交互に表示されれば成功です。

解説

UARTとは

シリアル通信という名前は俗称であり、本来はかなり広い意味を持った言葉なのですが、マイコンの界隈では「UART」という規格を使って通信することを「シリアル通信」と呼ばれることも多いです。シリアル通信の規格は他にも「I2C」や「SPI」があり、「USB」もシリアル通信の1種です。
※本来の意味でのシリアル通信という言葉も時々使われるので、その時は文脈で判断しています。

どのように通信するのかですが、あらかじめ送信側と受信側でボーレート(High/Lowを切り替える時間間隔)を決めておきます。送信側は一定間隔でHigh/Lowを切り替え、受信側は全く同じ間隔でHighかLowかを読み取ることで1なのか0なのかを判断する方法になります。
今回のプログラムではボーレートを115200[bit/s]に設定しています。つまり1秒間に115200回の頻度でHigh/Lowを切り替えていることになります。それを電圧波形で表すと以下のようになります。

この電圧波形を先頭から情報を読むと「10101101」となります。
実際にはデータの始めと終わりを表す決め事・誤り検出をするための決め事等があるのでもう少し複雑になります。興味のある方は「UART」で調べてみてください。(とりあえず通信する分にはArduino IDEが自動で設定してくれるので知らなくても大丈夫です)

ちなみに、このような通信をする上での決め事を「通信プロトコル」と呼びます。

コードの解説

UARTでよく使う関数を解説します。

  • begin()
    UARTの初期設定の関数です。これを実行することでUARTが使えるようになります。
    引数を入れなかった場合は9600[bit/s]に設定されます。
  • print()
    データを送信する関数です。引数は数字でも文字列でもOKで、数字を入れた場合は自動的に文字情報に置き換えて送信します。
  • println()
    print()と同じくデータを送信する関数です。違いはデータの最後に改行を入れることです。

ほかにも色々な関数がありますが、一度に解説すると混乱するかと思いますので今回はこの3つだけとします。

デバッグに便利

マイコン用プログラムの開発をしていると、プログラムが思ったように動かない時があるかと思います。PC用プログラムの開発では高性能なIDEを使ってプログラムを途中で止めたり変数の中身を確認したり出来ますが、マイコンでそれをするには専用のデバッガというものを購入し、使えるように設定する必要があります。
そこで手軽に動作を確認したいときはUARTがよく使われます。

プログラムが想定通りに動かない場合、変数の値が想定通りになっていないことが多いです。そこで問題がありそうな処理の直前や直後にprintln()で変数の中身をPCに送ることで、変数にどんな数字が入っているのかをリアルタイムでPCで確認することができます。
また処理が一つ終わるたびにメッセージを送信することで、処理がどこまで終わっているかを把握することもできます。

例えば今回の場合、LEDのHigh/Lowを切り替えた後にLEDがHigh/Lowのどちらに設定されているかを送信しています。
Arduino IDEでは「HIGH=1・LOW=0」と定義されているので、問題なく動作していれば点灯したときに1、消灯したときに0が出力されるはずです。