NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino⇔Excel Vbaシリアル通信!(EasyCommの使い方)

イメージ 8

 Arduinoで測定したデータは大概EXCELでまとめるので、データをArduinoからEXCELに直接取り込み出来たらいいなと思っておりました。
 「シリアル通信+VBA」で検索した所「EasyComm」と言う上の図で言う「」の部分に当たるVBAからシリアルポート制御プログラムを作成するためのモジュール が公開されていましたので試しに使ってみました 
 

1. EasyCommとは?

 「EasyComm」とは、シリアルポートを手軽に利用する事を目的としたVisualBasic系のモジュールです。
 これは木下清美さんが開発されたVBAモジュールで、「ec.bas」と「ecDef.bas」の2つのモジュールから構成されています。
 「EasyComm」は、Windows標準のAPI(Application Programming Interface)を使用しているので殆どのシリアルポートで使用する事が出来ます。
 既にサポートは終了している様ですが現在でも無償でダウンロード出来ました。
 

2. ダウンロード

 Windows7(32bit)+Excel2013(32bit)環境で「EasyComm」を導入してみました!
 ※Windows10(64bit)+Excel2016(32bit)環境でも動作するのを確認しました。
 
 Brothersoftさんのサイトにアクセスした画面が図1です。
 画面下の「EasyComm ダウンロード」をクリックすれば「easycomm_1_84.lzh」がダウンロードされます。
イメージ 1
図1:Brothersoftでダウンロード
 
2.2 ダウンロードファイル
 図1でダウンロードしたファイル「easycomm_1_84.lzh」アイコンが図2です。
 このファイルを開くと図3に示した4つのファイル「ec.bas」「ecDef.bas」「ecManual.xls」「readme.txt」が入っています。
 VBAに導入するのは「ec.bas」「ecDef.bas」モジュールですのでこれをデスクトップに取り出しておきます。
イメージ 2
図2:ダウンロードファイル「easycomm_1_84.lzh」アイコン
 
イメージ 3
図3:「easycomm_1_84.lzh」の中身
 

3. インストール

 VBAモジュール「ec.bas」「ecDef.bas」をインストールしてみました!
 
3.1 VBA
 EXCELに付属のVBA(Visual Basic for Applications)を開いた画面が図4です。
 画面左の「プロジェクト」欄にファイルのツリー構造が表示されています。
 適当なEXCEL BOOKでもVBAモジュールを追加出来ますが、こう言った良く使いそうなモジュール・自作マクロなどはEXCEL立ち上げと同時に裏で起動される「PERSONAL.XLSB」ファイルに追加します。
 図4の様に「PERSONAL.XLSB」の「標準モジュール」上で右クリック→「ファイルのインポート」をクリックします。
イメージ 4
図4:VBA画面
 
3.2 ファイルのインポート
 図4操作で図5の「ファイルをインポート」画面が開きます。
 先ほどデスクトップに出したVBAモジュール「ec.bas」を選択して開けばOKです!
 「ecDef.bas」ファイルについても同様にインポートしておきます。
イメージ 5
図5:モジュールファイルのインポート
 

4. ArduinoIDEでプログラム

 同じPCで、ArduinoIDEからArduinoUNOに図6のスケッチ(プログラム)を書き込んでおきます。 書き込みが終わった状態で、シリアルモニタボタン(図6右上🔎ボタン)を押した状態が図7です。
 このプログラムを書き込んだArduinoUNOは、図7の通り1秒間隔で1~99迄の乱数をPCにシリアル出力し続けます。
void setup() { //一回だけ実行する
  Serial.begin(9600);//9600bpsでシリアルポートを開く
}
void loop() { //{}内を無限ループで実行する
  randomSeed(analogRead(0));//未接続ピンのノイズを利用
  int i = random(1, 100); //iに1~99迄のランダムな整数を代入
  Serial.println(i);//iの値の後に改行を付けてシリアル出力します
  delay(1000);//1000ms(1秒)待ちます
}

