HOME >> 鉄道模型実験室 > ロータリエンコーダを使ってみた その2

鉄道模型実験室 No.279  ロータリエンコーダを使ってみた その2

 以前から注目していたロータリエンコーダについて、触ってみることにしました。使い方やArduinoでの処理の方法などを学び、何に使えるのかも考察することにしよう。今回は、その1に引き続き実際の実験結果を報告します。

 

■ ロータリエンコーダでのデータ取得方法

 回転速度を計測する方法として、発生しているパルスをカウントして行けば簡単に測定できると考えていた。しかし、それは回転数が一定速度で回転している場合の話である。自分が今まで測定してきたのは、とりもなおさず、この静的状態での静特性としての回転数だったのである。ある時間内のカウント数を計測して、カウント/時間で計算すれば良いのである。

 この時、測定する時間を決めておくか、あるいはカウント数を決めておけば、次々と回転数を測定出来るのである。今まではカウンタICを使って、回数指定を方法による測定を実施してきた。

     **************************************************

 今回は、このカウンタIC の代わりにArduino 自身でカウント作業を実施する必要があるのです。その方法とは、発生したパルスをインクリメンタル方式で次々に加算してカウントを実施するが、その時に割込み方式を使うことで、プログラム内での作業とは独立したタイミングがカウントすることが実施できるある。

 その様子は先回紹介したとおりであるが、メインループのサイクルタイムとシリアル通信のボーレート(Baud Rate)の関係を知っておく必要があり、さらに受信記録の方法も検討しておく必要があることが分かった。

 今回は変化する回転状態を計測しようと欲張っているので、ミリ秒オーダーでの計測にも挑戦しようとしています。そこで、考慮すべき事項をリストアップしました。

  1. パルスカウントは、割り込む処理にてインクリメンタルされていくので、タイミングとは関係しない。
  2. インクリメントされたカウント数を読みに行く時のタイミングは指定出来る。この時の時刻とカウント数をセットとしてデータを送信させる必要がある。
  3. この処理のためにはある時間が必要だが、delay 関数を使ってデータの読み取りと送信タイミングを調整できる。
  4. 送信タイミングとシリアルの通信速度の関係も考慮しておく必要がある。
  5. シリアル通信の受信側でも、受信タイミングを指定できるが、通信バッファの容量を考慮しておかないと、バッファがあふれてデータが破棄される恐れがある。
  6. データとしてセットとした時刻とカウント数はどちらむデジタル値なのでる。小数点以下のアナログ値は切り捨てられていると考えておくこと。例えば、10と言うデータは、10.005 だったかも知れないし 10.99 だったかも知れないのである。

 何を問題にしているのか理解できないと思いますので、実際の計測データを使って説明しましょう。

 

● 計測データの処理例

 解析したデータは、先回報告したボーレートが 115200 bps の場合のデータを使用しています。

  1. まず、シリアルモニタのデータをコピー/ペーストによってデータをExcel に張り付ける。下に示すのExcel シートのB、C、D 行である。t1 が時刻を、value がカウント数を示している。
  2. まず最初に、送信されてくるタイミングを調べるために、冲1 として前の行のt1 との差を計算させた。その平均を先回の解析グラフに適応させたである。この場合、delay(20) として設定しており、その時の送信タイミングは、平均して 20.69msec であったことを示している。
  3. 次に、同様にしてカウント数である value の値の差分である况alue も計算した。H 列である。
  4. この値を時刻の差分冲1で割ると、単位時間内のパルスが分かる、I 列である。単位は、pulse/msec となる。
  5. この値を、ギヤドモータの出力軸に換算する。J 列である。計算式は、= J7*1000*60/12/75.81 で、単位はrpm となる。
  6. この値を右のグラフにプロットする。橙色のプロット点である。グラフよりバラツキの大きなデータである事が分かる。
  7. 次に、読み取り方法を工夫してみた。デジタル値の差分のバラツキを小さくする工夫である。
  8. L15欄に注目してください。時刻の差分冲1の取り方を、10個前のデータと比較するのである。デジタル値の値の誤差は1以内なので、比較する2個のデータより最大でも2以下のである。従って分母を大きく取ればそれだけ誤差の割合が少なるなるのである。
  9. 同様にカウント数につても同じ処理を実施し(M 列)、単位時間内でのパルス数(N 列)、回転数(O 列)に換算した。
  10. この値を右のグラフにプロットする。緑色のプロット点である。バラツキがズーと小さくなっている事が分かる。

 

 何だか誤魔化されたような方法であるが、時刻数値で割るときのサイズを大きくして誤差の割合を小さくしたのであるが、勿論欠点もあるのだ。この時間、即ち、186msec の間の変化状態を無視して、最初と最後のデータを使用しているだけである。でもこの処理を刻み時刻で実施しているので、データとしては指定時間ごとに測定しているように見えるのです。

 

