第21回 シリアルモニタ

今回はスイッチの状態をArduino IDEで確認します。

目次

Arduinoボードの中で起こっていることを自分の目で確認したい

前回の記事では、A5端子内部のデジタル電圧計を読み取ることにより、スイッチの状態を確認しようとしました。

具体的にはdigitalReadを使ってA5端子のデジタル電圧計の値を読み取りました。

確かにArduinoボードはデジタル電圧計を読み取っていたはずなのですが、外から見ても何も変化はありませんでした。Arduinoボードは「デジタル電圧計の値を読み取る」ということしかしていないためです。

でも、やっぱり読み取った結果がどのようになっているのか、自分の目で確認してみたいですよね。

このようなケースに限らず、他にもいろいろな場面でArduinoボードの中で何が起こっているのか知りたいことがあります。

そこで、Arduinoボードの中で何が起こっているのかを知るために、今回はArduinoボードから情報を送って自分の目で確認してみましょう!

シリアル

Arduinoボードの中で何が起こっているのかを知るために、Arduinoボードからデータを送ってもらって、そのデータをArduino IDEに表示する仕組みがあります。

この仕組みは「シリアル」と呼ばれています。

Arduino IDEの「シリアル」機能には次の2種類があります。

シリアル機能の種類内容
シリアルモニタArduinoボードから送ってもらったデータを「文字情報」で表示する
シリアルプロッタArduinoボードから送ってもらったデータを「折れ線グラフ」で表示する

これらがどのようなものか、最初にイメージをつかんでみましょう。

「データ」の種類

これまでの説明で「データ」と説明してきましたが、具体的に「データ」はどのようなものか確認しておきます。

「データ」は「テキスト」または「数値」、これらの混在です。

今回の記事では、実際に「テキスト」データと「数値」データをシリアルモニタに表示してみます。

データのうち、「数値」はグラフ化することができますのでシリアルプロッタに折れ線グラフとして表示することができます。「テキスト」データはシリアルプロッタには表示できません。

Arduinoボードからデータを送ってもらうには?

Arduinoボードは勝手にデータを送ってくれるわけではありません。データを送ってもらうには、そのようにスケッチ内で指示する必要があります。

手順としては次のようになります。

あらかじめスケッチの中にデータを送信する指示を書いておきます。Arduinoボードがその指示を実行すると、USBケーブルを通してデータがArduino IDEに送られます。

Arduino IDE側では、シリアルモニタの表示領域にArduinoボードから送られてきたデータが表示されます。

これから、「Arduino IDE側のシリアル機能の使い方」「スケッチでのシリアルの指示の書き方」を確認していきます。

Arduino IDE側のシリアル機能

Arduino IDEのシリアルの機能について確認しておきましょう。

Arduino IDEのウィンドウ右上に2種類のボタンがあります

右側が「シリアルモニタ」、左側が「シリアルプロッタ」を表示するボタンになっています。(マウスカーソルをアイコンに合わせると次のように機能名が表示されます)

「シリアルモニタ」ボタンをクリックすると、Arduinoボードから受け取ったデータを「文字情報」として表示する領域が表示されます。

次の例は、距離センサーで読み取った値をテキストと数値の情報としてシリアルモニタに表示したものです。

測定した距離の値は「数値」データですので、「シリアルプロッタ」ボタンをクリックすると、次のようにグラフとして表示するウィンドウが表示されます。

このようにして、Arduinoボードの中で何が起こっているのかデータを見ながら確認することができます。

以上がArduino IDE側のシリアル機能の説明です。

次に、Arduinoボードからシリアル機能を使ってデータを送る具体的な指示の書き方を確認していきます。

シリアルの指示の書き方

シリアル機能を利用してArduinoボードからArduino IDEにデータを送信するには、次の2つのステップあります。

  • シリアルでデータを送信する準備
  • シリアルで実際にデータを送信

それぞれのステップを順番に説明していきます。

1. シリアルでデータを送信する準備

