ロータリーエンコーダー (機械接点式インクリメンタル型) の信号をデコードするクラスです。 Rotary Encoder (incremental, mechanical switch type) signal decoder class.

RotaryEncoder.h

Committer:
tetsuya256
Date:
2014-09-07
Revision:
0:fcf360069f17

File content as of revision 0:fcf360069f17:

#ifndef RotaryEncoder_H
#define RotaryEncoder_H

#include <mbed.h>

#define RotaryEncoder_SamplingInterval 2000 // Sampling interval (us)

/**
 * ロータリーエンコーダー (機械接点式インクリメンタル型) の信号をデコードするクラスです。<br />
 * Rotary Encoder (incremental, mechanical switch type) signal decoder class.<br />
 * Copyright(C)2014 T.Hoshino<br />
 * <br />
 * CAUTION: My English is very poor, it might be wrong. (I rely on Google Translate almost.)
 * <ul>
 *  <li>コンストラクタに指定した2つのピンは「入力・内蔵プルアップ有効」に設定されます。外部プルアップは必要ありません。<br />
 *      Two pins that you specified in constructor parameter is set to "input, built-in pull-up enabled". There is no need for external pull-up.
 *  </li>
 *  <li>機械接点のチャタリングは、Ticker による2ミリ秒ごとのサンプリングで回避します。RCローパスフィルタは必要ありません。<br />
 *      This will debounced by software signal sampling. RC lowpass filter is not required.
 *  </li>
 *  <li>回転検出時は #attach で指定したコールバック関数を呼び出します。<br />
 *      Will invoke the callback function you specified in #attach method when detected rotation.
 *  </li>
 *  <li>回転方向はコールバック関数のパラメータで判別できます。右回りなら 1、左回りなら 0 です。<br />
 *      Can detect rotate direction in the parameter of callback function. If clockwise, It's 1. If counterclockwise, It's 0.
 *  </li>
 *  <li>以下のようなデバイスでの正常動作を確認しています。<br />
 *      It has been confirmed the correct operation of following devices.<br />
 *      http://akizukidenshi.com/catalog/g/gP-05651/
 * </ul>
 * @code
//----------------------------------------
// Sample code for ST Nucleo F401RE
//----------------------------------------
#include <mbed.h>
#include <AQM0802A.h>
#include <RotaryEncoder.h>

AQM0802A      lcd(D14, D15);  // I2C Character LCD
RotaryEncoder rotary(D8, D9); // <-- this!

// RotaryEncoder callback function
//   cw = 1:clockwise, 0:counterclockwise
void rotate(int cw) {
    static int value = 0;
    value += cw ? 1 : -1;
    lcd.cls();
    lcd.printf("%d", value);
}

int main() {
    lcd.printf("Rotary\n Encoder");
    rotary.attach(&rotate);
    while(1) {
        sleep(); // sleep() is optional
    }
}
 * @endcode
 * ご自由にお使いいただけますが、無保証です。使用は自己責任でどうぞ。<br />
 * The use of this is free, but no warranty. please use at your own risk.<br />
 */
class RotaryEncoder {
  public:

    /**
     * コンストラクタです。<br />
     * Constructor.<br />
     * ロータリーエンコーダーの信号線に接続されたピンを指定してください。<br />
     * Specify pins connected to the signal line of rotary encoder.<br />
     * どちらのピンも「入力、内蔵プルアップ有効」に設定されます。<br />
     * Both pins are set to "input, built-in pull-up enabled".
     * @param A Terminal A signal input pin.
     * @param B Terminal B signal input pin.
     */
    RotaryEncoder(PinName A, PinName B);

    /**
     * ロータリーエンコーダーの回転検出時に呼び出すコールバック関数を登録します。<br />
     * Register callback function to be called, when detect rotary encoder rotate.<br />
     * <ul>
     *  <li>ロータリーエンコーダーの信号サンプリングもここから開始されます。<br />
     *      Signal sampling of rotary encoder also starts from here.
     *  </li>
     *  <li>回転検出時は、回転方向がt時計回りならパラメータに 1 を、反時計回りなら 0 を渡してコールバック関数を呼び出します。<br />
     *      When detect rotation, Call the callback function with int parameter. If clockwise, parameter is 1. Otherwise(counterclockwise) 0.<br />
     *      コールバック関数の定義方法は、クラス概要のサンプルコードを参照してください。<br />
     *      How to define callback function, please refer to the sample code for class description.
     *  </li>
     * </ul>
     * @param callback 登録するコールバック関数。 Callback function to be registered.
     * @see #detach()
     */
    void attach(void (*callback)(int));
    
    /**
     * #attach で登録したコールバック関数を切り離します。<br />
     * Detach the callback function that was registered in #attach method.<br />
     * ロータリーエンコーダーの信号サンプリングも停止します。<br />
     * Also stop signal sampling of rotary encoder.
     * @see #attach
     */
    void detach();

  private:
    DigitalIn terminalA;
    DigitalIn terminalB;
    Ticker    tick;
    void smpling();
    void (*callbackFunc)(int);
};

#endif