はじめてマイコン・ボードArduinoを使ってみる(9)
■シリアル・モニタを使うとプログラムの動きがよくわかる
ArduinoとPCはUSBケーブルで接続されており、二つの用途で使われます。
(1) 開発時、Arduino IDEからArduinoへ実行形式のプログラムを書き込む
(2) プログラムで、ArduinoとPCがシリアル通信を行う
ディジタル・ピンのd0とd1がポートとなり、ボード内でこのシリアル通信をUSBのシリアル通信に変換し、PCはUSBポートで送受信します。このシリアル通信の経路は、Arduinoのプログラム(スケッチ)でも利用できます。そのための命令として、Serial.println()関数、Serial.read()関数などが用意されています。
●Arduinoのシリアル通信の使い方
シリアル通信の基本的な使い方は、次のようになります。
◆シリアル通信の初期化
setup()関数内で、シリアル通信のシステムの初期化と通信速度の設定を行います。シリアル通信の処理を行う場合、この処理は必須です。書式は次になります。
Serial.begin(speed); |
speedは300、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200、230400、250000の値の中から選択します。このスピードが、通信相手と一致する必要があります。多くの場合9600を利用します。高速処理が必要な場合115200を選択します。
◆通信速度を一致させる方法
Arduino側の通信速度はSerial.begin(speed); のspeedの値で設定します。相手側のPC側のシリアル・モニタの送受信速度は、次に示すようにシリアル・モニタのウィンドウ右下にある通信速度のリストから、Arduino側の速度と一致する数値を選択します。
●Arduinoのプログラムでシリアル通信に出力
Arduinoのプログラムで、シリアル通信を利用してPCに出力するには次の命令で行います。
Serial.print(data); dataを表示し改行なし Serial.println(data); dataを表示して行末に改行する |
Serial.print(data); dataの値がPCに送られ、シリアル・モニタのウィンドウに表示されます。この命令の場合、改行が行われません。次にSerial.print(data);を実行すると改行することなく続いて送られたデータが表示されます。区切りが必要な場合はdataを’ ’ スペースや見出しの文字列にしてSerial.print()関数を実行します。
Serial.println(data); dataの表示の後、行末で改行します。次のSerial.print命令の結果は、次の行に表示されます。
●前回のボリュームの値を確認する
前回のボリューム(半固定抵抗)から読み取った電圧値を、アナログ出力でLEDを点滅するポートに出力していました。
プログラムは次に示すようにsetup()は何もなく、loop()は1行の命令だけでした。
void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: analogWrite(6,analogRead(A1)); } |
●シリアル通信でアナログ入力の値を確認する
◆プログラムの追加
アナログ入力の値を一時保存する変数を定義する int aindata; シリアル通信の初期化処理を追加する void setup(){ Serial.begin(9600); } ボリュームの値をaindataに読み込み、シリアル通信で出力、その後アナログ出力する |
◆シリアル・モニタを出す
ツールバーの右端のシリアル・モニタのアイコンをクリックすると、次に示すウィンドウが表示されます。ボリュームの変化に応じて1023から0まで変化します。256、512、768を少し超えたときに、暗くなるのも確認できます。
Arduinoの動きがよくわかります。
左下の「自動スクロール」のチェックをはずすとスクロールを止めるので、画面キャプチャをしました。チェックしておくと、Arduinoから新しく送られてきたデータを順番にスクロールして表示します。
●入力データを1/4してアナログ出力する
アナログ入力したデータを1/4して、アナログ出力することにします。これによりボリュームの変化に応じて消灯から少しずつ明るくなり、途中で消灯することがなくなります。
元のデータと1/4したデータをわかりやすくするために、それぞれ次のようにして見出しを付けました。
aindata = analogRead(A1); Serial.print(aindata); |
プログラム(スケッチ)は次のようになりました。
このプログラムの実行結果を次に示します。ボリュームの動きに応じてどのような値になっているのか、アナログ出力の値も確認できるようになりました。
●Serial.print()関数はプログラムのデバッグの有力な武器
Serial.print命令を利用すると、プログラムの処理の結果をモニタできます。特にプログラムが思い通りに動かなく、プログラムを何回確認しても原因がわからないというのは、残念ながらプログラムを作っていると頻繁に起こることです。このようなとき、プリント文を使えば最初から順番にプログラムの途中結果が正しいか確認するために変数を出力し、値が期待通りか確認できます。
また、プログラムの途中でSerial.println(”point A”) などと確認したい場所に、通過ポイントがわかる文字列を出力し、プログラムの動きを確認します。
Serial通信の関数を利用すると、PCへの送信だけでなく、PCからデータを受信することも、数値データの表示を10進数表示以外に2進数表示、8進数表示、16進数表示なども行えます。それらについては次にステップで説明するのと合わせて、本WebのArduinoリファレンスにも説明を追加する予定です。
本連載で、Arduinoのダウンロードからディジタル入出力、アナログ入出力、シリアル通信の処理を確認しました。これらを題材とするだけでも多くのアプリケーションを作ることができます。ぜひ挑戦してください。また不明な点がありましたら遠慮なくページ下の「お問い合わせ」で質問してください。
「Arduinoで計る、測る、量る」(CQ出版)の読者からも多くの質問をいただきました。これらもサポート・ページでお答えしながらこちらも大いに勉強してきました。読書の方々の意見も併せてこれからの進め方も考えていきます。大いにご意見をお願いします。
次回からステップアップしたシリーズを始めます。
(2016/2/8 V1.0)
<神崎康宏>
バックグラウンド
デバッグ;プログラムは思い通りに動きません。動かない原因をバグといいます。市販のコンピュータ応用製品は、すべてのバグがない状態で出荷されているわけではありません。
デバッグ(バグ取り)には、デバッガというソフトウェアを使うのが一般的ですが、Arduinoはありません。ハードウェアのI/Oなどが関連するバグ退治にはICEという高価なデバッグ装置を使います。
プリント文だけでも多くのことがわかります。
- aindataがいつも0だったら、a1ポートの接続が切れているかもしれません。
- aindataがいつも1023だったら、半固定抵抗の配線が間違っているかもしれません。
- 半固定抵抗を回しているのに、途中でLEDが暗くなるのは、aindata = aindata / 4;のあとでaindataを出力すると、0から1023まで変化するのなら、変数名のつづりが違っているかもしれません。