【VB.Net】ArduinoProMini互換機とCdsを使って明るさをグラフ化してみた。

どうも!リョクちゃです。

今回は前回の記事の応用例といった形になります。

ArduinoProMini互換機とCdsと呼ばれる明るさセンサを用いて、

室内の明るさを計測し、Cdsからの値をArduinoProMini互換機を経由し

シリアル通信で受信します。

受信した値をリアルタイムでチャートコントロールに表示するといった内容の

実験をしてみましたので紹介していきます。

ちなみに前回はこちら

Arduinoとは、イタリアで産まれた教育用のマイコンボードです。今回はArdunioProMiniの互換機とされるAE-ATMEGA328-MINIを使って、VB.Netでシリアル通信をし、ATMEGA328MINIからデータを受信する方法を紹介しています。



準備編

VisualStudio2019を使って、Windowsフォームアプリケーションを作成していきます。

最初の手順については、下記記事をご参照ください。

VisualStudioを使ってWindowsアプリケーションを開発していく流れを紹介します。 以前に、簡単にざっくりと教える機会があった...
スポンサーリンク




Cdsとは

硫化カドミウムセルと呼ばれ、硫黄(元素記号:S)とカドミウム(cd)の化合物になります。

下図の表面の受光部分に光を受けると明るさによって、抵抗値を低くする特性があります。

Cdsセンサ

特徴としては、

  • 受光した際の反応が遅い
  • 応答性を必要とする用途には不得手

といった特徴が挙げられます。

特性を利用して、暗いときに自動的に光っていく自動照明灯などに用いられたりしています

CdsとArduinoProMini互換機の接続

ArduinoProMini互換機とCdsは以下のように接続しました。

Cdsは光を効率よく受け取れるよう黒い筒を被せています。

互換機のA01端子にCdsを接続します。

A01端子はアナログピンと呼ばれ、Cdsで受け取った値をアナログ値で取得します。

互換機はA0~A7までの8ピンが搭載されています。

フォームの作成

今回は以下のようなフォームを作成します。

各1~8までのコントロールの名称やテキストは以下のように設定しています。

Noコントロール名前テキスト
1LabelLabel1COM Port
2LabelLabel2INPUT
3ComboBoxcbComPort
4RichTextBoxrtxSerial
5ChartchPhoto
6LabellblTimerTimer:off
7ButtonbtConnectConnect
8ButtonbtClearCLEAR

実行環境

筆者の実行環境は、

  • VisualStudio2019
  • Windows 10 64bit
  • .Net Framework 4.5.1

になります。

※ Windows7 8 8.1でも動作はできますが、

画面デザインの表示が変わるかもしれません。

アプリケーションの目的

ArudinoProMini互換機に接続されたCdsの計測値をシリアル通信を介し、

受信することでrtxSerialとchPhotoにそれぞれ表示できることを目的とします。

rtxSerialでは受け取った値を表示、chPhotoでは値を折れ線グラフ化することとします。

プログラム編

ArduioProMini互換機のスケッチ

AruduinoIDEを使用して、スケッチを作成していきます。

スケッチは前回作成したスケッチを使用していきます。

定数・変数の宣言

Cdsがつながっているピン情報を定数、Cdsからの値を記憶するのを変数として

それぞれ宣言します。

setup()ブロックでの処理

シリアルポートの設定を行います。

loop()ブロックでの処理

Cdsからの値を変数で受け取ります。

Cdsの値を受け取るには、

analogRead(ピン番号)

と記述することで受け取ることができます。

ArduinoProMiniでは、0~1023の範囲でアナログ値(整数値)を受け取ることができます。

これはアナログピンが10ビットのAD(アナログ・デジタル)コンバータを搭載しているからです。

受け取った値はSerial.printlnに引数として渡します。

これを1秒間隔で実行するようにします。

以下がloop()ブロック内のコードになります。

以上が、今回のスケッチとなります。



VB.Netのコード

定数・変数宣言

定数には、履歴の上限を50件としたいのであらかじめ宣言しておきます。

変数には、Comポートの選択値を代入する変数と

受け取った情報を記憶する変数そして受け取ったデータを

格納しておくコレクション(キュー)をそれぞれ変数として宣言します。

フォームロード時の処理

以下の処理を行います。

  • タイマーの非アクティブ
  • COMポートの取得をし、コンボボックスへ反映
  • チャートの表示を初期化

チャートの表示を初期化する部分は関数として新たに作成しています。

初期化の関数

今回はチャートを計測機器に表示されているかのようなモニタデザインにしていきます。

こんなイメージにしていきます。

シリアル通信に関連する処理

ハードウェアとの接続に関しては以下の処理を行います。

  • Connectボタン押下
  • シリアル通信の準備
  • シリアル通信の開始
    既に接続されている場合は、通信を閉じる処理を実行します。
  • 接続確立後ボタンのテキストをDis-connectに変更
  • タイマーの設定(1秒周期でチャートの再描画を行います。)

データの受信に関する処理の流れは以下のようにします。

  • データを受信
    受け取った値が0ならnothing & vbcrlf(改行コード)を戻り値として返します。
    0でなければ、受け取った値を整数型に変換し、戻り値として返します。

チャートコントロールの処理

1秒間隔で再描画を行うので、タイマーイベントの処理は以下のようにしました。

  • コレクション変数に受け取った値を格納
  • rtxSerialに受け取った値を表示
  • コレクション変数が格納許容数を超えていたら格納した値を取り除く
  • グラフの再描画

これらの処理を行います。

履歴の最大数を超えていたら、コレクション変数に最初に格納された値から取り除きます。

以降、同様の処理を1秒ごとに繰り返します。

グラフへの描画処理は以下の関数を作成し行います。



実行編

実際にArduinoProMini互換機と接続して、プログラムを実行していきます。

プログラム起動時

COMポートの選択

接続後の明るさ受信

接続後の明るさ受信(数分経過後)

Cdsにライトを照らしたり、指でCdsを覆ったりして明るさを変化させてみました。

うーん、データの受信にインターバルを設定しているせいか、

スムーズな受信ができていない気がします。

これは改善の余地がありです。

※ もしコードを試される方がいましたらお気を付けください。

まとめ

ArduinoProMini互換機とCdsを使って計測値を受信し、チャートコントロールで

リアルタイムに可視化することができました。

PCとArduinoProMini互換機の通信が同期していないせいか、タイミングによっては

受信できなくなったり、チャートコントロールでの表示が遅れたりとしてしまいました。

まだまだ勉強と改善が必要です……。

読者の方の何らかの参考になれば嬉しいです。

最後までご覧いただきありがとうございます。

・こちらの書籍を参考にVB.Net勉強しています。

スポンサーリンク