シリアルモニタやシリアルプロッタにデータを表示するには、最初に設定が必要です。

どのような設定が必要か、その背景から説明します。

Arduinoボードからシリアルでデータを送る場合、PC側とArduinoボード側の双方でデータを送受信するスピードを合わせる必要があります。

データを送るArduinoボードと、データを受け取るPCは、まったく別々に動作しているハードウェアです。お互い独立して動作していますので、データを正しくやり取りするには、データを送るタイミング、具体的にはデータの送受信のスピードを合わせる必要があります。

このスピードの設定は、Arduino IDE側(PC側)とArduinoボード側の双方で行う必要があります。これからそれぞれの設定方法を説明します。

Arduino IDE側のスピード設定

Arduino IDE側でのスピード設定は、Arduinoボードを接続してボードを選択しておく必要があります

次のように、(1)最初にArduinoボードをPCに接続してボードを選択しておきます。次に(2)右上のシリアルモニタのボタンをクリックします。するとウィンドウ下方にシリアルモニタの領域が表示されて、(3)スピードを選択するメニューが表示されます。

スピード設定メニューをクリックすると多くの選択肢が表示されます。数値が大きいほどスピードは早くなります。

だったら早い方がお得かな、という気もしますが、あまり早くするとデータの送信が不安定になってデータ内容が変わってしまうことがあります。(データ内容が変わってしまうことを「データが化ける」とも言います)

デフォルトは「9600」ですので、このシリーズ記事ではこの値を使用することにします。(特に深い意味はありませんので、もっと早いスピードに設定しても構いません。もしデータが化けるようであれば遅いスピードにしてください)

Arduinoボード側のスピード設定(スケッチで設定)

次に、Arduinoボード側の設定ですが、スピードはスケッチで指示します。(このあと、「スピード」と「速度」が混在しますが、同じ意味で使用しています)

この設定を行うために以下の指示が用意されています。この設定は1回行えばいいので、スケッチのsetup部分に書きます。

「Serial」は「シリアル」、「begin」は「開始する」という意味です。「これからシリアル機能を使いますよ」というような意味になります。

引数は通信速度で、例えばArduino IDE側を9600に設定した場合は、Serial.beginの引数も合わせて9600に指定します。

スケッチのsetupのところに以下のように書きます。。

void setup() {
  Serial.begin(9600);  // シリアルの初期化
}

Serial. beginでは、通信速度を設定してシリアルを使用できるように準備をします。この処理を「シリアルの初期化」とも呼ばれることがありますので、頭の片隅に置いておいてください。

これでシリアルを使用する準備ができました。

次はデータの送信方法です!

2. シリアルで実際にデータを送信

データを送る準備ができたら、いよいよデータを送る指示でArduinoボードからデータを送ります。

それではデータ(数値やテキスト)を送る指示を確認しましょう。

ややこしそうな内容が出てきましたが、一つずつ理解していきます。

データを送る指示は2種類あります。Seria.printSerial.printlnです。

片方は最後に「ln」(エルとエヌ)がついていて、もう片方にはついていません。

これらの違いは、シリアルモニタにデータを表示したあと、改行するかしないかの違いだけで、そのほかの動作は全く同じです。

Serial.printが改行しない、Serail.printlnが改行する動作になります。

これらの命令の意味ですが、「Serial」は先ほどのSerial.beginと同様に「シリアル」という意味です。また、「print」は表示するという意味です。

Serial.printlnの最後の「ln」は「line」の略で、「line」は「行」という意味ですが、コンピュータの世界では昔「改行」の意味がありました(この語源はPascal(パスカル)というプログラミング言語にさかのぼります)。

これらの指示の引数の「データ」は次のように書きます。

最初は「数値」の書き方です。数値はそのまま書けばOKです。123という数字を書く場合は以下のように書けばOKです。

Serial.println( 123 );

Arduinoはコンピュータですので、計算式を書けば結果をデータとして送ってくれます。

