今回はスイッチの状態をArduino IDEで確認します。
Arduinoボードの中で起こっていることを自分の目で確認したい
前回の記事では、digitalRead命令を使ってスイッチの状態を確認しました。
具体的にはスイッチがつながっている23番端子の電圧計の値を読み取りました。
それは確かにそうなんですが、、、Arduinoボードは電圧計読み取っていたはずなのですが、外から見ても何も変化はありませんでした。
やっぱりdigitalReadの結果がどのようになっているのか、自分の目で確認してみたいですよね。このようなケースに限らず、他にもいろいろな場面でArduinoボードの中で何が起こっているのか知りたいことがあります。
そこで、Arduinoボードの中で何が起こっているのかを知るために、今回はArduinoボードからArduino IDEに情報を送ってもらって自分の目で確認してみます。
シリアルモニタ
Arduinoボードの中で何が起こっているのかを知るために、Arduinoボードからデータを送って、Arduino IDEに表示する仕組みがあります。
この仕組みは「シリアルモニタ」と呼ばれています。シリアルモニタがどのようなものか、最初にイメージをつかんでみましょう。
Arduino IDEの「ツール」メニューに「シリアルモニタ」というメニューがあります。
このメニューを選択すると、以下のようなウインドウが表示されます。これをシリアルモニタウィンドウと呼びます。
スケッチの中にデータを送信する命令を書いておくと、以下のようにArduinoボードが送信したデータがシリアルモニタウィンドウに表示されます。
このようにして、Arduinoボードの中で何が起こっているのかデータを見ながら確認することができます。とはいってもどのようなデータを送ることができるのかまだわかりませんよね。
これから、シリアルモニタウィンドウにデータを送る命令はどのようなものか、どのようなデータが送れるのかを詳しく見ていきます。
Serial.begin命令
シリアルモニタにデータを表示するには最初に設定が必要です。どのような設定が必要か、その背景から説明します。
Arduinoボードからシリアルモニタウィンドウにデータを送る場合、データを送る速度を合わせる必要があります。
Arduino IDEが動作しているPCとArduinoボードは別々に動いているので、データを正しくやり取りするには、お互いにあらかじめデータを送る速度を合わせておく必要があります。
それではこれから速度の設定方法を説明します。
最初はシリアルモニタウィンドウの設定方法です。シリアルモニタウィンドウ側では、以下のメニューで速度を設定します。
速度の数値が大きいほど早くなります。
だったら早い方がお得かな、という気もしますが、あまり早い速度にするとデータの送信が不安定になってデータ内容が変わってしまうことがあります(データ内容が変わってしまうことを「データが化ける」とも言います)。
今回は一般的によく使われている「9600」を使用することにします。
次に、スケッチの設定方法です。この設定を行うために以下の命令が用意されています。この設定は1回行えばいいので、スケッチのsetupに書きます。
「Serial」は「シリアル」、「begin」は「開始する」という意味です。「これからシリアルモニタを使いますよ」というような意味になります。
速度は「9600」にしますので、スケッチのsetupのところに以下のように書きます。。
Serial.begin(9600);
これでArduinoボードからデータを送る準備ができました。次はデータの送信方法を説明します。
Serial.printlnとSerial.print命令
データを送る準備ができたら、いよいよデータを送る命令を使ってArduinoボードからシリアルモニタウィンドウにデータを送ります。
今まで「Arduinoボードからシリアルモニタウィンドウにデータを送る」と説明してきましたが、「データ」って漠然としていましたよね。
Arduinoボードからシリアルモニタウィンドウに送る「データ」とは、数値か文字になります。
それでは数値や文字のデータをシリアルモニタウィンドウに送る命令を確認しましょう。この命令は2種類あります。「Serial.println命令」と「Serial.print」命令です。
ちょっと微妙な違いですが、どの文字の部分が違うかわかりますか?
片方は最後に「ln」がついていて、もう片方にはついていません。これらの命令の違いは以下になります。
命令 | 内容 |
---|---|
Serial.println命令 | シリアルモニタウィンドウにデータを表示したあと、改行する |
Serial.print命令 | シリアルモニタウィンドウにデータを表示したあと、改行しない |
これらの命令の違いは、データを表示したあとに改行するかしないかの違いだけで、そのほかの動作は全く同じです。実際にどのようになるか、あとで確認してみます。
これらの命令の意味ですが、「Serial」は先ほどのSerial.beginと同様に「シリアル」という意味です。また、「print」は表示するという意味です。
改行する方の命令の最後の「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回データを送信する
* 変更履歴:
* 2019.8.15: 新規作成
*/
void setup() {
Serial.begin(9600); // シリアルモニタの設定(データの速度は9600)
}
void loop() {
Serial.println("シリアルモニタのテスト"); // シリアルモニタにデータを送信する
delay(1000); // 1秒待つ
}
これでスケッチの準備ができました。
次に、ArduinoボードとPCをUSBケーブルで接続します(シリアルモニタウィンドウを表示するにはArduinoボードを接続しておく必要があります)。
接続したらArduino IDEの「ツール」メニューから「シリアルモニタ」メニューを選択します。
選択するとシリアルモニタウィンドウが表示されますので、右下の方にあるデータを送る速度が「9600」になっているか確認します。
確認できたら、スケッチをArduinoボードに送ります。
しばらく待っていると、以下のようにシリアルモニタウィンドウに1秒に1回、「シリアルモニタのテスト」と表示されます。
確認できたら、ちょっとだけスケッチを変更してみましょう。上のスケッチでは「Serial.println命令」を使用しましたが、「Serial.print命令」(改行なし)に変更して、シリアルモニタウィンドウにどのように表示されるか確認してください。
スイッチ状態をシリアルモニタに表示する
前回のスケッチで、digitalRead命令でスイッチの状態を読み取りましたが、その結果はわかりませんでした。そこで、今回習得したシリアルモニタでスイッチの状態を確認してみます。
それでは、前回作成した「switch」スケッチを開いてください。
このスケッチでは「digitalRead(SWITCH);」でスイッチが接続された23番端子の状態、つまり電圧計の値を読み取っています。この値をシリアルモニタウィンドウに表示するには、以下のように「digitalRead(SWITCH)」をSerial.println命令のパラメータにすればOKです。
Serial.println(digitalRead(SWITCH));
なお、Seiral.printlnのパラメータになっている「digitalRead(SWITCH)」の最後に「 ; 」がないことに注意してください。
これはかなりややこしいルールですが、パラメータに命令を書いた場合は、その命令の最後には「 ; 」はつけないルールになっています。このルールは今後も多く出てきますので、このスケッチで慣れるようにしてください。
それでは、前回のスケッチのdigitalRead(SWITCH);
の行を上のようにシリアルモニタにデータを送るように変更しましょう。また、シリアルモニタの速度設定Serial.begin(9600);
もsetupに追加することを忘れないようにします。
前回のスケッチにコメントを追加して以下のように変更してみました。
必要があれば、以下のスケッチをコピペしてください。
/*
* 内容: スイッチの状態(内部の電圧計)を読み取る
* 変更履歴:
* 2019.8.14: 新規作成
* 2019.8.15: シリアルモニタに表示するように変更
*/
#define SWITCH 23 // スイッチを接続している端子番号
#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命令とSerial.println命令の動作
digitalRead命令は、内部では端子の状態が0Vなのか5Vなのかを判定しています。
でもdigitalRead命令で知りたいのは、2つの状態のどちらかです。電圧が低いのか高いのか、ONかOFFか、という2つの状態を知りたいのです。
そこでdigitalRead命令は、内部の電圧計で読み取った値を、0Vに近い時は「0」、5Vに近い時は「1」を表示するようになっています。
補足ですが、Arduinoボードによっては0Vか3.3Vで動作する機種もあります。3.3V動作のボードでは、内部電圧計は「0V」か「3.3V」かの判定をすることになります。5V動作、3.3V動作どちらのボードでも、digitalRead命令で読み取った状態は「0」か「1」になります。
今回のスケッチでは、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 | 動作電圧に関する補足追加 |