Arduinoにつないだ温湿度計で取得したデータをEXCELで解析したいので、EXCELに直接読み込めるようにしたいと考えました。
USBで接続したPCとArduinoはシリアル通信でデータのやり取りをするので、EXCELのVBA(Visual Basic for Applications)でシリアル通信ができないかと検討しました。
EXCEL VBAでシリアル通信をするツールとしてEasyCommが知る人ぞ知るみたいな感じのツールですが、開発中止されて何年も経っております。
別の方法として、シリアル通信をサポートするライブラリを導入する方法があります。オシロスコープ等の電子計測器とPCを接続してデータをやり取りする規格としてVISA、VISA-COMという共通の規格があります(クレジットカードのブランド名みたいですが)。 この規格に合わせた通信をサポートするライブラリが各電子計測器メーカーから出ています。このライブラリを使えばEXCEL VBAでArduinoとのシリアル通信を制御できると考えました。
今回はキーサイトが無償公開しているVISA-COMライブラリのKeysight IO Libraries Suiteを使いました。
環境はWindows10 Home + EXCEL 2016 32bit です
Table of Contents
Keysight IO Libraries Suiteの導入
IO Libraries Suite(IOライブラリスイート)とは
IO Libraries Suiteはキーサイト・テクノロジーが無償公開している測定機器(例えばオシロスコープ等)の制御ライブラリです。VISA、VISA-COMという共通の規格でメーカーに依存せず使うことができ、キーサイトの他ナショナルインスツルメンツ、テクロトニクス、菊水電子工業等から同等の機能のライブラリが提供されています。
キーサイト・テクノロジーという会社は知らない方も多いと思いますが、元々ヒューレット・パッカードから事業分離したアジレント・テクノロジーを経て、更に事業分離して現在に至る、世界最大規模の電子計測器メーカーです。
今回はこのライブラリのシリアル通信機能を利用してArduinoと通信できるようにしたいと思います。
IO Libraries Suiteのインストール
キーサイトのIOライブラリ・スイートのダウンロードページに行き『プラットフォーム:Windows』を選択して『ダウンロード』をクリックしてダウンロードします(MacOS用は無いようです)。
ダウンロードしたファイルを管理者権限を持つユーザーで実行してインストールします。インストール方法は簡易取扱説明書(pdf)(リンク切れ2022.1.9 新しいリンク先(要登録) )
に日本語で分かりやすく記載されています。
インストールが完了するとタスクバーにIOコントロールアイコンが表示されます。
Arduinoの準備
Arduinoにシリアル通信で”test?”と送ると”Arduino UNO R3”と返すスケッチを記述します。
void setup() {
Serial.begin( 9600 ); // シリアルポートを9600bpsで初期化
}
void loop() {
if (Serial.available() > 0 ) {
String str = Serial.readStringUntil(10); // 改行コード(10)までの文字列を取得
if (str == "test?") {
Serial.println("Arduino UNO R3");
}
}
}
USBでPCとArduinoをつなぎスケッチを書きこみ、シリアルモニタを開いて”test?”を送信すると”Arduino UNO R3″と帰ってきました。
次の作業の前にシリアルモニタは閉じておきます。開いたままにしていると次の操作でエラーが出ます。
IO Libraries Suiteの設定
Connection Expertの起動
タスクバーのIOコントロールアイコン からConnection Expertを起動します。 Welcome動画が出ますが、”Show welcome at startup.”のチェックを外して閉じてしまいます。
またはWindows スタートメニューからKeysight Connection Expertを起動しても良い。
接続の設定
Connection Expertの画面、左側のメニューのCOM(ASRL3)[*ポート番号は3とは限りません]を選択すると、認識した機器の情報が表示されます。 表示されない場合は接続に問題がある可能性があります。
続いて右上の『Instrument』をクリックすると”Add an RS-232 serial instrument ”のウィンドウが開きます。”Auto-Identify This Instrument” のチェックを外し、”Test This VISA Address” をクリックします。 ”Verified” と表示されたら”OK” をクリックします。 その他の設定はデフォルトで良いと思います。
設定が完了すると”Unknown”の機器が表示されます。
通信の確認
Connection Expertの画面から『Interactive IO 』をクリックして開きます。 コマンドに”test?”と入力して『Send & Read』をクリックすると”Arduino UNO R3”と表示されて通信を確認できました。
常駐を外す
IO Libraries SuiteをインストールするとタスクバーにIOコントロールアイコン が常駐します。 普段はいらないので常駐を外しておきます。 タスクバーを右クリックしてタスクマネージャーを起動します。スタートアップのタブを選択して、keysight IO control を選択した状態で右下の『無効にする(A)』ををクリックして無効化します。
これで次回起動時からIOコントロールアイコンは出なくなります。Connection Expertを使うときはスタートメニューから起動することができます。
EXCEL VBA
EXCEL VBAを使ってArduinoと通信できるようにします。
広告 | |||
EXCEL開発タブの表示
EXCELの初期設定では『開発』タブが表示されていません。普段マクロを使わなければそのままでしょう。
EXCELのリボンの上で右クリックして『リボンのユーザー設定(R)…』を選択してクリックします。
『EXCELのオプション – リボンのユーザー設定』のウィンドウが開きますので、『開発』にチェックして『OK』ボタンをクリックします。
新たに開発タブが表示されました。
VBA プロジェクトの作成
開発タブを選択して『挿入』⇒『フォームコントロール』の『ボタン(フォームコントロール)』を選択し、ワークシート上の適当な位置をクリックします。
『マクロの登録』のウィンドウが出るので『新規作成(N)』をクリックします。
VBAエディタが表示されます。
参照設定
『ツール(T)』⇒『参照設定(R)…』で参照設定のウィンドウを開きます。
『参照可能なライブラリ ファイル(A):』のリストから『VISA COM 5.12 Type Library』(バージョン番号の5.12は将来変わる可能性があります)にチェックを入れて『OK』を押します。リストはたくさんあってかなり下の方なので頑張って探します。
コードの記述
VBAエディタにコードを記述します。記述の仕方はキーサイトのHP(リンク切れ 2022.1.9 代わりのサイト)
に記載されています。
Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)
Sub ボタン1_Click()
'VISA COMオブジェクトを作成し接続を設定
Dim RM As New VisaComLib.ResourceManager
Dim UNO As New VisaComLib.FormattedIO488
Set UNO.IO = RM.Open("ASRL3::INSTR")
Sleep (3000) ' Arduinoの準備が整うまで待機させる。
' Arduinoに"test?"を送り、応答をA1セルに入力する
UNO.WriteString "test?"
Range("A1") = UNO.ReadString()
'接続をCloseし、オブジェクトを解放する
UNO.IO.Close
Set UNO = Nothing
Set RM = Nothing
End Sub
一番最初の”Private Declare Sub Sleep …”はVBA中で処理を一定時間停止させるための関数”Sleep”を使うために記述してます。64bit版EXCELを使う場合は、
Private Declare PtrSafe Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)
と記述します。
7行目の”ASRL3::INSTR”はVISA アドレスでKeysight Connection Expert で確認します。
EXCELのシートに戻ると、『ボタン』ができています。この『ボタン』をクリックするとA1セルに”Arduino UNO R3”と入力されます。
ブックの保存
マクロを含むEXCELブックは標準の” *.xlsx ” では保存できません。EXCEL マクロ有効ブック” *.xlsm ” で保存します。
温湿度記録
配線
温湿度センサーはDHT11 温湿度センサーを基板に取り付けモジュール化されたものを用いました。配線は簡単で+5V,GND,データ線をArduinoにつなぐだけです。
Arduinoのスケッチ
DHT11 温湿度センサーを使うにはDHT sensor libraryとAdafruit Unified Sensorというライブラリが必要です。 インストール方法はあちこちのサイトに記載されていますので省略します。(’21.2.2追記:ライブラリ導入方法を記しました)
Arduinoのスケッチは次のようにしました。 シリアル通信で ”MEAS” を受信すると、温湿度を測定し、カンマで区切った湿度と温度のデータを返します。
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
if (Serial.available() > 0 ) {
String str = Serial.readStringUntil(10);
if (str == "MEAS") {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h)) h = -999;
if (isnan(t)) t = -999;
Serial.print(h);
Serial.print(",");
Serial.println(t);
}
}
}
VBAプログラム
開発タブから『挿入』⇒『フォームコントロール』で新しいVBAプロジェクトを作ります。 一旦閉じたVBAのエディタを再度開くには、開発タブの『Visual Basic』のアイコンか[Alt + F11]で開きます。
『挿入(I)』⇒『ユーザーフォーム(U)』でユーザーフォームを追加します。ツールボックスから『コマンドボタン』をクリックしてユーザーフォーム内の好きな位置に置きます。
置いたコマンドボタンの表記を”STOP”に変えます。ユーザーフォームや”STOP”ボタンの大きさは使いやすい形と配置に変えます。
『STOP』のコマンドボタンをダブルクリックするとコードを入力するエディタになるので、以下のように入力します。
Private Sub CommandButton1_Click()
StopMeas = True
Me.Hide
End Sub
標準モジュールに戻って、以下のコードを記述します。『ボタン』をクリックすると『STOP』を押して測定を終了するまで、毎分の温度と湿度のデータを取得してEXCELセルに入力します。
Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) '32bit版EXCEL
'Private Declare PtrSafe Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) '64bit版EXCEL
Public StopMeas As Boolean
Sub ボタン1_Click()
' VISA COMオブジェクトを作成し接続を設定
Dim RM As New VisaComLib.ResourceManager
Dim UNO As New VisaComLib.FormattedIO488
' 変数の宣言
Dim HumTempData As Variant, GetSerial As String
Dim i As Long, j As Long: i = 0
Dim StartTime As Date: StartTime = Int(Now() * 1440) / 1440 ' 開始時刻を秒以下切り捨てて取得
StopMeas = False
Worksheets("Sheet1").Range(Cells(2, 1), Cells(Rows.Count, 3)).Clear
Set UNO.IO = RM.Open("ASRL3::INSTR") ' Arduinoと接続 VISAアドレス"ASRL3::INSTR"はConnection Expert で確認
Sleep (3000) ' Arduinoの準備が整うまで待機
UserForm1.Show vbModeless ' ユーザーフォームをモードレスで表示
Do
' 毎分0秒になるまで待機させる。
For j = 1 To 60
DoEvents ' 入力を受け付けれるようにする
Application.Wait StartTime + (i + j / 60) / 1440
If StopMeas = True Then Exit Do ' ユーザーフォームの"STOP"がクリックされるとDoループを抜ける
Next j
' Arduinoに"MEAS"コードを送り、応答データから改行コードを削除して、","で分割する
UNO.WriteString "MEAS"
GetSerial = Replace(UNO.ReadString(), vbCrLf, "")
HumTempData = Split(GetSerial, ",")
' セルに時刻、温度、湿度を入力
Cells(i + 2, 1) = Format(Now(), "yyyy/mm/dd hh:mm:ss")
Cells(i + 2, 2) = HumTempData(1)
Cells(i + 2, 3) = HumTempData(0)
i = i + 1
Loop
' 接続をCloseし、オブジェクトを解放する
Unload UserForm1
UNO.IO.Close
Set UNO = Nothing
Set RM = Nothing
End Sub
ワークシートに戻って『ボタン』をクリックすると一分毎に温度と湿度のデータをセルに入力してくれます。『STOP』ボタンを押すと測定が終了します。
Arduinoで取得したデータをEXCELに取り込むことができるようになりました。
広告 | |||
1 Pingback