秋月に太陽誘電のBLEモジュール AE-TYBLE16 が販売されています。このモジュールは端子が底面からのみ出ているので、基板実装をしないと扱いづらいのですが、秋月がその基板実装を行った状態で販売しているので非常に扱いやすくなっています。
このモジュールは中のnRF51822に対してあらかじめファームウェアが書き込まれており、電源が入ると独自のサービスを飛ばします。UARTで適切なコマンドを入力すると、その中のキャラクタリスティックにデータが送りこまれると聞いています。
この秋月モジュールは電源・GPIOに加えてSWDIO・SWDCLKが出ているので、JLink等のライターを使用すると自分で作ったファームウェアに置き換えられます。
ファームウェアの書き込み
Before
After
J-LINKから書き込むにあたって、最低限次の配線接続があれば動作します。
- SWDIO
- SWDCLK
- リセット
- Vref
- GND
20ピンJ-LINKだと、これに加えて5V供給とUSB-UART変換が使えるのでそれもつないでいます。5V供給をLDOで3.3Vに落とすとモジュール電源とVrefに使えるので、外部電源を容易せずともデバッグができるようになります。当初はブレッドボードにワイヤーを刺していましたが、持ち運びがめんどうなのでユニバーサル基板に実装しました。配線がつながった状態でnrfjprogをつかうと書き込みができるようになります。
nRF5 SDKのサンプルコードを動かす
今回はゲームボーイのカセットに組み込みたいので、nRF5 SDK 12.3.0のうちHID over GATTのマウスサンプルを使いました。
ble_app_hids_mouse/pca10028/s130/armgcc でmakeを実行するとビルドはできますが、サンプルの前提となっている環境と AE-TYBLE16 で異なる箇所があるのでそのままでは動きません。下記を修正しました。
sdk_config.h
components/boards/pca10028.h
#define NRF_CLOCK_LFCLKSRCの中身を直す
RTCはモジュールに載っていないので、nRF51822内蔵を使うようにします。
components/toolchain/system_nrf51.cとsystem_nrf51422.c
16MHzを32MHzに変更します。
#define __SYSTEM_CLOCK (16000000UL)→(32000000UL)
ここまで直してNRF_LOGの中身がJLinkRTTのなかに表示されるようになります。APP_ERROR:ERROR:Fatalとだけ表示されるので、マイコンは動いていますがアプリは止まっています。
main.c
ble_stack_initのクロック設定を直します
nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;の行は削除。かわりに
nrf_clock_lf_cfg_t clock_lf_cfg;
clock_lf_cfg.rc_ctiv = 16;
clock_lf_cfg.rc_temp_ctiv = 2;
clock_lf_cfg.source = NRF_CLOCK_LF_SRC_RC;
clock_lf_cfg.xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM;
を追加。
ここを直すとJLinkRTTにAPP:INFO:HID Mouse Start!というメッセージが表示されて、BLEの電波も飛ぶようになります。
直したけど関係なさそうな箇所
接続はするがペアリングはされない、という状況が起きていて、こういう投稿があったので試してみたら動いたんですが、このブログを書くにあたって再度いちばん最初の段階からやり直してみたら、この変更なしでもペアリングが済んでいて頭を抱えています。