2016年5月25日水曜日

NucleoF401REでQEIライブラリを使う。

QEIというQuadrature Encoderのライブラリがあったのでロータリーエンコーダーで使ってみた。

QEI:
https://developer.mbed.org/cookbook/QEI

Rotary Encoderと書いてあるが手で回すロータリーエンコーダーではなく、タイヤとかの回転角度・回転数を計測する用みたいだ。

手回しのロータリーエンコーダでも一応使える。

配線図

#include "QEI.h"

Serial pc(USBTX, USBRX);
//Use X4 encoding.
//QEI wheel(p29, p30, NC, 624, QEI::X4_ENCODING);
//Use X2 encoding by default.
//QEI wheel (p29, p30, NC, 624);
QEI wheel (PB_4, PB_5, NC, 624, QEI::X2_ENCODING);

int main() {

    while(1){
        wait(0.1);
        pc.printf("Pulses is: %i\r\n", wheel.getPulses());
    }

}

QEIクラスはピンの変化の検知に外部割り込み(InterruputIn)を使っていて、これがprivateなのでInterruptIn::mode()で内部プルアップの設定ができない。仕方がないので、ロータリーエンコーダーのA/Bピンをブレッドボード上でプルアップしている。

秋月で売っているAlpsのロータリーエンコーダーは1デテント(クリック感のあるところ)で数値が2個進む感じなので、QEI::X2_ENCODINGを指定するとデテント1個でPulsesが2つずつ増減する。(QEI::X4_ENCODINGだと4つずつ増減する)

624という指定は1回転数当たりのパルス数で、Exampleのデフォルトのままで特に意味は無い。

NucleoF401REの外部割り込み


mbed公式のInterrutptInのページを見るとmbed NXP LPC1768の外部割り込みで使えるピンの注意書きがあるが、NucleoF401REは16本の割り込みをPinに割り当てて使うようになっているようだ。

Port はバラバラでもいいが、Pin番号がかぶるとダメ。

参考:
http://letanphuc.net/2015/03/stm32f0-tutorial-3-external-interrupts/

STMicroelectronics RM0368 Reference manual

なので、紛れがないように今回はPB_4、PB_5に割り当てた。

ちなみにArduino Uno/ATMega328Pの外部割り込みは固定でINT0、INT1の2本しかない。

メモ:


QEIライブラリは手回しのロータリーエンコーダでも使えるが、使いにくいかな。