小型 Bluetooth LE モジュール AE-TYBLE16 で LINE Things Starter してみる

<img src="https://qiita-image-store.s3.amazonaws.com/0/29906/687a51aa-e68f-be79-f840-72430c5549cf.jpeg" width=640>

## AE-TYBLE16 について

秋月電子通商で販売されている、超小型 (DIP16 300mil とほぼ同じ) の Bluetooth LE (BLE) モジュールです。
http://akizukidenshi.com/catalog/g/gK-12339/

中身は、Nordic の nRF51822 (BBC micro:bit とかと同じ) が使われていて、電源電圧も 1.6V からと、電池駆動には最適なモジュールとなっています。
何より、すごく小さい。色んな所に押し込めて、CR2032 とかで動かしてみたくなっちゃう大きさ。

ただ、AE-TYBLE16 で使われている 太陽誘電の EYSGJNAWY-WX というモジュールは、本来 UART を経由して使うものであって、単体でファームウェアを書き換えたりできるものではなさそうですね。

## nRF51822 + Arduino

このモジュールを使って、[LINE Things](https://engineering.linecorp.com/ja/blog/line-things-developer-trial/) 対応デバイスを作れたら面白いなと思って少し調べてみました。
できたら、お手軽に Arduino とか mBed で開発できるような環境が良いなと...

nRF51 が乗ってるということは、すでに [Arduino のボードライブラリ (arduino-nRF5)](https://github.com/sandeepmistry/arduino-nRF5) もあるし、ご丁寧にボード上に JTAG の端子まででているので、きっとできるんだろうなーと思ってたら、ありました。

[秋月電子の BLE モジュール AE-TYBLE16 を Hack - Qiita](https://qiita.com/nanbuwks/items/33c97adbde990161c098)

この通り動かしたら、あっさりLチカ出来てしましいました。

ちなみに、mBed 方面でも hack されているようで、こちらに結構詳しい情報が乗っています。

[TYBLE16 Module / Akizuki | Mbed](https://os.mbed.com/users/kenjiArai/notebook/tyble16-module--akizuki/)

### arduino-nRF5 + BLEPeripheral

しかしですよ、[BLEPeripheral というライブラリ](https://github.com/sandeepmistry/arduino-BLEPeripheral) を使って、BLE の電波を飛ばそうとしたら、一向に電波が飛んでくれないんですよ。
いろいろいじっているうちに、以下のことがわかりました

- HF クロックが 32MHz で、Nordic の評価ボードの 16MHz と異なる
- LF クロックは外付けクロックは乗っていないので、内部 RC オシレーターを使う
- Nordic のチップは SoftDevice と言われる BLE スタック＋いろいろを使うことができるが、バージョンが S130 じゃないと BLEPeripheral の bonding がうまく動かない

まあ、躓いたのはこのあたりで、これらをちゃんと設定してあげたら、無事に Arduino で BLE の電波を飛ばしてスマホからつなぐことができるファームウェアを書くことが出来ました。

以下に、動いた感じの動画があります。
https://twitter.com/hktechno/status/1078175674311925760

ちなみに、nRF51822 なので、RAM は 32kB で Cortex-M0 なので結構非力です。
BLE で強力なことやりたい人は、nRF52 系のモジュールとか ESP32 を使うことをおすすめします。

## Arduino-nRF5 + BLEPeripheral を動かすまでの手順

**⚠注意** 以下の手順を行うと、初期状態で書き込まれていたオリジナルのファームウェアに戻すことは出来ません。

### 必要なもの
- Segger J-Link (一度 UICR の設定をしたあとは ST-Link でも可)
- [nRF5x Command Line Tools](https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF5-Command-Line-Tools)

### Board Settings
- Board: **Generic nRF51**
- Chip: **32 kB RAM, 256 kB flash (xxac)**
- Low Frequency Clock: **RC Ocillator**
- SoftDevice: **S130**
- Programmer: **J-Link**

### SoftDevice の書き込み
ボードマネージャーから、[arduino-nRF5](https://github.com/sandeepmistry/arduino-nRF5) をインストールして、GitHub の README に乗ってる手順通りに `nRF5FlashSoftDevice.jar` を導入します。

しかし、エラーになって書き込めないはずなので、[Nordic のサイト](https://www.nordicsemi.com/Software-and-Tools/Software/S130/Download) から S130 の SoftDevice をダウンロードしてきて、中身の `s130_nrf51_2.0.1_softdevice.hex` を `~/Library/Arduino15/packages/sandeepmistry/hardware/nRF5/0.6.0/cores/nRF5/SDK/components/softdevice/s130/hex` に入れてください。

そうすると、Arduino のツールから SoftDevice が書き込めるようになります。Bonding が必要な場合 (LINE Things の場合必須) は、必ず **S130** を使ってください。

### UICR の設定
AE-TYBLE16 は、前述の通りクロックが開発ボードと違うので、UICR を書き換えておく必要があります。

- `nrfjprog -i` で J-Link のシリアル番号を取得して
- 以下のコマンドを実行 `nrfjprog --snr <serial_number> --memwr 0x10001008 --val 0xFFFFFF00`
    - Set HFCLK: XTALFREQ to 32MHz

これをしないと、Arduino で普通のスケッチは動くけど、BLE Peripheral を有効にしても正しく動かない状態になります。

## LINE Things Starter for AE-TYBLE16

以下の GitHub に置いておきます。README の手順に従って書き込むと、LINE Things Starter が動きます。
LED とスイッチが必要です。

https://github.com/techno/line-things-snippets/tree/master/tyble16/arduino

LIFF は、オリジナルの LINE Things Starter を使ってください。

https://github.com/line/line-things-starter

## さいごに

**⚠注意** 以上の手順を一度実行すると、最初に書き込まれていた UART で遊べるファームウェアに戻せなくなるので気をつけてください。

また、明らかに非正規の方法でファームウェアを書き換えているので、誰も何も保証してくれないので、自己責任で行ってください。

それでもよければ、楽しく Arduino IDE で BLE の開発ができます。
[LINE Things Developer Trial](https://developers.line.biz/ja/docs/line-things/) を使うと簡単にスマホ側のアプリも開発できるので、是非試してみてください。


## 追記 (2018/01/30)
<img src="https://qiita-image-store.s3.amazonaws.com/0/29906/6e5ee8e1-7bfd-9762-bc93-4de1d78162f3.jpeg" width=320> <img src="https://qiita-image-store.s3.amazonaws.com/0/29906/b0c942fe-0f6f-2f44-c41d-c2254ecd7c18.jpeg" width=320>

面実装用のユニバーサル基板を使って、ボタン電池 CR2032 で動作する LINE Things Starter 向けのボードを作ってみました。

スイッチ、LED、あと SOP-8 の温度計 IC を載せてみました。
デバッグ用のピンフレームも出したので、このままプログラムの書き換えができます。

この小ささで、BLE 通信ができるのはいろいろ用途が広がりそうです。