2014/07/06

[ble][nrf51]S110をひもとこう (3) - button

では改めて。
SoftDevice v7.0.0 + nRF51 SDK v6.0.0の組み合わせで見ていこう。

といっても、動かしながら調べた方がわかりやすいと思うので、ひもとくというか、実践だな。


まずは、ボタン処理。
以前作った回路では、FeliCa Plugの搬送波検知によってLED点灯させるようになっている。
この「搬送波検知」は、ボタンのON/OFFと同じなのだ。
処理としては、こうやっている。

    while (true) {
        nrf_gpio_pin_write(PIN_LED, nrf_gpio_pin_read(PIN_RFDET));
    }

PIN_RFDET(GPIOのinput)を読んで、PIN_LED(GPIOのouput)に書き込んでいるだけだ。
これをwhileでやっているので、電気を無駄に使っていることだろう。
それに、そのままポート出力させているけど、実際にはチャタリング処理をやってやりたいところだ。

この辺りのことを、「button handling library」がやってくれそうである。
チャタリングって、debouncingっていうんですな。
GPIOTE Handlerを使えば良いらしい。TEは、Task Eventみたい。

 

と、nRF51 SDKのドキュメントには書いてあり、app_gpioteとかAPP_BUTTONとか書いてあるのだが・・・。
SDKのサンプルソースにあるgpiote_exampleでは、nrf_gpioteを使っている。
nrf_gpiote.hは「GPIOTE abstraction」らしい。抽象化したもの、か。
これはnRF51シリーズ内で抽象化している、ということかな。

nRF51を使うということはBLEを使うことになるし、BLEを使うということはSoftDeviceは組み込むことになる。
もうあれこれ考えず、S110限定で見ていこう。
そうやってサンプルを探すと、s110フォルダ内のものはだいたいAPP_BUTTON_INIT()を使っている。
これをまねすれば良いだろう。
まあ、やるならば、ble_app_templeteをコピーして、いるところだけ残していく方が賢いかも。

 

さて、まねをしてはみたものの・・・動かない。
イベントハンドラに飛んでくれない。
エラーになるわけでもないので、どこが悪いかよくわからん。
タイマがうまく動いてないんじゃないか、という気がするのだが、はてさて、どこから見ていくのが良いやら。

[追記:2014/07/07]
app_button_enable()が必要だった。
とりあえずFeliCa Plugではなく、タクトスイッチで試したところ、それでうまくいった。
nRFDETはプルアップだったのでそのまま使っていたのだが、ボタンはアクティブHIGHでつなげたので、それで安定せずに変な動きをしていたのだが、PULLDOWN指定することで意図した動きをするようになった。


そういえばSDK v6.0.0からmakefileが変わって、使うライブラリは自分でソースを追加してやらないといかん、と前に書いたけど、あれは勘違いだったな。
前からmakefileにはアプリ側で追加してやるようになっていた。
すまん、SDK...

1 件のコメント:

  1. 自分メモ:
    app_button_enable()を呼び出してみなさい。
    あと、nAN-36を読むがよい。

    返信削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。