わかめの開発日記

ArduinoやRaspberry Pi で作ったものを紹介します

Arduinoを使ってシリアル通信を行う

f:id:wakamelab:20200520004021j:plain

Arduinoを使ったシリアル通信の方法を紹介

こんにちは、wakamelabです。
Arduinoを使ってシリアル通信をやってみたので、その方法を紹介します。

シリアル通信とは何か

シリアル通信とは、電気信号の伝送路を1本用意し、1bitずつ電気信号を送受信するとで情報のやり取りを行う通信の総称です。
シリアル通信の規格として、UART、I2C、SPIが有名です。
信号線を少なくして通信を行うことができるため、安価に実装することができ信頼性も高いため、非常に幅広く使用されています。
ではArduinoを使ったシリアル通信の具体的な方法を説明します。

使用するもの

Arduino UNO 本体 :1個
・USBケーブル:1本

ライブラリの紹介

Arduinoでは、シリアル通信を行うためのライブラリが用意されています。
ライブラリを使用することで、内部の複雑な処理を意識することなく簡単に実装を行うことができます。
先人の知恵に感謝ですね。

Serial.begin(speed)
シリアル通信を開始するための宣言を行う関数です。
引数である speedには、通信速度(bps)を指定します。
bpsは、"bit per second"の略であり、1秒当たりの転送bit数のことを指します。
bpsでよく使用する値は、300, 9600, 115200です。

Serial.end()
シリアル通信を終了させるための関数です。」

Serial.print(data)
シリアル通信を使用して、値を送信する関数です。
引数である、"data"に格納した値を送信します。
例えば、Serial.print("Hello, World")とした場合、Hello, World という文字列を送信し、Serial.print(10)とした場合、10という値を送信します。
簡単にシリアル通信でデータを送ることができる、非常に便利な関数です。

Serial.println(data)
基本的には上で紹介したSerial.print()と同じ機能ですが、Serial.println()ではデータの末尾に改行用のコードを送ることで改行を行います。
分かりにくいと思いますので、具体的に説明します。

Serial.print()とSerial.println()で"Hello, World."を2つに分けて出力してみます。
Serial.print() を使った場合
 Serial.print("Hello ");
 Serial.print("World.");
出力結果は
 Hello, World.
となります。

Serial.println()を使った場合
 Serial.println("Hello ");
 Serial.println("World");
出力結果は
 Hello,
 World.
となります。

Serial.print() と Serial.println() の使い分けは、シリアル通信の出力を見やすい形に整形する際に非常に重要になりますので、理解しておいた方が良いです。

シリアル通信のプログラム

ではシリアル通信を行うプログラムを紹介します。

int pass_time = 0;

void setup() {
  Serial.begin(9600);
  
  delay(1000);  //起動待ち

  Serial.println("Hello, World.");
}

void loop() {

  pass_time++;
  Serial.print("Pass Time : ");
  Serial.print(pass_time);
  Serial.println("Sec");
  
  delay(1000);  
}

このプログラムは、Arduinoの起動時に"Hello, World."と表示し、その後は"Pass Time : 10Sec"のように起動からの経過時間を表示させることを目的にしています。
では、プログラムの解説を行います。

int pass_time = 0;

時間を測定するための変数を宣言しています。

  Serial.begin(9600);

シリアル通信を開始するための宣言です。9600bpsで通信を行います。

  Serial.println("Hello, World.");

初回起動時に、Hello, World. と出力し改行します。

  pass_time++;

変数 pass_time に1を加算します。"++"はインクリメントと言い、対象の変数に1を加算する処理です。
この処理では、Arduinoを起動してからの経過時間を計測しています。

  Serial.print("Pass Time : ");
  Serial.print(pass_time);
  Serial.println("Sec");

この処理では、Arduinoを起動してからの時間を出力しています。
一番目の処理で、文字列 Pass Time : を出力します。
次の処理では、経過時間を測定している変数 pass_time の値を出力します。
最後に、文字列 Sec を出力し、改行しています。
この一連の処理で、Pass Time : 1Sec のように、経過時刻を出力するようになっています。
最後にSerial.println() を行い改行をしている理由は、ここで改行しないと次の処理でそのまま後ろに繋がる形で文字が出力されてしまうからです。

delay(1000);

プログラムを1秒間停止しています。こうすることで、変数pass_time で計測している値がおおよそArduinoの起動時間と一致します。

ArduinoをUSBケーブルでPCと接続し、このプログラムを書き込んで下さい。
そのままでは、特に何も出力されないと思います。次にArduinoから送信された値を確認する方法を紹介します。

シリアル出力をモニタする方法

Arduinoが接続された状態でシリアルモニタボタンをクリックしてください。
f:id:wakamelab:20200614140656p:plain

シリアルモニタボタンをクリックすると、このような画面が出てきますので通信レートを9600bpsに変更してください。
f:id:wakamelab:20200614141032p:plain

f:id:wakamelab:20200614141049p:plain

通信レート変更後、以下のように出力されたら成功です。
f:id:wakamelab:20200614141121p:plain

以上で説明を終わります。いかがでしたでしょうか。
シリアル通信はソフトを作ったときのテストであったり、センサーの軽く使ってみるための実験だったり、と多くの場面で活用するので是非覚えておいてください。

Arduino 基本学習キットの紹介

当社では、Arduinoを始めたい人に向けたスターターキットを販売しております。

気になる方は以下のURLよりアクセスしてみて下さい。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/25680573