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 です

Keysight IO Libraries Suiteの導入

IO Libraries Suite(IOライブラリスイート)とは

 IO Libraries Suiteはキーサイト・テクノロジーが無償公開している測定機器(例えばオシロスコープ等)の制御ライブラリです。VISA、VISA-COMという共通の規格でメーカーに依存せず使うことができ、キーサイトの他ナショナルインスツルメンツ、テクロトニクス、菊水電子工業等から同等の機能のライブラリが提供されています。

 キーサイト・テクノロジーという会社は知らない方も多いと思いますが、元々ヒューレット・パッカードから事業分離したアジレント・テクノロジーを経て、更に事業分離して現在に至る、世界最大規模の電子計測器メーカーです。

 今回はこのライブラリのシリアル通信機能を利用してArduinoと通信できるようにしたいと思います。

IO Libraries Suiteのインストール

 キーサイトのIOライブラリ・スイートのダウンロードページに行き『プラットフォーム:Windows』を選択して『ダウンロード』をクリックしてダウンロードします(MacOS用は無いようです)。

 ダウンロードしたファイルを管理者権限を持つユーザーで実行してインストールします。インストール方法は簡易取扱説明書(pdf)に日本語で分かりやすく記載されています。

 インストールが完了するとタスクバーに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に記載されています。

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 libraryAdafruit 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に取り込むことができるようになりました。

広告
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Arduino互換 DHT11 温度&湿度センサーモジュール
価格:1064円(税込、送料別) (2021/2/3時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Arduino互換 37-in-1 センサーモジュールキットセット
価格:5904円(税込、送料別) (2021/2/3時点)