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がパソコンと接続されていること。

Tera Term設定画面1
Tera Term設定画面1

続いて、
メニュー「設定(S)」 → 「シリアルポート(E)」と選択し、
Tera Termシリアルポート設定画面で、
「スピード(E)」をプログラムの
setup( )関数内の記述速度と同じに設定します。

Tera Term設定画面2
Tera Term設定画面2
Tera Term設定画面3
Tera Term設定画面3

では、
シリアルモニタから送信した文字を、
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で表示してみます。

シリアルモニタで表示
シリアルモニタで表示
Tera Termで表示
Tera Termで表示

続いて、シリアルプロッタで表示してみます。
メニューの 「ツール」 → 「シリアルプロッタ」 と選択します。

シリアルプロッタ画面の選択
シリアルプロッタ画面の選択
シリアルプロッタ画面
シリアルプロッタ画面

グラフが表示されていると思います。
これは、送られてきた情報を、グラフ化して表示してくれます。
送られてくる変数 i の値は 0 → 255 → 0 と変化するので、
それをグラフ化したものです。
値の動きをグラフとして見たい時などに便利です。
ただし、残念なのですが、シリアルモニタとシリアルプロッタは
同時には使用できません。