Serial.println( 123+25-100 );

次はテキストの書き方です。テキストのデータを送る場合は、引数にテキストを「”」記号(ダブルクォーテーション)で囲みます。

例えば「シリアルモニタのテスト」という文字を送りたい場合は以下のように書けばOKです。

Serial.println( "シリアルモニタのテスト" );

文字を送る場合、「 ” 」記号を忘れて以下のように書くと例のごとくArduino IDEに怒られますので注意してください。

// 次のように書くと怒られるので文字は必ず「 " 」で囲むこと
Serial.println( シリアルモニタのテスト );

それでは、実際にシリアルモニタの動作を確認してみましょう。

シリアルのテスト(文字データの扱い方)

それでは、シリアルモニタの動作を実際に確認してみましょう。

確認は、あまり意味があるものではありませんが、1秒に1回、シリアルモニタに「シリアルモニタのテスト」と表示する内容にします。速度は9600にします。

それでは、新規スケッチを作成して「serial_test」という名前で保存しておきます。以下の内容でスケッチを作成します。

/*
  内容: シリアルモニタのテキストデータ送信テスト
       1秒間に1回、テキストデータをシリアルに送信する
*/

void setup() {
  Serial.begin(9600); // シリアル初期化
}

void loop() {
  Serial.println( "シリアルモニタのテスト" ); // テキストデータ送信
  delay(1000); // 1秒待つ
}

これでスケッチの準備ができました。

次に、ArduinoボードとPCをUSBケーブルで接続して、ボード選択メニューからArduino Microを選択しておきます。

Arduino IDEの「シリアルモニタ」のアイコンをクリックすると、シリアルモニタが表示されますので、スピード設定メニューが「9600」になっているか確認します。

確認できたら、スケッチをArduinoボードに送ります。

しばらく待っていると、以下のようにシリアルモニタに1秒に1回、「シリアルモニタのテスト」と表示されます。

確認できたら、ちょっとだけスケッチを変更してみましょう。

上のスケッチでは「Serial.println命令」を使用しましたが、「Serial.print命令」(改行なし)に変更して、シリアルモニタウィンドウにどのように表示されるか確認してみてください。

スイッチ状態をシリアルモニタで確認(数値データの扱い方)

前回のスケッチでは、digitalReadでデジタル電圧計を読み取りましたが、その結果はわかりませんでした。

そこで、今回習得したシリアル機能を使ってdigitalReadで読み取った結果を確認してみます。

それでは、前回作成した「switch」スケッチを開いてください。

/*
 * 内容: スイッチの状態(内部のデジタル電圧計)を読み取る
*/

#define SWITCH A5      // スイッチを接続している端子名
#define READ_JIKAN 500 // スイッチの状態を読み取る時間間隔(単位:ms)

void setup() {
  pinMode(SWITCH, INPUT_PULLUP);
}

void loop() {
  digitalRead(SWITCH);
  delay(READ_JIKAN);
}

このスケッチではdigitalRead(SWITCH);(13行目)で、スイッチが接続されたA5端子のデジタル電圧計の値を読み取っています。(読み取るだけです)

この値をシリアルモニタウィンドウに表示するには、次のようにdigitalRead(SWITCH)Serial.printlnの引数にすればOKです。

Serial.println( digitalRead(SWITCH) );

なお、Seiral.printlnの引数のdigitalRead(SWITCH)は最後に「 ; 」がないことに注意してください。

これはかなりややこしいルールですが、引数に指示を書いた場合は、その指示の最後には「 ; 」はつけないルールになっています。

それでは、前回のスケッチのdigitalRead(SWITCH);の行を上のようにシリアルモニタにデータを送るように変更しましょう。また、シリアルモニタの速度設定Serial.begin(9600);もsetupに追加することを忘れないようにします。

変更したスケッチは次のようになります。

/*
  内容: スイッチの状態(内部の電圧計)を読み取ってシリアルに送る
*/