イメージ 1
図6:プログラムの内容

 

イメージ 9
図7:シリアルモニタ
 

5. VBAでプログラム

 PCには、図7の様にArduinoUNOから一秒間隔でシリアルデータを受信していますので、このデータをVBAから取得してみます。
 
5.1 空のモジュールを追加
 VBAのマクロ(プログラム)を書く為の空のモジュールを「PERSONAL.XLSB」に追加します。
 方法は図8の様に「標準モジュール」上で右クリック→「挿入」→「標準モジュール」をクリックします。
 これでプログラムを書く為のモジュールが追加されました。
イメージ 6
図8:標準モジュールの追加
 
5.2 プログラムを書く
 EasyCommのプロパティー、メソッドは3.1~3.2の操作でVBAから利用可能になっています。
 これらプロパティーとメソッドを使って図9の通りVBAプログラムを書いてみました!
Sub EasyCommTest()
'20170518 NOBのArduino日記!

'①初期設定
ec.COMn = 4 'COM4を指定します
ec.Setting = "9600,n,8,2" '通信条件(ボーレート,パリティビット数,データビット数,ストップビット数)の設定
ec.HandShaking = ec.HANDSHAKEs.RTSCTS '通信ハンドシェークの設定
ec.Delimiter = ec.DELIMs.CrLf 'データの区切りを示す文字列を設定します

'②データの送信
ec.OutBuffer = 100& * 1024& '現在処理の対象になっているポートの送信バッファを100kBに設定します
ec.AsciiLine = "*TRG" '"*TRG"という文字列をデリミタ付きで送信します.

'③データの受信
A$ = ec.AsciiLine 'デリミタの手前までの受信文字列をA$に代入します.
ec.InBufferClear '受信バッファをクリア

'④受信データの表示
MsgBox A$

'⑤ポートを閉じる
ec.COMn = -1 '終了処理

End Sub
図9:VBAマクロ
 
 図9プログラムの内容としては①「ポートを開く」→②「データの送信」→③「データの受信」→④「データの表示」→⑤「ポートを閉じる」です。
 

■プログラムの補足

 ①「ポートを開く」
ec.COMn = 4 'COM4を指定します
 ポート番号としてCOM「4」を指定していますが、この番号はArduinoIDEからArduinoUNOにプログラムを書き込む際に使用した番号を指定します。
 
②「データの送信」
ec.AsciiLine = "*TRG" '"*TRG"という文字列をデリミタ付きで送信します.
 このプログラムではVBAからも「*TRG」と言う文字列をArduinoUNOに送っていますが、特にArduinoUNO側でこの文字列は図6の通り処理していませんので参考です。
ArduinoUNO側に受信データを処理するプログラムを書けば、VBA側からArduinoUNOを制御する事ももちろん出来ます。
 
③「データの受信」
A$ = ec.AsciiLine 'デリミタの手前までの受信文字列をA$に代入します.
EasyCommモジュールの「ec.AsciiLine」関数で、PCがArduinoUNOから受信したデータを取得し変数「A$」に代入します。

④「データの表示」
MsgBox A$
VBAの「MsgBox」関数で、③で取得したデータ(1~99迄の乱数)を図10の様に無事表示(この時は”15)出来ました!
イメージ 7
図10:図9マクロ実行結果
 
⑤「ポートを閉じる」
ec.COMn = -1 '終了処理
 プログラムの最後には必ずEasyCommモジュールの「ec.COMn」プロパティに 0以下の整数を代入しポートを閉じます。
 
5.3 補足
20180830追記:Arduinoから来たシリアルデータを、EXCELシートに直接取り込む方法は「MARGセンサーの使い方!(EXCEL VBAにデータ取得編)」をご覧ください。
 

6. まとめ

 「EasyComm」でVBAからシリアルポートが使える様になりました!
これが有ればArduinoを使った測定装置を作る際は活躍しそうです!
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る