目次
CHF-GM12-N20モータのエンコーダの動作について、
こういうことなのかと腹落ちしたことを記録しておく。
CHF-GM12-N20モータについての日本語の説明なんかも少ないので、
日本語で調べる人の一助になれば幸甚。
1. はじめに
2. 課題
3. 考えたこと
4. おわりに
1. はじめに
エンコーダ付きCHF-GM12-N20モータを買いました。
エンコーダの使い方として下記を参考にさせて頂きました。
2. 課題
コードを眺めてなんとなく動くのはわかりますが、
void updateEncoder()
関数内でなんやかんやビットシフトしているのが何なのかよくわからないので、
モータ動作とビットの動きを考えた。
3. 考えたこと
エンコーダはHallセンサを2つ持っている。
センサの位置は回転軸に対して正対はしておらず、
下記の左図のような配置になっている。
AとBと置いておく。
AとBの間は若干近いので、右図のように回転中にAとBが両方ONする場所が存在する。
ここがミソ。
参考URLのコードでは、PinA, BはattachInterruptをMode "change"で割り込むように
定義されているので、0→1 or 1→0と遷移したときに割り込みが発生する。
また、encodedでAとBの状態を2進数表記している。
さらに、sumで前回のencode値と今回のencode値を同時に表記するようにしている。
踏まえて右回り時と左周り時でA,Bの割り込みが発生する際のencodeとsum値をシミュレーションする。
面白いもんで、回転の方向によってsumの値が見事に異なっている。
これによって、sumの値を見ればどっちに回転しているのかを判別することができる。
4. おわりに
各状態の遷移がユニークだからこうなるのはわかるんですが、
こうシンプルな実装でそれを表記できるのがとっても美しい。
なので忘れないように書いておくようにしたのでした。