ホーム > 活動報告 > RC活動報告 > RC活動報告詳細

活動報告 No.20(2015.5.1)

 RCロガーシステムの作製をコツコツとやっています。すでに当グループの代表が無線ロガーシステムとその解析ソフトを 作製し評価を行っており、近いうちに紹介できるかと思います。そのロガーシステムは、ドライバーのステアリング操作とスロットル操作、車体のGと姿勢等を記録する 機能を有しています。信号処理にはArduinoを用いており、ステアリング操作とスロットル操作の記録にはパルス幅を取得する「pulseIn関数」を使用し、車体のGと姿勢 の記録には「AnalogRead関数」を用いています。これまでに、AnalogRead関数に関してはその実力(実行時間)を調査してきましたが、pulseIn関数に関しては 未だその測定精度を調査しておりませんでした。そこで今回はpulseIn関数の精度について調査し、結果をまとめます。

pluseIn関数とは

 pulseIn関数は、ピンに入力されるパルス(HIGH or LOW)の時間幅を測定する関数です。たとえば、パルスのHIGH状態を測定すると設定した場合、pulseIn関数は入力がHIGHに変わると 同時に時間の計測を始め、またLOWに戻ったら、そこまでの時間をマイクロ秒単位で返します。タイムアウトを指定した場合は、その時間を超えた時点で0を返します。この類の測定には 、ピンの状態を常に監視する必要があり一般的には割り込み制御と測定を併せて行う必要があるのですが、このpulseIn関数はその二つを単純な命令で行えるため非常に便利です。 Arduino日本語リファレンスによると「この関数で計測可能な時間は、経験上、10マイクロ秒から3分です。あまりに長いパルスに対してはエラーとなる可能性があります。」 となっていますが、実際のところ測定できたとしてもその精度(特に小さいパルス幅の場合)はどの程度なのでしょうか?

パルスジェネレータの準備

 実際に検証するには、パルスジェネレータを本来用いるべきなのですが筆者の家にはそのようなものがないので今回はArduinoをパルスジェネレータとして用います。 ということで、まずはArduinoが生成するパルスの精度(スケッチで指定したパルス幅と実際のパルス幅の差異)を把握しておきます。パルスの発生は、digitalWriteで出力ピンをHIGH・LOW・HIGH…と 切り替えていきます。パルス幅はdelay関数を用いて調節しました。パルス幅の測定はUSBオシロで行いました。
 測定結果を右に示します。設定パルス幅が小さい場合、Arduinoが生成するパルス幅(実際のパルス幅)との誤差が大きくなっています。設定パルス幅が1ms以上の場合ならば、 誤差は1%以下であり、RCのPWM制御用とで使用するには問題なさそうです。次に行うpulseIn関数の精度測定にて使用する場合には、USBオシロで測定した実際のパルス幅と の比較をしていきます。

pulseIn関数の測定精度

 実際にパルスをpulseIn関数で測定した結果を右に示します。パルス幅に対して測定誤差は最低でも約1%は生じてしまうようです。また、パルス幅が100μs以下の場合は パルス幅が小さくなるに従いその測定が差は大きくなる傾向にありました。RCのステアリング操作におけるPWM信号の周期は15ms、パルス最小幅は1ms、スロットル操作におけるPWM信号の周期は15ms、 パルス最小幅は1ms(参考:RC活動報告 No.18)であるため、pulseInの測定精度は1%の誤差に収まりそうです。ロガーとして使用するには問題のない性能と判断します。 ただpluseIn関数実行時、スケッチ上の次のシーケンスは実行されないため、大規模な処理とpulseIn関数を1つのArduinoで実行することは避けるべきです。
 次回は実際にpulseIn関数を用いてRCのステアリング操作およびスロットル操作をモニタリングしてみます。

-おわり-

参考図書

  • 特になし

ページの先頭へ戻る

inserted by FC2 system