ロータリーエンコーダは、ロボットの動きをとらえるのには大変便利な素子ですが、パーツ屋さんで見かけると、ちょっと買うのをためらってしまう程の値段で 売られていると思います。
今回は、車輪の回転方向と、おおよその回転数をカウントする簡単なロータリーエンコーダの 回路を紹介します。
回転数をカウントするには、お手頃なところでマウスを思いつくと思います。 ロボットコンテストでも、マウスをそのまま使ったり、マウスの中の回転子を取り出したりして 使っている様子を見かけました。
精度の面では、こちらの方が圧倒的によいと思います。ただ、設計段階から 組み込むことが決まっているならまだしも、作っている途中でどうしても必要になったのだが、 お金もない、時間もないというときには、(つくばロボコンの数日前によく見かける光景(笑)) そんなに手の込んだことはできないと思います。 ここでは、とりあえず回転数がとれる、回転方向が分かるものを作ります。
先に注意しておきますが、ここで製作するのはセンサの部分だけで、 回転数も回転方向もマイコンのプログラムで処理します。つくばロボコンでよく見かける日立「H8/3048」は、 元々この機能がマイコンに組み込まれていますので、 C言語からの呼び出し方法のみ紹介します。
Vcc=5[V]
(左:増幅回路二組、右:センサ二組を二段重ね)
上記の回路が二組必要です。
回路自体はそんなに難しいものではありませんが、センサ(写真右側)の取り付けで、 頭を悩ませると思います。二つのセンサが順番にON/OFFするように取り付ける必要があります。
センサ二組のそれぞれの出力をRA.0, RA.1に入力します。 これはあくまで一例です。
#include <3048.h> //サンプルメイン関数(この関数に限っては、実際に試してません) void main(void) { int i; init_h8(); init_rotencoder(); while (1){ //何らかのユーザ処理 i = _rotenc_get(); //回転数取得 //(正・反転により、カウント数が増減します) //何らかのユーザ処理 } } //H8初期化 void init_h8(void) { PA.DDR = 0xfc; //入力:ロータリーエンコーダ、出力:走行モータ } //位相係数モードの設定 void init_rotencoder(void) { ITU2.TCNT = 0; //カウンターをリセット。 ITU.TMDR.BIT.MDF = 1; //チャンネル2を位相計数モードに設定 ITU.TSTR.BIT.STR2 = 1; //カウント開始 } //距離の取得 unsigned int _rotenc_get(void) { return ITU2.TCNT; }