シリアル通信とは
Arduino IDEでは簡単にシリアル通信(いわゆるUART)が利用できます。
UARTは送信/受信それぞれ1本ずつ、合わせて2本の信号線で通信します。
例えばマイコンでセンサーの値を読み取ってPCに送ったり、
マイコンから他のモジュールを制御したりすることができます。
PCと通信する場合は、Arduino IDEの「シリアルモニタ」機能を使って
簡単にデータの送受信をすることができます。
またはTera Term等のターミナルソフトを使っても同様のことができます。
ハードウェアシリアルとソフトウェアシリアル
Arduino IDEのシリアル通信には
ハードウェアシリアルとソフトウェアシリアルがあります。
ハードウェアシリアルはUART専用のPHYを使って実現します。
PHYとは半導体の物理層のことを指しますが、
ハードウェアでUART通信を実現するのでCPUの負荷が少なくて済みます。
動作も安定するので基本的にはハードウェアシリアルの利用がおすすめです。
ハードウェアという名前の通り、マイコンボードによって
ハードウェアシリアル用のピン(GPIO)の番号は固定で決まっています。
ソフトウェアシリアルはソフトウェアでUART通信を実現します。
好きなピン(GPIO)を使って通信ができる代わりに、
ソフトウェアでUART通信を実現するのでCPUの負荷は重くなります。
CPUの処理能力が足りない場合に通信エラーになる可能性もあります。
ハードウェアシリアル用のピンを他の用途で使い埋まってしまった場合には
このソフトウェアシリアルを使うと良いです。
ハードウェアシリアル
ハードウェアシリアルのポートが複数ある場合、
Serial, SerialUSB, Serial2などの名前で任意のポートを指定します。
どのポートがどのSerialポート名に対応するかはマイコンボードによって異なるので
それぞれのボードの仕様を確認してください。
マイコンボードごとのシリアルポート
※ 随時更新 ※
M5Stack Basic
Serial が USB Type-Cコネクタ または GPIO1 & GPIO3
Serial2 が GPIO16 & GPIO17
USBコネクタにケーブルを繋ぐことでSerialが使えます。
USBコネクタでUARTを使う場合はGPIO1 & GPIO3は使えません。
逆も然りでGPIO1 & GPIO3を使っている場合は
USBコネクタは通信用に使うことはできません。
M5StackにはESP32というマイコンが載っています。
ESP32にはUARTが3系統ありますが
M5Stack BasicではUARTのうちの1つは外部に出ていないので
使用できるのは Serial と Serial2 の2系統です。
Seeeduino XIAO
Serial がUSB Type-Cコネクタ
Serial1 が GPIO6 & GPIO7
Arduinoの関数
例えば使うポートがSerial2の場合は
以下の関数の「Serial」を「Serial2」に書き換えます。
以下ではよく使う関数の一部を説明します。
Serial.begin(speed)
シリアルポートを初期化します。通信を開始前に1回だけ記述します。
引数のspeedにはボーレート(通信速度)を入力します。
Serial.begin(9600);
上の例ではシリアルポートをボーレート9600bpsで初期化しています。
Serial.available()
何バイトのデータが到着しているかを返り値として渡します。
if (Serial.available() > 0) { /* process1 */ }
例えばこのように書くと
データが存在する場合のみprocess1を実行することになります。
Serial.read()
返り値として、受信したデータを渡します。(=受信したデータを読み出す)
Serial.print(data), Serial.println(data)
引数dataを送信します。
Serial.println(data)ではデータの末尾に\r\n(改行)を付加して送信します。
ソフトウェアシリアル
ソフトウェアシリアルを使う場合のサンプルコードは下記の通り。
#include <SoftwareSerial.h>
SoftwareSerial mySerial = SoftwareSerial(0, 1);
void setup()
{
pinMode(0, INPUT);
pinMode(1, OUTPUT);
mySerial.begin(9600);
mySerial.println("test");
}
ソフトウェアシリアルを使う場合は #include <softwareSerial.h> が必要になります。
ハードウェアシリアルではSerial通信用のポートに名前がついていますが
ソフトウェアシリアルでは自分で名前を決める必要があります。
サンプルコードでは mySerial と名前をつけました。
名前をつけるときに SoftwareSerial(RX pin, TX pin) で使うGPIOを指定します。
ピンはRX, TXの順に指定し、
サンプルコードではRXがGPIO0, TXがGPIO1としています。
それに合わせてpinModeも指定する必要があります。
その他のコードはハードウェアシリアルを使う場合とほぼ同じで、
ハードウェアシリアルの関数の「Serial」を「mySerial」に置き換えればOKです。
※mySerial以外の名前を付けた場合はその名前に置き換えます。
シリアル通信を使ったプログラムの例
※ 随時更新 ※
コメント