【Banggoodクーポン情報】Skyzone SKY04X / Insta360 GO / Fatshark HDO2 / UZ65 / US65 PRO / Mobula6 HD クーポン追加!

【Arduion入門編⑨】シリアルモニタの基本的な使い方!シリアルモニタからArduinoに繋げたサーボモーターやLEDを制御してみる!

今回はArduinoのシリアルモニタの基本的な使い方をご紹介したいと思います。
これまでArduinoを使い可変抵抗やジョイスティックから読み取った数値をPCに表示させるなどに少し使いましたが、その概要についてまだご紹介していませんでした。

シリアルモニタとは、Arduinoとコンピューターまたは他のデバイス(もちろんArduino同士でも使えます)とでシリアル通信を利用してデータの送受信やデバッグなどに利用されるものです。

Arduino単体ではLCDやモニターなどの表示デバイスが付いていないため、スケッチ内で使っている変数の値やセンサーからの入力値などを視覚的に確認する事がそのままでは出来ません。
そこで便利なのがArduino IDEに搭載されているシリアルモニタとなります。

PCとArduinoとのデータのやり取りをシリアルモニタを介して行うことが出来ます。
先程のようにArduinoで取得したセンサーの値をPC(シリアルモニタ)に表示させたり、またシリアルモニタからArduino側にデータを送って何かしらの動作をさせたりといった事に使えます。

今回はそのシリアルモニタの基本的な使い方をご紹介したいと思います。

【Arduino】シリアルモニタの基本的な使い方!

今回の目標

ArduinoはUSBケーブルを介してシリアル通信によりデータのやり取りを行っています。
Arduino側(こちらではArduino UNOで説明していきます)のデジタルポートを見てみるとD0ピンとD1ピンにはRXやTXと書かれているのが確認できます。
これがシリアル通信で使われるポート(TXは送信・RXは受信)として機能しており、USB-シリアル変換器を通じUSB端子と繋がっているのでPCからのスケッチの書き込みなどで使うことが出来るようになっています。
普段あまり意識することはないのですが、このようにPCとArduinoとはシリアル通信でデータのやり取りを行っています。

そしてArduino IDEにはそのデータのやり取りを視覚化するための『シリアルモニタ』と呼ばれる便利な機能があります。
Arduino側で取得したスイッチのON/OFFやセンサーから得たデータなど様々な情報をシリアルモニタ上に表示し利用することが出来ます。
またスケッチ内で使われている変数の数値をモニタすることが出来るのでデバッグなどに利用することも出来ます。

そして双方向でのやり取りを行っているので、Arduino側にデータを送ることも出来ます。
シリアルモニタからデータをArduino側に送りサーボモーターを指定角度まで動かしたりLEDをON/OFFさせたりなどが出来ます。

今回はこのシリアルモニタの基本的な使い方をご紹介したいと思います。
そしてシリアルモニタからArduinoに命令を送り簡単な制御などが出来ればと思います。

シリアル通信とは?

まずは簡単にArduinoのシリアル通信、データのやり取りの話をご説明しておきます。
データのやり取りの方法にはいろいろとありますが、今回使おうとしているArduino IDEのシリアルモニタは読んで字の如く『シリアル通信』という方法によりArduinoとPC間でデータのやり取りを行なっています。

しかしシリアルモニタを使うにあたりあまり意識する事なく使う事が出来ます。
今後I2C通信などArduinoでシリアル通信を使って何かをやる機会があると思うので簡単にご説明しておきます。

シリアル通信のシリアルとは「連続した(serial)」という意味があります。
HIGHとLOWの連続したデータを1本の通信線を使って連続的にやり取りする通信方式となります。
またこのシリアル通信とは対象的に複数本の信号線を使う通信方式にパラレル通信というものもあります。

そしてシリアル通信と言ってもいろいろあるのですが、基本的な通信方式にSPI通信やI2C通信、UART通信があります。
そして今回やろうとしているArduino IDEに搭載されているシリアルモニタもシリアル通信使ってArduinoとPC間でデータのやり取りが行われています。

今回の目的はシリアルモニタの基本的な使い方となるので通信に関してはこれくらいの説明にしておいおきます。
そしてシリアルモニタを使ったやり取りにはArduinoとPC(シリアルモニタ)とは送信用で1本、受信用で1本の計2本の通信線を使ってやり取りをしています。

