2016年5月28日土曜日

Nucleo F401RE(mbed)でシーケンサーを作るつもりで入出力デバイスのテスト。


配線図
<追記:2016.05.30> 配線図のNokia5110とMorpho Headerの接続が間違っていたので修正 </追記>


ロータリーエンコーダー、タクトスイッチ(トグル動作、押し下げ検知)、可変抵抗(普通のPOTとアナログ・ジョイスティック)、LCD(Nokia5110)の組み合わせで、Nucleo F401REにつないでテストしてみた。

入出力デバイスだけのテストで、それ以外は何もしていない。

↓mbedはGitでソース管理できないようなのでmbedのやつを使ってみた。

https://developer.mbed.org/users/ryood/code/Nucleo_rtos_UI_Test/

ロータリーエンコーダー


Shinichiro Nakamuraさんが公開されているRotaryEncoderクラスを一部変更して使った。(mbedオンライン・コンパイラのインポート/ライブラリからインポートできる)

NucleoF401REではグローバルスコープで実体化した場合、Tickerクラスのattach_us()が失敗する(参考:「Nucleo F401RE(mbed)でDebouncerInライブラリを使う。」)ようなので、

    void setInterval(timestamp_t t) {
        ticker.attach_us(this, &RotaryEncoder::func_ticker, t);
    }

というメンバ関数を追加して後からattachできるようにした。

また、RotaryEncoderクラスのオブジェクトを2個作ると互いに干渉するので、void func_ticker()内でstaticで定義されていた「uint8_t code」をメンバ変数として定義するようにした。

タクトスイッチ


チャタリング対策にPinDetectクラスを使用。(参考:「Nucleo F401RE(mbed)でRotary Encoderとタクトスイッチのチャタリング対策」)

PinDetectクラスと同じ作者さんのDebouncerInクラスの違いは、ポーリングで使うか割込みで使うかの差だと思うが、PinDetectの方がイベント・ドリブンっぽいので(Visual Basicみたいな感じに書ける)PinDetectを使ってみた。

可変抵抗


このあいだ作ったAnalogInを移動平均するクラスを使った。(「mbedのAnalogInでPotentiometerの読み取り値のふらつきを抑える。」)

LCD


mbedのオンライン・コンパイラでNokia5110のライブラリはいくつか見つかるが、今回は「N5110」ライブラリを使った。前使った5110_Displayライブラリ(
参考:「Nucleo F401RE(mbed)でNokia5110を動かす。」)は直線を引くメソッド(その他もろもろ)がなかったので。

RTOS


ARMのRTOSのスレッドの扱いはよくわからないが、ものは試しでポーリングするところを別スレッドにして読み取りのタイミングを調整するようにしてみた。

分けたスレッドは4つ。

  • メインスレッド(LCD表示)
  • ロータリーエンコーダー読み取り
  • POT読み取り
  • Lチカ