小型 Bluetooth LE モジュール AE-TYBLE16とボタン電池でビーコンを作る

#概要
太陽誘電のBLEモジュール[EYSGJNAWY-WX](https://www.yuden.co.jp/jp/product/category/module/EYSGJNAWY-WX.html)を搭載したAE-TYBLE16をArduinoモジュールとして使い、ボタン電池で動くビーコン化します。ビーコンの形式はEddystoneおよびiBeaconです。
<img width="1036" alt="IMG_20190304_005832.png" src="https://qiita-image-store.s3.amazonaws.com/0/354086/d4a8ef7b-29c3-6734-4071-cbf0022a30dd.png">

ビーコンを受信して、入退室を検出するプログラムに関しては[ビーコンを用いて入退室をチェックする簡単なプログラム](https://qiita.com/MypaceEngine/private/ad15135d3734a0377b55)を参照してください。

#参考資料
[秋月電子の BLE モジュール AE-TYBLE16 を Hack](https://qiita.com/nanbuwks/items/33c97adbde990161c098)
[TYBLE16 Module / Akizuki - Mbed]
(https://os.mbed.com/users/kenjiArai/notebook/tyble16-module--akizuki/)
[小型 Bluetooth LE モジュール AE-TYBLE16 で LINE Things Starter してみる]
(https://qiita.com/hktechno/items/f594f87493fbe11de3fb)
[Arduino Core for Nordic Semiconductor nRF5 based board]
(https://github.com/sandeepmistry/arduino-nRF5)
[eddystone-uid]
(https://github.com/google/eddystone/tree/master/eddystone-uid)
[arduino-BLEPeripheral]
(https://github.com/sandeepmistry/arduino-BLEPeripheral)
#ハードウェア
| ハードウェア             | 説明 |    リンク    |
|:-----------------|:---------------------|:------------------|
| AE-TYBLE16       |           BLEモジュール|    http://akizukidenshi.com/catalog/g/gK-12339/|
|ブレッドボード|AE-TYBLE16の設置に使用します|http://akizukidenshi.com/catalog/g/gP-05294/|
|ジャンパーワイヤ|ブレッドボードと後述のJ-Linkをつなぐのに使用します|http://akizukidenshi.com/catalog/g/gP-02932/|
|連結ソケット(両端オスピン)16P|AE-TYBLE16をブレッドボードに設置するのに使用します。ただ不安定です|http://akizukidenshi.com/catalog/g/gP-00265/|
| J-Link EDU mini       |  AE-TYBLE16への書き込みに使用します。|    https://www.marutsu.co.jp/pc/i/26595451/|
| 3.3V電源      |  J-link EDU miniは電力供給機能を持っていないため、電源として利用します。|私はST-Linkを電源として使いました。<BR>https://www.banggood.com/ja/3_3V-5V-XTW-ST-LINK-V2-STM8-STM32-Simulator-Programmer-Downloader-Debugger-With-20cm-Dupont-Wire-p-1177014.html?utm_source=direct&utm_campaign=none_prdshare_twit<BR>下記を用いて、USBの5Vから3.3V変換をする方式でもよいと思う。<BR>http://akizukidenshi.com/catalog/g/gK-06656/<BR>http://akizukidenshi.com/catalog/g/gK-09980/ |
|ボタン電池基板取付用ホルダー（ＣＲ２４７７用）|ボタン電池フォルダ|http://akizukidenshi.com/catalog/g/gP-09412/|

#ソフトウェア
| ソフトウェア             |                   説明 |    リンク    |
|:-----------------|----------------------:|:------------------:|
| Ardiuno IDE       |  ファームウェアの作成と書き込みに使います。|    https://www.arduino.cc/en/main/software|
| nRF5 Command Line Tool      |  ファームウェアの作成と書き込みに使います。|    https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF5-Command-Line-Tools|
|Arduino Core for Nordic Semiconductor nRF5 based board|Arduino化に使用します。|https://github.com/sandeepmistry/arduino-nRF5|

#開発環境の作成
Windows/日本語でのやり方をこのページでは記述する。[Arduino Core for Nordic Semiconductor nRF5 based boards](https://github.com/sandeepmistry/arduino-nRF5)のInstallingに書かれている手順のままである。
1. Arduino IDEを[ダウンロード](https://www.arduino.cc/en/main/software)して、インストールして起動する。
2. ファイル-環境設定を開く
<img width="497" alt="Preference.png" src="https://qiita-image-store.s3.amazonaws.com/0/354086/cbc8f4b1-2cc9-d8d8-4745-147ff88541a4.png">
3. 追加のボードマネージャのURLに下記を追記する。
https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json　
<img width="416" alt="PreferencePanel.png" src="https://qiita-image-store.s3.amazonaws.com/0/354086/263030f1-2f63-7799-b4d7-65e9001713a8.png">

4.ツール-ボード-ボードマネージャを選択
<img width="511" alt="BoardManager.png" src="https://qiita-image-store.s3.amazonaws.com/0/354086/0754a57f-c6bb-55fb-3f63-1b828b30f2ab.png">
5. Nordic Semiconductor nRF5 Boardsを入力して、インストールを押下
<img width="491" alt="BoardManager2.png" src="https://qiita-image-store.s3.amazonaws.com/0/354086/5573b4a4-4f7d-12b2-d22d-5820893eda64.png">
6. ツール-ボードからnRF5を選択
<img width="511" alt="BoardSelect.png" src="https://qiita-image-store.s3.amazonaws.com/0/354086/44f0e8d7-fa02-3878-7458-5cd913497988.png">
7. 下記のように設定
8. <img width="511" alt="nRF51setting.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354086/95b03c1b-0c0b-5323-5c8d-af5b2944476a.png">

#AE-TYBLE16のArduino 化
1. C:\Users\<Your User Name>\Documents\Arduinoの下にtools/nRF5FlashSoftDevice/tool/のフォルダを作る。
2. 1で作ったフォルダに[nRF5FlashSoftDevice.jar](https://github.com/sandeepmistry/arduino-nRF5/releases/download/tools/nRF5FlashSoftDevice.jar)をダウンロードしておく。
3. Arduinoを起動している場合は再起動。
4. ツール-書き込み装置でj-linkを選択。
5. 後述の配線図のように配線
6. ツール-nRF5 Flash SoftDeviceを押下。License Agreementが出るので読む。Accceptを押下する。ソフトデバイスのバイナリがボードに書き込まれます。エラーになる場合は、接触不良が考えられるので、配線を見直してください。

s130_nrf51_2.0.1_softdevice.hexがないといわれてエラーになったらhttps://www.nordicsemi.com/Software-and-Tools/Software/S130/Download#infotabs
からダウンロードし、C:\Users\<Your User Name>\Documents\Arduino\hardware\sandeepmistry\nRF5\cores\nRF5\SDK\components\softdevice\s130\hex
の下に置く

#配線

JLink Edu Miniのコネクタのピンアサインは下記。

<img src=https://www.segger.com/fileadmin/images/products/J-Link/Accesory/Adapters/J-Link_9-pin_Cortex-M_Adapter.png>
結線図
<img src=https://qiita-image-store.s3.amazonaws.com/0/354086/3d35ab31-2ce8-d40a-b7fd-8193a87e0a67.png>
![setting.png](https://qiita-image-store.s3.amazonaws.com/0/354086/5368f863-9c2d-aa8d-921c-ec6bbe87fe45.png)
左上の紫のものが3.3Vの電源として使用したST-LinkV2で右側の基盤がJ-Link EDU Miniです。

#BLE用ファームの作成
##BLEPeripheralのソース
下記を利用します。
https://github.com/sandeepmistry/arduino-BLEPeripheral

1.Arduino IDE上でスケッチ -> ライブラリをインクルード -> ライブラリを管理　のように移動
2. サーチボックスにBLEPeripheralと入力
3.表示された項目を選択し、Installを押す

##AE-TYBLE16の設定変更
**注意**　ビーコンにするのに必須の作業です。作業にはJ-linkが必要です。
[小型 Bluetooth LE モジュール AE-TYBLE16 で LINE Things Starter してみる](https://qiita.com/hktechno/items/f594f87493fbe11de3fb)に書いてあるままです。
nrfjprog -i 
で J-Link のシリアル番号を取得して、
nrfjprog --snr <serial_number> --memwr 0x10001008 --val 0xFFFFFF00　
を実行。

##Beaconのファームの作成
1. ビーコンの種類によって下記を選択してください。
iBeaconの場合：ファイル-スケッチ例-BLEPeripheral 
Eddystoneの場合：ファイル-スケッチ例-Eddystone-EddystoneUID
 
2. スケッチ-書込装置を使って書き込む　を実行してください。
書き込みに失敗した場合は、接触不良の可能性があります。配線をご確認ください。

#改造ファーム
[https://github.com/MypaceEngine/ae-tyble16-beacon-arduino.git](https://github.com/MypaceEngine/ae-tyble16-beacon-arduino.git)にソースをアップしてあります。下記の処理が追加されています。
- 1sごとにビーコンのパケットが出るようになってます。iBeaconの場合は100msごとに出すのが規格になってます。
- 後述の基盤にて、ビーコンパケットが出た瞬間にLEDを光らせるため、6番ピンをビーコン発信中はHIGHにしています。

省電力を強化したい場合などは、[BLE/iBeacon 消費電力ハック](https://qiita.com/ksksue@github/items/0811fd62bd970fa93337)をご参照ください、


#Beaconの出力状態の確認方法
スマホのアプリをお使いください。たとえばAndroidの場合は[Beacon Scanner](https://play.google.com/store/apps/details?id=de.flurp.beaconscanner.app)をお使いください。

#iBeaconについて

Appleの[Get Start with iBeacon](https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf)のDevices with iBeacon Technologyを参照すると”you will need to obtain a license from Apple.”と書いてあります。よって自由にiBeaconを作って運用することは難しいです。
発行者を決定するために発行する必要があるUUIDは[NSUUID](https://developer.apple.com/documentation/foundation/nsuuid)を参照するとRFC 4122 version 4 準拠と書いてあります。よって試作段階では[uuidgenerator](https://www.uuidgenerator.net/version4)を利用して発行すればよいと考えられます。UUIDは発行者ごとに1つ取得し、ビーコンの個体ごとにMajorおよびMinorを採番して割り当てることになります。

#Eddystoneについて
[Eddystone](https://developers.google.com/beacons/overview)はオープンソースであり、iBeaconよりも自由です。
iBeaconのUUIDにあたるnamespaceの仕様に関しては[Eddystone-UID](https://github.com/google/eddystone/tree/master/eddystone-uid)を参照してください。UID Constructionの章によると、所有しているFQDNをSHA-1でハッシュして、先頭の10バイトをNameSpaceとして使用することを推奨されています。[Google Cloud Console](https://console.cloud.google.com/home/dashboard)上でGoogle App Engine用のアドレスを取得することができるので、そのアドレスをSHA-1でハッシュして使用したらよいと思います。iBeaconのMajor/MinorはEddystoneのInstance IDです。個体ごとに自由に割り振ってください。所有するビーコンの管理用に[Google Beacon Console](https://developers.google.com/beacons/dashboard/)を使用できるのも便利です。


#ボタン電池とAE-TYBLE16の連結
ボタン電池の容量に関しては[ここ](https://industrial.panasonic.com/jp/products/batteries/primary-batteries/lithium-batteries/coin-type-lithium-batteries-cr-series)を参照。
CR2477が公称容量1000mAhでボタン電池としては最大容量です。
<img src=http://akizukidenshi.com/img/goods/2/P-09412.JPG>
真ん中がマイナス、外縁部がプラスです。AE-TYBLE16とつなげば、お手製のビーコンの出来上がりです。お疲れさまでした。

#専用基盤で実装したい人へ
##概要
以下にCR24XXのボタン電池用の専用基盤をKicadで作って、置いておいておきました。PCBGOGOなどにご発注ください。
https://github.com/MypaceEngine/ae-tyble16-beacon
![103786.jpg](https://qiita-image-store.s3.amazonaws.com/0/354086/ba97562a-869b-ace3-9fe4-77598b1a76ce.jpeg)

下記の部品をお使いください。

| 部品       |       用途 |    利用した部品のURL    |
|:-----------------|------------------|------------------|
| スルホール用テストワイヤ |この基盤にファームを書き込むのに使用しました| http://akizukidenshi.com/catalog/g/gC-09830/|
| R1             | LEDを点灯するのに負荷として使用します。3KΩ～3.3KΩで十分だと思われる。 |https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-0EUE        |
| D1             | LEDとして使用します。 |        http://akizukidenshi.com/catalog/g/gI-09636/        |
| ストラップ             |基板にストラップ穴に使用します。|ダイソーで買いました。|
| ボタン電池ホルダ             | ボタン電池を実装するのに使用します。 |       http://akizukidenshi.com/catalog/g/gP-09411/ <br> http://akizukidenshi.com/catalog/g/gP-09412/ <br> http://akizukidenshi.com/catalog/g/gP-09413/        |

##組み立て順序
1. 基板にAE-TYBLE16をはんだ付け
2. スルホール用テストワイヤでJ-Link(またはST-Link)と接続
3. Arduinoのソース上でiBeaconの場合はUUID/Major/Minor、Eddystoneの場合はnamespace id/instance idを個体ごとに設定し、AE-TYBLE16へ焼きこみ
4. LEDが1秒周期で光っているのを確認し、スマホでビーコンの出力を確認
5. ボタン電池ホルダを半田付け

##完成イメージ
![IMG_20190309_1810301.png](https://qiita-image-store.s3.amazonaws.com/0/354086/74e4031a-aa13-4a33-5c33-0d95c619a12b.png)