Arduino UNOのボードを見てみるとデジタルピンD0には[RX←]、D1ピンには[TX→]と書かれているのが確認できます。
この2本の信号線、TX(送信用)・RX(受信用)を使ってArduinoはPCとシリアル通信を行っています。
このD0・D1ピンはデジタル入出力ピンですがArduino内部でUSB-シリアル変換器とも繋がっていてUSB端子からPCとデータのやり取りが出来るようになっています。
普段あまり意識することはないのですがこのような仕組みによりデータのやり取りが行われています。

そして今回やろうとしているシリアルモニタはこのシリアル通信を使ってArduinoとPC間でデータのやり取りを行い、Arduinoで取得した情報をPC上のシリアルモニタで確認したり、またシリアルモニタから送られてきたデータをもとにArduinoで何かを動かしたりといった使い方ができるようになります。

それではシリアルモニタを使い、いろいろと試していきましょう!

シリアルモニタに文字(文字列)を出力する

まずはArduinoからシリアルモニタ(PC側)に文字や変数内の数字を送って表示させその結果を比較してみましょう。
こちらのスケッチを動かしてみて下さい。

シリアルモニタを立ち上げるにはスケッチ右横にあるボタンを押します。([ツール]→[シリアルモニタ]からでも立ち上げることが出来ます)
通信速度(ボーレート)は今回9600bpsに設定しているのでシリアルモニタ側もこれに合わせてください!

シリアルモニタを立ち上げ実行結果を確認してみます。

Hello World
I am Arduino!
100
111

と表示されるのが確認できます。

スケッチを解説していきます。
まずは新たに出てきたシリアルモニタ(シリアル通信)で使われる関数の説明をしておきます。

Serial.begin()

まずsetup関数内にあるSerial.begin(9600)部分がシリアル通信を行うための初期化(準備)を行っています。
通常setup()内で行われ通信速度(bps)を設定します。

シリアル通信を使うにはそれぞれ機器の通信速度を合わせる必要があります。
Arduinoとシリアルモニタ(PC)との通信速度を設定しています。
設定した速度は通信相手側(今回はシリアルモニタ)でも同じ値に設定する必要があります。

Serial.begin(speed);

 

シリアル通信の開始を宣言します。
speed部分にシリアル通信の速度(bps)を指定します。
PCやシリアル通信を行う機器とArduino間で通信する場合この速度(ビットレート)は、300・1200・2400・4800・9600・14400・19200・28800・38400・57600・115200bpsから指定します。
数字が大きくなるほど多くのデータが送れるということですが、Arduinoなどマイコンボードでは9600・57600・115200bpsがよく使われているようです。

Serial.print(data); / Serial.println(data);

Serial.print()関数がシリアルモニタにデータを出力(シリアルモニタに表示)させる関数となります。
文字や数字、変数など多くの形式に対応していますが、ASCIIコードとして出力されることがポイントです。(後述します)
また、Serial.println()は同様の使い方ですが改行を入れることが出来ます。

Serial.print(data); / Serial.println(data);

 

Serial.print()関数は、Arduinoから指定した文字列・数値・変数などを送信します。
人が読むことが出来る形式(ASCII形式)でシリアルポートにデータを出力し、数値の場合1桁ずつASCII文字に変換されます。
また浮動小数点の場合は小数点以下第2位までがデフォルトで出力されます。(変更可能)
文字列(“  “で囲む)ではそのまま出力されます。
Serial.printlnでは改行を入れることが出来ます。

それではシリアルモニタの表示結果をもう一度見てみましょう。

文字列(” ”で囲まれたもの)はそのまま表示されます。
数字の[100]もそのまま表示されていますが、実際にはASCII形式に変換され[1][0][0]という文字として出力されています。
そして変数内の数値[111]も表示させることが出来ています。
また、Serial.println()では改行されているのも確認できます。

非常に簡単ですが、文字とともにスケッチ内の変数の値を表示させたりと使用頻度はかなり高いものとなります。

シリアルモニタに数値を出力する

Sirial.print関数は文字列以外にも数値などすべての形式に対応しています。
そして第2引数を指定し数値を変換することも出来ます。
それでは次にこちらのスケッチを動かしてみましょう。

シリアルモニタにこのように表示されると思います。

1100100
144
100
64
1.23
1.2346

