Arduino-Communication関数(シリアル通信)の使い方
当記事では、ArduinoのCommunication関数(シリアル通信)の使い方について詳しく解説します。
Arduinoではシリアル通信の標準関数が用意されており、簡単にシリアル通信をすることができます。
なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。
Communication関数(シリアル通信)
説明 | 引数 | 戻り値 | 説明 |
---|---|---|---|
Serial.begin(unsigned long speed) | speed:通信速度 | なし | シリアル通信を初期化 |
end() | なし | なし | シリアル通信を終了 |
int Serial.available() | なし | 残りByte | 読み取り可能Byte数を調べる |
int Serial.read() | なし | 1Byte読み込んだ値を返す | 1Byte読み込み |
int Serial.peek() | なし | 1Byte読み込んだ値を返す | 1Byte読み込み、読み取り位置は動かさない |
Serial.flush() | なし | なし | シリアルデータの送信完了を待つ |
Serial.write(data) Serial.write(buf, len) | data:送信データ buf:送信する配列データ len:データの長さ | 送信データのByte数 | データ送信 |
Serial.print(val, format) | val:読み込むデータ format:基数または有効桁数 | 送信データのByte数 | 文字列送信(改行なし) |
Serial.println(val, format) | val:読み込むデータ format:基数または有効桁数 | 送信データのByte数 | 文字列送信(改行あり) |
Serial.begin()/シリアル通信を初期化
- 関数:Serial.begin(unsigned long speed)
- 引数:speed⇒通信速度
- 戻り値:なし
Serial.begin()関数は、シリアル通信を初期化します。引数で、以下の通信速度(bps)を設定します。
- 300
- 1200
- 2400
- 4800
- 9600
- 14400
- 19200
- 28800
- 38400
- 57600
- 115200
end()/シリアル通信を終了
- 関数:end()
- 引数:なし
- 戻り値:なし
end()関数は、シリアル通信を終了します。シリアル通信を終了することで、共用ピンであるPD0とPD1をデジタル入出力として使用できます。
Serial.available()/読み取り可能Byte数を調べる
- 関数:int Serial.available()
- 引数:なし
- 戻り値:残りByte
Serial.read()/1Byte読み込み
- 関数:int Serial.read()
- 引数:なし
- 戻り値:1Byte読み込んだ値を返す
Serial.peek()/1Byte読み込み、読み取り位置は動かさない
- 関数:int Serial.peek()
- 引数:なし
- 戻り値:1Byte読み込んだ値を返す
Serial.flush()/シリアルデータの送信完了を待つ
- 関数:Serial.flush()
- 引数:なし
- 戻り値:なし
Serial.flush()関数は、シリアルデータの送信完了を待ちます。
Serial.write()/データ送信
- 関数:Serial.write(data)
- :Serial.write(buf, len)
- 引数:data⇒送信データ
- :buf⇒送信する配列データ
- :len⇒データの長さ
- 戻り値:送信データのByte数
Serial.write()関数は、Arduinoボードから文字や配列のデータを送信します。配列データを送信する場合、「データの長さ」を指定する必要があります。
Serial.print()/文字列送信(改行なし)
- 関数:Serial.print(val, format)
- 引数:val⇒読み込むデータ
- :format⇒基数または有効桁数
- 戻り値:送信データのByte数
Serial.print()関数は、Arduinoボードから指定した文字列、数値、変数などを送信します。
Serial.println()/文字列送信(改行あり)
- 関数:Serial.println(val, format)
- 引数:val⇒読み込むデータ
- :format⇒基数または有効桁数
- 戻り値:送信データのByte数
Serial.println()関数は、Arduinoボードから指定した文字列、数値、変数などを送信します。また、送信データの最後に「改行」が付加されます。
シリアルモニタの使い方
Arduino IDEのシリアルモニタを使うことで、Arduinoボードとの送受信を行うことができます。
これから、紹介するシリアル通信のサンプルプログラムでもシリアルモニタを使って、適切に通信が行われているのか確認するので、ぜひ覚えておきましょう。
ArduinoボードをUSBケーブルで、Arduino IDEを使用するPCに接続します。当記事では、Arduino Unoを使用して説明していきます。
Arduino IDEを起動します。
「ボード」と「シリアルポート」を選択します。当記事では、ボードは「Arduino/Genuino Uno」、シリアルポートは「COM3」を選択しています。
「ツール」-「シリアルモニタ」をクリックします。
シリアルモニタが表示されます。シリアルモニタ上部の送信欄に文字や数字を入力して、右側の「送信」をクリックするとArduinoボードにデータを送ることができます。
サンプルプログラム(サンプルスケッチ)
- Arduino Uno
- USBケーブル
- PC(プログラム書き込み・シリアルモニタ表示)
シリアル通信のサンプルプログラム(サンプルスケッチ)を紹介します。
Arduinoではシリアル通信の標準関数が用意されており、PC-Arduinoボード間やArduinoボード-Arduinoボード間の通信が可能です。
Serial.println()/文字列送信(改行あり)
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
Serial.println("Arduino!");//文字列「Arduino!」を送信、改行
Serial.println(4649);//数字「4649」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
Arduino!
4649
Arduino!
4649
Arduino!
4649
Arduino!
4649
Arduino!
4649
サンプルプログラムは、Serial.println()関数によって、ASCIIコードで文字列や数値を送信、改行します。文字列はそのまま、数値はASCII文字に変換されます。
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
Serial.println(4649, BIN);//2進数で数字「4649」を送信、改行
Serial.println(4649, OCT);//8進数で数字「4649」を送信、改行
Serial.println(4649, DEC);//10進数で数字「4649」を送信、改行
Serial.println(4649, HEX);//16進数で数字「4649」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
1100101001
11051
4649
1229
1100101001
11051
4649
1229
サンプルプログラムは、Serial.println()関数によって、フォーマットを指定することで、2進数、8進数、10進数、16進数で送信します。
Serial.print()/文字列送信(改行なし)
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
Serial.print("Arduino!");//文字列「Arduino!」を送信
Serial.print(4649);//数字「4649」を送信
delay(1000);//1秒待機(1000msec待機)
}
Arduino!4649Arduino!4649Arduino!4649Arduino!4649Arduino!4649
サンプルプログラムは、Serial.print()関数によって、ASCIIコードで文字列や数値を送信します。文字列はそのまま、数値はASCIIコードに変換されます。
(Serial.print()関数は、Serial.println()関数と違って改行されません。)
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
Serial.print(4649, BIN);//2進数で数字「4649」を送信
Serial.print(4649, OCT);//8進数で数字「4649」を送信
Serial.print(4649, DEC);//10進数で数字「4649」を送信
Serial.print(4649, HEX);//16進数で数字「4649」を送信
delay(1000);//1秒待機(1000msec待機)
}
1100101001110514649122911001010011105146491229
サンプルプログラムは、Serial.print()関数によって、フォーマットを指定することで、2進数、8進数、10進数、16進数で送信します。
(Serial.print()関数は、Serial.println()関数と違って改行は行われません。)
Serial.write()/データ送信
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
Serial.write(2);//ASCIIコード:STX(テキスト開始)
Serial.write(50);//ASCIIコード:2
delay(1000);//1秒待機(1000msec待機)
}
□2□2□2□2□2
サンプルプログラムは、Serial.write()関数によって、数値として、そのまま送信します。
そのため、「2」はASCIIコードでSTX(テキスト開始)に該当するので、文字化けを起こして「□」が表示、「50」はASCIIコードに該当する「2」が表示されます。
Serial.available()/読み取り可能Byte数を調べる
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
if(Serial.available() > 0)//受信したバイト数が0を超える場合、以下を実行
{
Serial.println("OK!");//文字列「OK!」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
}
OK!
OK!
OK!
OK!
OK!
OK!
OK!
OK!
OK!
OK!
サンプルプログラムは、Serial.available()関数によって、受信したデータのByte数を確認します。シリアル通信ができない場合は、「-1」が返されます。
そのため、このサンプルプログラムでは、シリアルモニタから何らかのデータを送信すると、シリアルモニタには「OK!」が表示されます。
Serial.read()/1Byte読み込み
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
char data;
if(Serial.available() > 0)//受信したバイト数が0を超える場合、以下を実行
{
data = Serial.read();//dataに1Byte読み込んだ値を返す、読み取り位置を動かす
Serial.println(data);//「data」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
}
A
r
d
u
i
n
o
!
サンプルプログラムは、シリアルモニタから「Arduino!」を送信すると、Serial.read()関数によって、1Byteずつ読み込み、シリアルモニタに表示していきます。
Serial.peek()/1Byte読み込み、読み取り位置は動かさない
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
char data;
if(Serial.available() > 0)//受信したバイト数が0を超える場合、以下を実行
{
data = Serial.peek();//dataに1Byte読み込んだ値を返す
Serial.println(data);//「data」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
}
A
A
A
A
A
A
A
A
A
A
Serial.peek()関数は、Serial.read()関数と違い、1Byte読み込んだ後に読み取り位置を動かしません。
そのため、サンプルプログラムは、シリアルモニタから「Arduino!」と送信しても、頭文字の「A」だけが表示され続けます。
おすすめのArduinoボードはどれ?
当記事『Arduino-Communication関数(シリアル通信)の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。
また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。