赤外線距離センサーとエクセルVBAを用いた物体、生体の運動記録
Arduinoのシリアル信号をエクセルで読み取る方法。


実際の運動記録の様子(18秒くらいから動き始めます)。
上野公園のパンダの公開が楽しみですね。

エクセルを用いた運動記録

サイト閲覧者の方から、3次元の位置をリアルタイムに(連続して) 記録したい、という課題をいただきました(コメントありがとうございました!)。 今回は赤外線距離センサーを用いて0.1 mm、30 ミリ秒の分解能で 位置を記録するシステムを開発いたしました。 ArduinoからUSBを通じてパソコン(エクセル)にデータを記録します。 専門のシステムよりも圧倒的に低価格で位置の記録が可能となります。 高校や高専での基礎実験、ロボットや生体観察の学術研究等にご活用ください。 ページの最下部に「動作しないときのチェック方法」を追加しました。

全体の手順

システム構築と計測のための手順は以下の通りです。 ご不明な点はトップページからご質問ください。

  1. ArduinoをUSBでPCに接続する
  2. Arduinoにスケッチ(プログラム)を書き込む
  3. 赤外線距離センサーをArduinoに接続する
  4. パソコンでエクセルのプログラムを開く
  5. パソコンでArduinoのCOMポート番号と通信速度を確認する
  6. エクセルシートにCOMポート番号と通信速度を記入する
  7. 測定条件を決定してSTARTをクリックする

部品一覧

今回のシステムは以下のハードウェア/ソフトウェアから成り立っています。 Arduino(2000円程度)があれば赤外線距離センサーは500円くらいです。

これらを用いて、距離センサーのアナログ信号を Arduinoに入力し、そこからUSBを経由してシリアル通信で エクセルに距離のデジタル情報を送信します。 エクセルにてその情報を読み取り、グラフ化、記録する仕組みです。

赤外線測距モジュールについて

まずは赤外線距離センサーについて説明いたします。 データシートを読みますと入力は5 Vで、10-80 cmに対して、 距離に反比例した電圧を出力するようです。 今回は3つの係数を用いて、以下の式により電圧を距離に変換しました。 C1は読み取り値を電圧に変換するための係数です。(ArduinoのADコンバーターのは5 Vを10bit=1/2^10=1024で分割している) C2が距離の逆数と電圧の比例係数、C3は切片です。

測距センサーとArduinoの接続に関しては黒と赤が通常と逆転していることに注意が必要ですが、

となっています。黒、赤はそれぞれArduinoの5 VとGNDに接続します。 白はAnalog input 1(AI1)に接続して電圧を読み取ることといたしました。 YouTubeに掲載した動画ではLCD(液晶ディスプレイ)の基板を載せていますが、 PCでデータを読み取る用途には不要です。(動作確認のために使用しました。)部品数1点で回路は単純です。 赤外線センサーは受光部に空間的な広がりがあり、 反射光がどの位置に入ってくるかで 距離を測定する仕組みです。原理は簡単ですが、受光部の微細加工により、高い精度が出ますね。


センサー部分, IR distance sensor


LCDパネルを取り付けたArduinoと距離表示。Arduino equipped with LCD with a real time measured value of a distance
ここでは二つのセンサーを左右の向きに取り付けています。

Arduinoからのデータのシリアル通信

ここで読み取った値をシリアル通信するスケッチ(プログラム)を作成いたしました。 こちらから表示してコピーしてお使いください。 Arduinoの使い方は本サイトの他の記事などにありますが、簡単です。

MeasNを200回としたのは、読み取りのエラーを抑えながら、そこそこの時間分解能を得るためです。 Arduinoのアナログ入力では、1回の測定で約0.12 msec(ミリ秒)の時間がかかりますので 200回の平均値を得るのに25 msec程度が必要となります。趣味の範囲ではこの程度で十分ですよね。 科学研究等で速い測定が必要な方は、平均回数を下げても良いですし、高精度なAD変換を使うと良いかと思います。 シリアル通信の速度は19200bpsとしました。9600bpsでも1バイト文字が1秒に1200文字、0.1秒に120文字ですので 十分な速度かもしれません。この辺りは通信環境やPCの能力に応じて変更する必要があるかもしれません。 当然、Arduinoで通信速度を変更したら、エクセル上でも変更する必要があります。

読み取った距離のデータは
Serial.print(Distance1);Serial.print("C")
で送信していますので、例えば
13.26C
の形式で送信されます。これが13.26cmです。 空間分解能は約50 cmを1024に分割して測定しますので0.5mm程度です。 より高い分解能の測定にはArduinoのAD変換の基準電圧を3.3 Vに下げて、 電圧読み取り範囲を狭める方法があります。(5 Vが出力されることはありませんので。) また、12bitや16bitのADコンバーターを使用するのも良いかと思います。


エクセルでのシリアル情報の受信

IRdistance4-1.xls (フリーソフト版) からダウンロードしてください。申し訳ありませんが、 毎月のパスワードの入力が必要な設定となっております。 月ごとにパスワードを入力してご使用ください。 営利目的でのご使用のための パスワード解除、ソースコードの配布に関しましてはトップページからご相談ください。

今回もEasyCommを使用させていただき、 VBAプログラムを作成いたしました。

動作チェック

次回以降、YouTubeで公開しているパンダの単振動(Simple Harmonic Oscillation of a Panda)の記録を解析してみます。空気抵抗による減衰を含む単振動は少し複雑で面白そうですね。

(追記) 単振動の実験 において、空気抵抗による減衰を含む単振動を実験的に計測し、データを解析しました。


動作しないときのチェック方法

動作しないときに、誤りを見つけるためのチェック方法は以下の通りです。

@ArduinoとPCは通信できているか?

ArduinoのPCプログラムの「Serial Monitor」ボタンで 通信が確立していることを再度ご確認ください。

正しく通信できていれば、ここに 「13.25C18.26C20.24C」など、 「数値+C」が連続して、高速に表示されます。 (とても速いので、適当なところで、マウスで選択してコピーして確認してください。)


シリアルモニターのボタン。

A文字化け?通信レートは一致しているか?

上のSerial Monitorで文字化けがあるようでしたら、 通信レート(19200bpsなど)がエクセルとCOMポートで 一致していない可能性があります。
[コントロールパネル]→[システム]→[デバイスマネージャー]→[ポート(COMとLPT)]→[ポートの設定]として 正しいCOMポート番号と通信レートがエクセルに記入されているか、 Arduinoのスケッチの通信レート(サンプルでは19200bps)とパソコンのCOMポートの設定が一致しているか、 を確認してください。また、COMポートの設定では、ビットレート(19200)、データビット(8)、パリティー(なし)、ストップビット(1)、フロー制御(なし)としてください。


デバイスマネージャーからCOMポートの設定を読みだす。


パソコンでのCOMポートの設定。

Bパソコンと正しく通信できているのにエクセルで表示できない場合

Serial Monitorで文字化けが無いのにエクセルに 数値が表示できない場合には 通信レートを少し下げてみてください。 もちろん、(A)Arduinoのスケッチと(B)パソコンのCOMポート、(C)エクセル 3つを同じ値に変更する必要があります。

戸田システムウェア

ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2011,2013 TYK