Serial.print(data,format); / Serialprintln(data,format);

先程のSerial.print()関数ですが、第2引数(formatの部分)を指定することにより文字列の種類を指定することも出来ます。

上から順に見ていくと、2進数(BIN)を指定して出力結果は1100100となり次に8進数(OCT)で144、10進数(DEC)で100、16進数(HEX)で64に変換して表示しています。

次に数値1.23456の場合デフォルトでは小数点第2桁までの表示となるので1.23となっています。
そして有効桁数を指定することも出来ます。
最後の行は小数点以下4桁まで指定しているので1.2346と最後の桁が四捨五入されて表示されています。

Serial.print()とSerial.println()は非常によく使われます。
メッセージや数値を表示するだけでなく、上記で確認できたように変数の中身を表示することもでき大変便利です!

Serial.print(data,format); / Serialprintln(data,format);

 

人が読むことが出来る形式(ASCII形式)に変換して文字または文字列としてシリアルポートに出力します。
数値は1桁ずつASCII文字に変換され送られていきます。
浮動小数点では小数点以下第2位まで出力するのがデフォルト設定となっています。
また第2引数(format)でdataの変換方法を指定できます。(省略可)

 

【構文】
Serial.print(data);
Serial.print(data,format);

 

data:出力する値。全ての形式に対応。
format:出力する文字列の種類を指定。BIN(2進数)、OCT(8進数)、DEC(10進数)、HEX(16進数)。
浮動小数点では小数点以下第2位まで出力(デフォルト)ですが有効桁数を指定できます。

スケッチ内の変数の値をシリアルモニタに表示させる

先程確認ができましたがSerial.print()関数を使えばスケッチ内で使われている変数の値も表示することが出来ます。
ArduinoにLCDモニターを使って表示させたりも出来ますが、シリアルモニタを使えば簡単にセンサーなどからの入力値を表示させることができデバッグにも利用できます。

こちらは以前ご紹介したアナログジョイスティックからの入力値をシリアルモニタに表示させたものです。

X軸方向・Y軸方向のアナログ値とセンタークリックによるON/OFF判定それぞれの変数をシリアルモニタに表示させています。

このようにシリアルモニタを使えば視覚的に確認することができ便利となります。

アナログジョイスティックの制御に関して詳しくはこちらをご覧ください!

【Arduino入門編⑦】ジョイスティックの制御方法!デジタル・アナログ入力の解説です!

シリアルモニタからArduinoに文字や数字を送る

Arduinoから文字列や変数の値を出力させシリアルモニタに表示させることが出来ました。
それでは次は逆の動作、シリアルモニタ側からArduinoに文字(命令)を送りArduinoを制御してみたいと思います。

まずは仕組みが理解しやすいように、シリアルモニタから送った文字や数字(値)をArduinoを経由してそのままシリアルモニタに返すだけの簡単なスケッチで試してみます。

まずは使われている関数から説明しておきます。

Serial.available();

 

シリアルポートに受信したデータのバイト数を取得します。
何も入力されていない場合は-1を返します。

 

【使用例】
シリアル通信が行われてArduinoに受け取るデータの有無で処理を変えることが出来ます。
if(Serial.available() > 0){

(受信データが有る場合、以下を実行)

}

Serial.read();

シリアル通信により受信したデータを1バイト取り出します。
呼び出すごとにキャッシュがクリアされていきます。

上記2つの関数を使い、Serial.available()で受信したデータのバイト数を調べその回数Serial.read()で順次(1バイトずつ)取り出していく形で使っています。

シリアルモニタに入力された文字をArduinoで読み取り(受信)、そのままSerial.print()関数を使いシリアルモニタに表示させるだけの単純なスケッチとなっています。

それでは動かしてみましょう。
シリアルモニタの入力フィールドに文字を打ち込んで[送信](またはリターンキー)をクリックすればArduinoからの反応が戻ってきます。
仮に「49」を入力し送信してみます。(LFのみで送信しています)

こちらがArduinoから返ってきた結果となります。

Input Number: 52
Input Number: 57
Input Number: 10

あれ?
Serial.read()関数で読み取りそのままシリアルモニタへSerial.print()関数で送り返す(表示させる)だけなので「49」が戻って来るはずなんですが・・・?

