PCのキーボードから指示してみる(Arduino)
今まで、
Arduinoからシリアルモニタに数値を表示させたりしました。
今回は、
シリアルモニタからArduinoへ情報を送信してみましょう。
また、シリアルプロッタで表示もしてみます。
とはいっても、
Arduinoには表示画面がありませんので、
Arduinoが情報を受け取ったら、LEDを点滅させてみます。
ちょっとその前に、シリアルモニタ画面についてです。
シリアルモニタ画面の上段に、送信用の欄があります。
この欄に送信内容を打ち込み、送信ボタンを押すことで、
その情報がArduinoへ送信されます。
パソコンで、送受信のソフトとしてよく使われる、
ターミナルソフトというものがあります。
代表的なものとして、Tera Termがあります。
Tera Term(窓の杜などでダウンロード可)
https://forest.watch.impress.co.jp/library/software/utf8teraterm/
このソフトは、インターネットで
サーバのリモート操作等に利用されでいますが、
Arduinoとパソコンとの通信にも利用出来ます。
ただ、ArduinoIDEのシリアルモニタのように、
送受信の画面が分かれていません。
入力した文字が画面に表示されないので、
少し使い慣れる必要があるかもしれません。
私には使いこなせませんが、
多くの機能を持っており大変便利に使えるようです。
インストールは何も変更せず、
デフォルト(選択項目の変更はしない)で
インストールすればOKです。
起動はアイコンをダブルクリックし、
初期画面で、「シリアル(E)」を選択し、
ポート(R)をArduinoの接続されているCOMを選択します。
このとき、Arduinoがパソコンと接続されていること。
続いて、
メニュー「設定(S)」 → 「シリアルポート(E)」と選択し、
Tera Termシリアルポート設定画面で、
「スピード(E)」をプログラムの
setup( )関数内の記述速度と同じに設定します。
では、
シリアルモニタから送信した文字を、
Arduinoから、シリアルモニタへ送り返される、
プログラムをしてみます。
Arduinoからシリアルモニタへの送信は、
もう大丈夫かと思いますので、
シリアルモニタからArduinoへの送信情報の
受取方について進めます。
今回は、半角1文字毎に処理する方法です。
※連続した文字列として扱うのはまたいずれ。。。
シリアルポートからの入力情報の取得ですが、
1.受信情報の有無を確認する。
Serial.available()関数を使います。
この関数は、シリアルポートに受信情報が存在する場合、
そのバイト数(半角文字数)を取得します。
・受信情報がなければ0ということですね。
if( Serial.available() > 0 ) { 受信情報がある場合の処理 }
と記述します。
2.受信情報が存在する場合、その情報を取得します。
Serial.read()関数を使用します。
Serial.read()関数は受信情報の中から1文字を取り出し、
自分自身で保持していますので、
一般には、代入演算子(=)を使用してint型変数等へ代入し、
int inkey = Serial.read();
などと記述します使用します。
実際にスケッチしてみます。
void setup() {
// put your setup code here, to run once:
Serial.begin( 9600 ); // シリアルポートを初期化(9600bps)
}
void loop() {
// put your main code here, to run repeatedly:
// 変数宣言
char inkey; // 入力文字格納用
// 読み込み情報の有無確認
if( Serial.available() > 0 ) {
// シリアルから値の読み込み
inkey = Serial.read();
// シリアルポートへ出力
Serial.print( inkey );
}
delay( 100 ); // 100ms停止
}
では、検証しマイコンボードへ書き込みます。
入力欄に半角文字を入力し、送信ボタンを押すか、
Enterキーを押します。
表示欄に、Arduinoから折り返してきた文字が
表示されたと思います。
このとき、送信ボタン(Enterキー)で送られた
改行も戻ってきます。
・・・改行も文字ですから。。。
続いてのプログラムは、
・キーボードから’u’を送信したら、
デジタルピン6番に接続したLEDを点灯させます。
・キーボードから’d’を送信したら、
デジタルピン6番に接続したLEDを消灯させます。
といういつも通り簡単なものです。
回路は、”ブレッドボードのLEDを点滅させる”で使用したものです。
回路は図の通りです。
この回路図の作図には fritzing を利用させて頂いております。
https://fritzing.org/home/
では、スケッチします。
void setup() {
// put your setup code here, to run once:
pinMode( 6, OUTPUT ); // 6番ピンを出力に設定
Serial.begin( 9600 ); // シリアルポートを初期化(9600bps)
}
void loop() {
// put your main code here, to run repeatedly:
// 変数宣言
int inkey; // 入力文字格納用
// 読み込み情報の有無確認
if( Serial.available() > 0 ) {
// シリアルから値の読み込み
inkey = Serial.read();
// 入力文字の判定
switch( inkey ){
case 'u':
digitalWrite( 6, HIGH ); // 6番、点灯
break;
case 'd':
digitalWrite( 6, LOW ); // 6番、消灯
break;
}
}
delay( 100 ); // 100ms停止
}
case文で、case 'u': のように
u を '(シングルクォーテーション)で囲んであるのは、
u という1文字比較するための記述方法です。
※case 文の最後は、:(コロン)が必要です、お忘れなく。
検証しマイコンボードへ書き込みます。
u 「Enter」でLEDが点灯、
d 「Enter」でLEDが消灯、
します。
その他のキーを打鍵しても何も反応しないと思います。
これは、switch case 文を使い、'u'、 'd' のみを判定し
ていますので、他の文字は無視されています。
この行為を”読み捨る”などといいます。
もう一つ、
上の2つのプログラムを組み合わせてみましょう。
続いてのプログラムは、
・キーボードから’u’を送信したら、
デジタルピン6番に接続したLEDを点灯させ、
シリアルモニターに ”No6:ON” と表示します。
・キーボードから’d’を送信したら、
デジタルピン6番に接続したLEDを消灯させ、
シリアルモニターに ”No6:OFF” と表示します。
このようなプログラムを作成してみます。
スケッチしてみます。
void loop() {
// put your setup code here, to run once:
pinMode( 6, OUTPUT ); // 6番ピンを出力に設定
Serial.begin( 9600 ); // シリアルポートを初期化(9600bps)
}
void loop() {
// put your main code here, to run repeatedly:
// 変数宣言
char inkey; // 入力文字格納用
// 読み込み情報の有無確認
if( Serial.available() > 0 ) {
// シリアルから値の読み込み
inkey = Serial.read();
// 入力文字の判定
switch( inkey ){
case 'u':
digitalWrite( 6, HIGH ); // 6番、点灯
Serial.println( "No.6:ON" ); // シリアルポートへ出力4
break;
case 'd':
digitalWrite( 6, LOW ); // 6番、消灯
Serial.println( "No.6:OFF" ); // シリアルポートへ出力
break;
}
}
delay( 100 ); // 100ms停止
}
検証しマイコンボードへ書き込みます。
u 「Enter」でLEDが点灯し、シリアルモニに"No.6:ON"と表示、
d 「Enter」でLEDが消灯し、シリアルモニに"No.6:OFF"と表示、
されます。
シリアルプロッタを使ってみましょう。
使用するプログラムは、
以前作成したLEDの明るさが徐々に変化するプログラムです。
このプログラムに、
明るさを変化させるために使用した変数iの値を、
コンソールへ表示(送信する)ための記述、
Serial.println( i ); // iの値をシリアルへ
を2カ所に追加します。
スケッチを変更します。
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // シリアルポートを初期化(9600 bpsで通信)
}
void loop() {
// put your main code here, to run repeatedly:
// 変数宣言
int i;
// 徐々に点灯
for ( i = 0; i <= 255; i+=2 ) {
analogWrite( 6, i );
Serial.println( i ); // iの値をシリアルへ
delay(50);
}
// 徐々に消灯 for ( i = 255; i >= 0; i-=2 ) {
analogWrite( 6, i );
Serial.println( i ); // iの値をシリアルへ
delay(50);
}
delay(1000);
}
では、シリアルモニタとTera Termで表示してみます。
続いて、シリアルプロッタで表示してみます。
メニューの 「ツール」 → 「シリアルプロッタ」 と選択します。
グラフが表示されていると思います。
これは、送られてきた情報を、グラフ化して表示してくれます。
送られてくる変数 i の値は 0 → 255 → 0 と変化するので、
それをグラフ化したものです。
値の動きをグラフとして見たい時などに便利です。
ただし、残念なのですが、シリアルモニタとシリアルプロッタは
同時には使用できません。