HOME >> 鉄道模型実験室 > ロータリエンコーダを使ってみた その2
以前から注目していたロータリエンコーダについて、触ってみることにしました。使い方やArduinoでの処理の方法などを学び、何に使えるのかも考察することにしよう。今回は、その1に引き続き実際の実験結果を報告します。
■ ロータリエンコーダでのデータ取得方法
回転速度を計測する方法として、発生しているパルスをカウントして行けば簡単に測定できると考えていた。しかし、それは回転数が一定速度で回転している場合の話である。自分が今まで測定してきたのは、とりもなおさず、この静的状態での静特性としての回転数だったのである。ある時間内のカウント数を計測して、カウント/時間で計算すれば良いのである。
この時、測定する時間を決めておくか、あるいはカウント数を決めておけば、次々と回転数を測定出来るのである。今まではカウンタICを使って、回数指定を方法による測定を実施してきた。
**************************************************
今回は、このカウンタIC の代わりにArduino 自身でカウント作業を実施する必要があるのです。その方法とは、発生したパルスをインクリメンタル方式で次々に加算してカウントを実施するが、その時に割込み方式を使うことで、プログラム内での作業とは独立したタイミングがカウントすることが実施できるある。
その様子は先回紹介したとおりであるが、メインループのサイクルタイムとシリアル通信のボーレート(Baud Rate)の関係を知っておく必要があり、さらに受信記録の方法も検討しておく必要があることが分かった。
今回は変化する回転状態を計測しようと欲張っているので、ミリ秒オーダーでの計測にも挑戦しようとしています。そこで、考慮すべき事項をリストアップしました。
何を問題にしているのか理解できないと思いますので、実際の計測データを使って説明しましょう。
● 計測データの処理例
解析したデータは、先回報告したボーレートが 115200 bps の場合のデータを使用しています。

何だか誤魔化されたような方法であるが、時刻数値で割るときのサイズを大きくして誤差の割合を小さくしたのであるが、勿論欠点もあるのだ。この時間、即ち、186msec の間の変化状態を無視して、最初と最後のデータを使用しているだけである。でもこの処理を刻み時刻で実施しているので、データとしては指定時間ごとに測定しているように見えるのです。
● 余分な実験
モータの回転数を一定に保った状態にて、メインループ内のdelay() の設定値を変えて実験しました。そのデータをExcel を使って上記のように処理し、下に示すようにグラフを作成しました。
横軸がデータを取り込んだ時刻で、縦軸が計算した回転数です。データの表示具合を優先させたので、軸の表示単位がバラバラですがご容赦ください。






*********************************************************************
これらのグラフから何が分かるのでしょうか?・・・・・・・・・・頭を抱えて考え込んでしまいました。
橙色のプロって点は、送信毎の時間刻みで計算したデータを示し、緑色のプロット点は10個前のデータとの差を計算して求めたデータを示しています。
物を測る場合には、対象物の100倍以上の分解能が必要である。
例えば、ほぼ 10cm の棒の長さを測る場合、1cm 目盛の物差しでは 9cm か、10cm か、11cm の数値でしか測定できません。 デジタルでの測定では人間の目のように中間状態を読み取れません。少なくとも100倍の分解能のある物差し(1mm 目盛のもの)が必要となるでしょう。これによって、9.9cm か、10.0cm か、10.1cm かどうかを判断出来るのです。
デジタル値を扱う場合、これらの点に注意せよという事でしょうか。特に時間当たりの計算を必要とする場合には、時間刻みを吟味しておく必要があるようす。
今回の場合、時刻データは
t1 = millis(); //測定時刻を読む
で実施していますので、無理があったようです。
t1 = micros(); //測定時刻を読む
にて、マイクロ秒単位で読み取る必要があったかもしれません。
あるいは、静特性を測定する場合は、測定時間間隔を大きく取ってバラツキ誤差を小さくする工夫が必要であることも示しています。当然の常識ですね。 なお、時間と共に回転数が変化する状態を測定する場合は、上記のような誤魔化しは適用できませんので、時間刻みの分解能を上げるしかないと思います。
● 余分な実験の追加実験
試しに、マイクロ秒単位で読取った場合の実験を追加してみました。実験方法は同じですが、t1 = millis() を t1 = micros() に変更しています。


橙色のプロット点で示したデータのバラツキ具合に変化がありますが、測定精度としては充分ではないことが分かります。
■ まとめ
今回の実験で得られた知見をまとめてみます・
************************************************
2026/2/8