シリアルモニタから送られるデータはASCIIコードになるようです。
そしてArduinoからシリアルモニタへの出力もASCIIコードで出力されるようです。
つまりArduinoのシリアル通信は文字列でやり取りを行っているということですね。

シリアルモニタから送られた文字や数字はASCII文字に変換されArduinoに送られ一旦バッファに格納されます。
そしてSirial.read()を実行すると最初の1バイト(1文字)が読み取られ、バッファがクリアされます。
そして上記スケッチでは条件文ifでSerial.available()関数で受信したバイト数を取得しその回数繰り返しているので、
順次Serial.read()関数で1バイトずつ読み取っていきます。(なくなるまで)
そしてシリアルモニタに入力された「49」は49という数字ではなく、「4」と「9」が連結した文字列(ASCII文字)として処理されます。

まず最初の1バイト目の「4」はASCIIコードの「52」、そして次に「9」はASCIIコードの「57」、最後に「送信」が押された時に改行(LF)が入りこれはASCIIコードの「10」にあたります。
そのため出力結果として、52・57・10が返ってきたということです。
少しややこしいですね!

参考 ASCIIコード表初心者のためのポイント学習C言語

もちろんシリアルモニタ側で「改行なし」を選択していると「52」「57」が表示され、改行コード「10」は返ってこないということになります。

まとめるとこんな感じとなります。

Arduino⇔シリアルモニタ間のやり取り
  • Arduinoのシリアルモニタでは(シリアル通信)、文字列でやり取りを行っている!
  • シリアルモニタ→Arduinoでは、データは連結した文字列としてASCII文字で送信される。

シリアルモニタからLEDの点灯を制御してみる

上記によりシリアルモニタ側からの送信にはASCIIコードに変換された形で送られることが分かりました。
これを使ってシリアルモニタから送られた文字を判別しArduinoに接続されたLEDを制御してみましょう。

いろんな方法があると思いますが、このようなスケッチを作ってみました。
シリアルモニタから「1」を送信するとArduinoのD13ピンに繋いだLED(Arduino内蔵LEDだけでも確認出来ます)が点灯し、「0」を送信すると消灯するスケッチとなります。

シリアルモニタから送られた「1」はASCIIコードの「49」、また「0」はASCIIコードの「48」として送られSerial.read()関数で読み取られます。
そして「49」ならLEDを点灯、「48」なら消灯させるというスケッチとなります。

ASCIIコードでは直感的にスケッチが分かりにくいのでこのように書いても良さそうですね!

シリアルモニタからサーボの回転角度を制御する

次にシリアルモニタからArduinoに繋いだサーボモーターの回転角度を制御してみたいと思います。
先程やってきましたが、シリアルモニタ(シリアル通信)からArduinoへ送る場合全てASCIIコードになることが分かりました。

PCのシリアルモニタからの送信は先程試してみた通りSerial.read()関数を使うと1バイトずつASCIIコードとして文字または文字列として読み取れますが、サーボモーターに動く角度を指定する場合、文字列として取得したデータを数値(サーボの角度)に変換するのがスケッチ的に面倒な事になりそうです。

調べてみるとSerial.parseInt()関数を使うと受信した文字列データを数値に変換できるようです。
こちらを使えば簡単にシリアルモニタからサーボモーターの制御(角度指定)も出来そうです!

Arduinoでサーボモーターを動かす方法はこちらも参考にしてみて下さい。

【Arduino入門編⑧】サーボモーターを動かしてみる。PWM制御についていの解説です!

このようなスケッチを書いてみました。
シリアルモニタにサーボモーターが動く角度0~180の任意の数字を入力して送信ボタンをクリックするとその角度まで動きます。

スケッチ解説

基本的には上記LEDの制御と同じですが、シリアルモニタから入力された数値の取得にSerial.parseInt()関数を使っています。
条件文ifの中でSerial.available()関数で文字が入力されるとSerial.parseInt()関数で数値として読み込みます。

あとはその値が0~180の範囲内であればサーボモーターをその値の角度まで動かします。

またSerial.parseInt()関数は1秒(1000ms)でタイムアウトするようにデフォルトで設定されているようです。
少し反応が遅くなるのでSerial.setTimeout(100);でタイムアウトさせる時間を少し短くしています。

