「シリアル通信+VBA」で検索した所「EasyComm」と言う上の図で言う「⇔」の部分に当たるVBAからシリアルポート制御プログラムを作成するためのモジュール が公開されていましたので試しに使ってみました!
1. EasyCommとは?
「EasyComm」とは、シリアルポートを手軽に利用する事を目的としたVisualBasic系のモジュールです。
「EasyComm」は、Windows標準のAPI(Application Programming Interface)を使用しているので殆どのシリアルポートで使用する事が出来ます。
既にサポートは終了している様ですが現在でも無償でダウンロード出来ました。
2. ダウンロード
※Windows10(64bit)+Excel2016(32bit)環境でも動作するのを確認しました。
2.1 ダウンロードサイト
Brothersoftさんのサイトにアクセスした画面が図1です。
画面下の「EasyComm ダウンロード」をクリックすれば「easycomm_1_84.lzh」がダウンロードされます。
図1:Brothersoftでダウンロード
2.2 ダウンロードファイル
このファイルを開くと図3に示した4つのファイル「ec.bas」「ecDef.bas」「ecManual.xls」「readme.txt」が入っています。
VBAに導入するのは「ec.bas」「ecDef.bas」モジュールですのでこれをデスクトップに取り出しておきます。
図2:ダウンロードファイル「easycomm_1_84.lzh」アイコン
図3:「easycomm_1_84.lzh」の中身
3. インストール
図4:VBA画面
3.2 ファイルのインポート
図4操作で図5の「ファイルをインポート」画面が開きます。
「ecDef.bas」ファイルについても同様にインポートしておきます。
図5:モジュールファイルのインポート
4. ArduinoIDEでプログラム
同じPCで、ArduinoIDEからArduinoUNOに図6のスケッチ(プログラム)を書き込んでおきます。 書き込みが終わった状態で、シリアルモニタボタン(図6右上🔎ボタン)を押した状態が図7です。
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秒)待ちます }
図6:プログラムの内容
図7:シリアルモニタ
5. VBAでプログラム
PCには、図7の様にArduinoUNOから一秒間隔でシリアルデータを受信していますので、このデータをVBAから取得してみます。
5.1 空のモジュールを追加
VBAのマクロ(プログラム)を書く為の空のモジュールを「PERSONAL.XLSB」に追加します。
方法は図8の様に「標準モジュール」上で右クリック→「挿入」→「標準モジュール」をクリックします。
これでプログラムを書く為のモジュールが追加されました。
図8:標準モジュールの追加
5.2 プログラムを書く
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
'①初期設定
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の通り処理していませんので参考です。
③「データの受信」
A$ = ec.AsciiLine 'デリミタの手前までの受信文字列をA$に代入します.
EasyCommモジュールの「ec.AsciiLine」関数で、PCがArduinoUNOから受信したデータを取得し変数「A$」に代入します。
④「データの表示」
MsgBox A$
図10:図9マクロ実行結果
⑤「ポートを閉じる」
ec.COMn = -1 '終了処理
プログラムの最後には必ずEasyCommモジュールの「ec.COMn」プロパティに 0以下の整数を代入しポートを閉じます。
5.3 補足
励みになりますのでよければクリック下さい(^o^)/