#define SWITCH A5 // スイッチを接続している端子名
#define READ_JIKAN 500 // スイッチの状態を読み取る時間間隔(単位:ms)

void setup() {
  Serial.begin(9600); // シリアルモニタの設定
  pinMode(SWITCH, INPUT_PULLUP); // スイッチ接続端子の設定
}

void loop() {
  Serial.println( digitalRead(SWITCH) ); // シリアルに読み取った結果を送る
  delay(READ_JIKAN); // 一定時間待つ
}

スケッチの準備ができたら、Arduinoボードを接続、シリアルモニタウィンドウを表示、Arduinoボードにスケッチを送ります。

スケッチを送ってしばらくすると、以下のように表示されます。

スイッチがOFFの時は「1」が表示されるようですね。

それでは、スイッチを押してみましょう。

スイッチをONにすると「0」が表示されましたよね。

シリアルモニタには、スイッチがOFFの時は「1」が表示されて、スイッチをONにすると「0」が表示されました。

あれ???

スイッチをONにすると内部の電圧計は0Vになるので「0」が表示されるのはいいとして、スイッチがOFFの時は内部の電圧計は「電圧あり」具体的な電圧の値は5Vのはずなのに「1」って表示されています。これはどういうことなのでしょうか?

digitalReadの動作

digitalReadは、デジタル電圧計で「電圧なし(0V)」なのか「電圧あり(5V)」なのかを判定しています。

でもdigitalReadで知りたいのは、2つの状態のどちらかです。電圧があるのかないのか、という2つの状態を知りたいのです。

そこでdigitalReadは、内部の電圧計で読み取った値を、「電圧なし」は「0」、電圧ありは「1」で表現することになっています。

補足ですが、Arduinoボードによっては0Vか3.3Vで動作する機種もあります。3.3V動作のボードでは、内部電圧計は「0V」か「3.3V」かの判定をすることになります。5V動作、3.3V動作どちらのボードでも、digitalReadで読み取った状態は「0」か「1」になります。

ところで、第20回の記事ではdigitalReadの説明を次のようにしました。

この説明、何か足りないですよね。

そうなんです、デジタル電圧計を読み取った結果がどうなるかが説明されていません。

digitalReadの動作はデジタル電圧計を読み取り、その結果は「0」か「1」で教えてくれます。

この教えてくれる結果のことをdigitalReadという指示に対する「戻り値」や「返り値」と呼んでいます

ここまでの内容をまとめると

digitalReadの戻り値は「0」か「1」で、0は電圧なし、1は電圧ありを意味する。

ということになります。

つまり、digitalReadのより正確な説明は次のようになります。

Serial.println( digitalRead(SWITCH) ); の動作

今回のスケッチでは、Serial.printlnの引数にdigitalReadを書きましたが、このように書いた場合、Arduinoボードはどのように指示を処理しているのか確認しておきましょう。

Arduinoボードは以下スケッチを見たとき、Serial.printlnがあるで引数のデータをシリアルに送ろうとします。

Serial.println( digitalRead(SWITCH) );

ところが、引数にはさらに指示が書かれています。

そこで、Arduinoボードはシリアルにデータを送る前に、digitalRead(SWITCH)を処理します。

例えば、スイッチがOFFの場合はdigitalReadでデジタル電圧計を読み取った結果は「1」になりますので、上のスケッチのdigitalRead(SWITCH)の部分を、読み取った結果に置き換えます。

Serial.println( 1 );

これでSerial.printlnが処理できるようになりましたので、Arduinoボードは引数の「1」をシリアルに送信します。

これでスイッチの状態を確認することができました。

次回は、スイッチが押されたら青色LEDの点滅を開始する、というスケッチを作ります。

更新履歴

日付内容
2019.8.15新規投稿
2021.8.22新サイトデザイン対応
2022.2.4動作電圧に関する補足追加
2024.11.29Arduino IDE2の内容に変更
「戻り値」説明追加
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次