シリアルモニタから角度を指定するとArduinoに繋いだサーボモーターが指定角度まで動きます。
ここで改行コードが入力されるとサーボモーターが2回動く事となるので[改行コードなし]で送信します。

Serial.parseInt();

 

シリアル通信で有効な整数を探します。
関数はタイムアウトすると終了します 。(デフォルトは1秒に設定されています)

参考 Serial.parseInt()Arduino公式リファレンス

今回使った関数(コマンド)まとめ

Serial.begin(speed);

 

シリアル通信の開始を宣言します。
speed部分にシリアル通信の速度(bps)を指定します。
PCとArduinoで通信する場合この速度(ビットレート)は、300・1200・2400・4800・9600・14400・19200・28800・38400・57600・115200bpsから指定します。
数字が大きくなるほど多くのデータが送れるということですが、Arduinoなどマイコンボードでは9600・57600・115200bpsがよく使われているようです。

Serial.print(data); / Serial.println(data);

 

Serial.print()関数は、Arduinoから指定した文字列・数値・変数などを送信します。
人が読むことが出来る形式(ASCII形式)でシリアルポートにデータを出力し、数値の場合1桁ずつASCII文字に変換されます。
また浮動小数点の場合は小数点以下第2位までがデフォルトで出力されます。(変更可能)
文字列(“  “で囲む)ではそのまま出力されます。
Serial.printlnでは改行を入れることが出来ます。

Serial.print(data,format); / Serialprintln(data,format);

 

人が読むことが出来る形式(ASCII形式)に変換して文字または文字列としてシリアルポートに出力します。
数値は1桁ずつASCII文字に変換され送られていきます。
浮動小数点では小数点以下第2位まで出力するのがデフォルト設定となっています。
また第2引数(format)でdataの変換方法を指定できます。(省略可)

 

【構文】
Serial.print(data);
Serial.print(data,format);

 

data:出力する値。全ての形式に対応。
format:出力する文字列の種類を指定。BIN(2進数)、OCT(8進数)、DEC(10進数)、HEX(16進数)。
浮動小数点では小数点以下第2位まで出力(デフォルト)ですが有効桁数を指定できます。

Serial.available();

 

シリアルポートに受信したデータのバイト数を取得します。
何も入力されていない場合は-1を返します。

 

【使用例】
シリアル通信が行われてArduinoに受け取るデータの有無で処理を変えることが出来ます。
if(Serial.available() > 0){

(受信データが有る場合、以下を実行)

}

Serial.read();

シリアル通信により受信したデータを1バイト取り出します。
呼び出すごとにキャッシュがクリアされていきます。

Serial.parseInt();

 

シリアル通信で有効な整数を探します。
関数はタイムアウトすると終了します 。(デフォルトは1秒に設定されています)

今回使ったーパーツ

Arduino UNO

Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!

Arduino スターターキット

これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。

私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)

そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)

参考 チュートリアルダウンロードELEGOO

基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。

スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていくのがいいと思います。

SG90 サーボモーター

ラジコンや小型ロボットなどホビーユースで使われるサーボモーターとして非常にポピュラーなものとなります。
国内でも数百円程度で手に入るのでArduino学習用として手元にあるといろいろと試せます。

今回のポイント

  • シリアルモニタは双方向で(PCとArduino)やり取りが出来る!
  • シリアルモニタはASCIIコードでデータのやり取りが行われる!
  • シリアル通信(今回はシリアルモニタで使っています)はSerial.begin()関数で通信速度を設定(初期化)する必要がある!
  • シリアルモニタ使用時はデジタルピンD0・D1ピンを他の目的で使用できなくなる!

最後に!

今回ArduinoとPC間でデータのやり取りを行い、シリアルモニタの基本的な使い方をご紹介しました。

シリアルモニタを使えばスケッチ内で使われている変数内の数値を簡単にPCモニタ上(シリアルモニタ内)で確認することができたり、またシリアルモニタからArduino側にデータを送り動かしたりと大変便利な機能です。
またデバッグなどにも使うことが出来ます。

シリアル通信には他にもSPI通信やUART通信・I2C通信などがあり、そしてSerialオブジェクト関数は今回基本的なものを使ってみましたがシリアル通信で使われるSerialオブジェクト関数は他にも多数あります。
こちらの公式リファレンスも参考にしてみて下さい!

参考 Serialオブジェクト関数Arduino公式リファレンス

コメントを残す