● 余分な実験

 モータの回転数を一定に保った状態にて、メインループ内のdelay() の設定値を変えて実験しました。そのデータをExcel を使って上記のように処理し、下に示すようにグラフを作成しました。

 横軸がデータを取り込んだ時刻で、縦軸が計算した回転数です。データの表示具合を優先させたので、軸の表示単位がバラバラですがご容赦ください。

   *********************************************************************

      これらのグラフから何が分かるのでしょうか?・・・・・・・・・・頭を抱えて考え込んでしまいました。

 橙色のプロって点は、送信毎の時間刻みで計算したデータを示し、緑色のプロット点は10個前のデータとの差を計算して求めたデータを示しています。

物を測る場合には、対象物の100倍以上の分解能が必要である
 例えば、ほぼ 10cm の棒の長さを測る場合、1cm 目盛の物差しでは 9cm か、10cm か、11cm の数値でしか測定できません。 デジタルでの測定では人間の目のように中間状態を読み取れません。少なくとも100倍の分解能のある物差し(1mm 目盛のもの)が必要となるでしょう。これによって、9.9cm か、10.0cm か、10.1cm かどうかを判断出来るのです。

  1. 測定する場合に、物差しの分解能に注意すること。 delay(1)の場合では、冲1の値が 1 or 2 で、况alue の値は 2 or 3 だったのです。これでは無意味なグラフとなってしまいます。冲1の値が 1 or 2 では分解能が不適切という事ですね。
  2. パルスのようなデジタル値を測定する場合、どの状態を計測するのかを考える必要がある。
  3. 即ち、パルスが変化するタイミングを正確に測定することが求められるのである。
  4. あるいは、ある時間内のパルス数を計測する方法もある。この場合は、測定開始と終了時点で、パルスの変化タイミングとらえることが出来ないので、誤差を小さくするためには計測するパルス数を増やす必要がある。
  5. なお、データとして示していませんが、時間毎のパルスカウント数は確実に追って行けることも確認できました。また、回転方向は一定でしたの確認してせんが、測定データより判断できます。况alue の値がマイナスになれば反対方向に回転していることになります。

 デジタル値を扱う場合、これらの点に注意せよという事でしょうか。特に時間当たりの計算を必要とする場合には、時間刻みを吟味しておく必要があるようす。

 今回の場合、時刻データは

      t1 = millis();     //測定時刻を読む

で実施していますので、無理があったようです。

      t1 = micros();     //測定時刻を読む

にて、マイクロ秒単位で読み取る必要があったかもしれません。

 あるいは、静特性を測定する場合は、測定時間間隔を大きく取ってバラツキ誤差を小さくする工夫が必要であることも示しています。当然の常識ですね。 なお、時間と共に回転数が変化する状態を測定する場合は、上記のような誤魔化しは適用できませんので、時間刻みの分解能を上げるしかないと思います。

 

● 余分な実験の追加実験

 試しに、マイクロ秒単位で読取った場合の実験を追加してみました。実験方法は同じですが、t1 = millis() を t1 = micros() に変更しています。

    

    

 橙色のプロット点で示したデータのバラツキ具合に変化がありますが、測定精度としては充分ではないことが分かります。

 

■ まとめ

 今回の実験で得られた知見をまとめてみます・

  ************************************************

ページトップへ戻る  .


 2026/2/8