BLE Nano とは

http://redbearlab.com/blenano/

技適が通ってる小さい BLE 組込みの ARM SOC です。

開発環境

とりあえず mbed のオンラインコンパイラを使っています。というのもライブラリのリンクとかでハマるのが嫌だったからです。が、そのうち platformio で gcc ベースの開発はしたいところです。

BLE Nano + ブレッドボード

(この写真は MK20 のピンヘッダのうち、USBコネクタ側のピン2つが立っておらずスルーホールのままなので見間違えないように気をつける必要があります。MK20 + BLE Nano のセットを買ったら最初からピンヘッダはんだ付け済みでこうなっていたので、セットで買ってる限りは問題ないと思いますが…)

MK20 という書きこみ装置に亀の子的に挿して開発ができるんですが、これだと単に書きこめるってだけで周辺回路が作れないので、ブレッドボードに接続します。

必要な接続がいまいちわかりにくいですが、以下を接続すれば良さそうです。

  • SWCLK
  • SWDIO
  • VDD または VIN
  • GND

加えて、デバッグするなら

  • TXD
  • RXD

VDD は 1.8〜3.3V、VIN には 3.3V〜13V となっています。要は VIN にはレギュレータがついていて、VDD は直接入力になっているようです。

GPIO の入力範囲は?

VDD + 0.3 が絶対定格。5V トレラントとかではないので注意が必要そう。MK20 は裏面のジャンパで 1.8V モードにできる。低い外部電圧を使いつつ開発したい場合は 1.8V モードにする必要がある。

定格とかはnRF51822のダウンロードページから、nRF51822-PS (nRF51822 Product Specification) をダウンロードして見ればわかる。

レジスタ一覧とかは同じくnRF51822のダウンロードページから、nRF51 RM (nRF51 Series Reference Manual) を見れば書いてある。

オンラインコンパイラでもvimで開発したい

moco 使うといいです!!! https://github.com/hotchpotch/moco

以下のようにするとよさそう

  • ~/.mocorc に mbed のアカウント情報を書いておく
  • mbed オンラインコンパイラでプロジェクトの雛形を作ってpublish
  • hg 経由で手元にもってくる
  • プロジェクトルートに .mocorc を置いて、platform とかを指定する
  1. トップ
  2. tech
  3. BLE Nano の開発 - ブレッドボード配線

BLE Nano + mbed で HID over GATT しようとして1日ハマっていたので記録しておきます。HID の問題というよりペアリングの問題です。

前提

OS X El Capitan 10.11.5(15F34)

HID over GATT は Battery Service と DeviceInformationService と HIDService を提供します。

Battery Service と DeviceInformationService は mbed の BLE_API に含まれています。これはどちらのどの characteristics も open link (ペアリングなしで全ての情報を得られる) で公開しています。

HIDService は BLE_HID というライブラリに含まれています。これの characteristics は暗号化必須になっています。

問題

OS X でどうしてもペアリングが行なわれず、HID サービスが全く見えない状態でした。

Anrdoid や Windows 10 では問題なくペアリングできました。

OS X での挙動を詳細にすると

  • Bluetooth 機器一覧にでる
  • 「ペアリング」ボタンがでる
  • デバイスとの接続はできる
  • 「接続中」のまま止まり、パスコードなどを訊かれない

デバイス側のデバッグログ的には

  • onConnect は呼ばれる
  • セキュリティ関係のコールバックは一切呼ばれない

で、かなりお手上げでした。

解明と解決

OSX ではどうやら、何らかの条件で open link な characteristics があると bonding を行おうせず限定的なアクセスになり、HID サービスが見えないようでした。

仕方ないので BatteryService.h と DeviceInformationService.h をコピーして中身を書きかえて、requireSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM) するように変えました。外部から変えるAPIがないので辛い感じです。

  1. トップ
  2. tech
  3. OSX + BLE で HID over GATT でペアリング(bonding)ができなくてハマった

BLE Nano + mbed での ADC の基準電圧は VDD の 1/3 になっています。当然ながら VDD が変動するケースではこの基準は受け入れられません。BLE Nano は性質的に電池駆動するケースも多々あるでしょうから、デフォルトでVDD基準なのは解せない仕様です。

mbed には基準を変更する API などがないので、自力で設定します。BLE Nano には内部バンドギャップリファレンスの 1.2V もあるので、これを使うようにします。

	NRF_ADC->CONFIG =
		(ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
		(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
		(ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
		(ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);

ADC_CONFIG_REFSEL_VBG がバンドギャップリファレンスを使うようにする部分です。あとの部分は元のままです。なお、アナログ入力側には1/3の分圧が入っています。

mbed のライブラリ側ではこれらのオプションを保持して ADC を行うようなコードに(今のところは)なっているので、AnalogIn 初期化後に一度設定すればずっと有効です。

備考:VDD の電圧を測りたい場合

VDD の電圧をADCしたい場合は、外部接続しなくとも INPSEL を ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling にすればできそうです。mbed 側では対応していませんが、現状の実装だと、CONFIG を書きかえてから、AnalogIn (なんでもいい) を read すればいけそうな雰囲気です。

備考:mbed 側の実装

TARGET_MCU_NRF51822 の analogin_api.c に実装があります。

    NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
                      (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
                      (ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling << ADC_CONFIG_REFSEL_Pos) |
                      (analogInputPin << ADC_CONFIG_PSEL_Pos) |
  1. トップ
  2. tech
  3. BLE Nano + mbed の ADC の基準電圧