AE-TYBLE16をArduinoIDEで使う(JLinkなしでBluetooth接続まで)

# AE-TYBLE16 とは
先日、秋月で見つけた小型Bluetoothモジュールです。
https://akizukidenshi.com/catalog/g/gK-12339/

どうやら、Nordic社のnRF51822マイコンが搭載されており、
太陽誘電独自のファームウェアが書き込まれているらしいです。

太陽誘電独自のファームウェアを用いることで、UART経由でBluetoothを使うことができ、
Arudino(atmega328P)などと接続できるBluetoothモジュールとして使用できます。
参考記事：[小型 Bluetooth LE モジュール AE-TYBLE16とボタン電池でビーコンを作る](https://qiita.com/MypaceEngine/items/cc7ccbd799801735112b)

# なぜArduinoIDEで開発するのか
当初は普通にArduinoと接続して遊ぼうと思ったおり、
太陽誘電のサイトに登録してUARTの詳細仕様を取得しようとしたのですが、
会員登録がうまく進まず、詳細仕様が見れないという状況に陥ってしまいました。
(会員登録フォームがどう見ても企業向けで、自分のアドレスがgmailだからはじかれた?)

仕方なく、本来想定されていないと思いますが、ArduinoIDEを使ってAE-TYBLE16を使い倒そうと思います。

# 参考にさせたいただいたサイト
[秋月電子の BLE モジュール AE-TYBLE16 を Hack](https://qiita.com/nanbuwks/items/33c97adbde990161c098)

# 準備
この記事で使用するもの一覧

| 品名 | 購入先 | 説明 |
|:-----------|:------------|:-|
| AE-TYBLE16       | https://akizukidenshi.com/catalog/g/gK-12339/ |  今回の主役 |
| ST-LinkV2         |https://www.amazon.co.jp/gp/product/B084VMYNF7 | 書き込みのために必要です　amazonにはほかにも色違い
| USBシリアル変換器         |https://akizukidenshi.com/catalog/g/gK-14745/ |PCとUART接続を行うために使います。Arduinoなどで代用可。 |

その他、必要なもの(一般的なもの)
| 品名 | 説明 |
|:-----------|:-|
| ブレッドボード       | 回路作成のためには必須  |
| ジャンパ線      | オス-オス　メス-オス 両方必要です |
| はんだ付けセット | はんだ、はんだごて、錫メッキ銅線|
| LED | 今回は抵抗内蔵のLEDを使用しました|
| 適当な抵抗      | 1kΩ,3.3kΩ,10kΩ の三種類あれば大丈夫でしょう|
| WindowsのPC     | おそらく皆さん１台くらい持っているでしょう。ST-Linkをつなげるために、USB-Aポートが必要です。 |
| Androidスマホ | 正しくBluetooth信号が出ているか確認するためのものです|


使用するソフトウェア
| 名称 | ダウンロード先 | 説明 |
|:-----------|:------------|:-|
| ArduinoIDE      | https://www.arduino.cc/en/software | 個人的な慣れの問題でv1.8.19を使用しています |


# 作業手順
## ArduinoIDEをインストール
参考手順:https://www.kkaneko.jp/tools/win/arduinoide.html
## arduinoIDEにarduino-nRF5を導入
【概要】
AE-TYBLE16の内部モジュール「RF51822」のコンパイラを導入します。

【手順】
1. ArduinoIDEで「ファイル」メニューより「環境設定」を開き、「追加のボードマネージャのURL」に
「 https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json 」を追加する。
1. ArduinoIDEで「ツール」メニューより「ボード："Arduino Uno"(選択されているボードは異なる場合あり)」に進み
「ボードマネージャー」を開く
1. 「Nordic Semiconductor nRF5 Boards」のボードをインストールする。(今回はv0.7.0をインストールしました)
1. ボード一覧に「Nordic Semiconductor nRF5 Boards」が追加されるので、その中の「Generic nRF51」を選ぶ

## nRF5FlashSoftDeviceの書き込みの準備を行う
【概要】
SoftDeviceとはnRF51822マイコン向けのfirmwareのようです。
arduino-nRF5ではv130が対応しているので、このversionのものをインストールします。
【手順】
1. https://github.com/sandeepmistry/arduino-nRF5/releases/download/tools/nRF5FlashSoftDevice.jar
をダウンロードする。
1. C:\Users\ユーザー名\Documents\Arduino　フォルダ内に、tools\nRF5FlashSoftDevice\tool フォルダを作ります。
1. ダウンロードしたjarファイルを、
C:\Users\ユーザー名\Documents\Arduino\tools\nRF5FlashSoftDevice\tool\nRF5FlashSoftDevice.jar
の場所にコピーします
1. ArduinoIDEを再起動します。
1. ArduinoIDEのデバイスの設定を次のようにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/73fac314-df19-120f-e354-80e45b6f9910.png)

1. 「nRF5 Flash SoftDevice」ボタンを押す
すると、次のようなエラーが出ると思います。
```
Downloading 'https://www.nordicsemi.com/-/media/Software-and-other-downloads/SoftDevices/S130/s130nrf51201.zip' ...
Error while flashing SoftDevice.
java.io.IOException: Server returned HTTP response code: 403 for URL: https://www.nordicsemi.com/-/media/Software-and-other-downloads/SoftDevices/S130/s130nrf51201.zip
```
ArduinoIDE内からだとDLできないようなので、
ブラウザでエラー内のURL(https://www.nordicsemi.com/-/media/Software-and-other-downloads/SoftDevices/S130/s130nrf51201.zip )にアクセスし、手動ダウンロードします。
1. ダウンロードしたzipを解凍し、「s130_nrf51_2.0.1_softdevice.hex」を
C:\Users\ユーザー名\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\cores\nRF5\SDK\components\softdevice\s130\hex
フォルダにコピーします。
1. 再度、「nRF5 Flash SoftDevice」を選択します。「Error while flashing SoftDevice.」というエラーが出ますが、まだデバイスをつないでいないためなので、問題ありません。
# STLinkV2のドライバーをインストールする
https://www.st.com/en/development-tools/stsw-link009.html
にアクセスしてドライバーをダウンロードします。（会員登録が必要です）
ダウンロードができたら、展開し、「dpinst_amd64.exe」を実行します。

# AE-TYBLE16をPCと接続し、コードを書きこむ
【AE-TYBLE16に足をつける】
そのままではブレッドボードに差せないので、錫メッキ銅線等をはんだづけして、足を生やします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/447cfb71-411f-02dc-2350-9796eb7afae9.png)

【接続回路を作成する】
以下の回路図に従って、STLink-V2と接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/3be17979-bcdc-607c-b103-25bd12643ed1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/c986d324-c289-9d40-055a-c4a96eaa6abe.png)
▲書き込み回路はこんな感じ

【SoftDeviceを書き込む】
「nRF5 Flash SoftDevice」を選択し、書き込みを行います。

【Lチカを書き込む】
ArduinoIDEに以下のコードを入力し、書き込みを行います。
```
#define LED 4
void setup() {
  pinMode(LED,OUTPUT);
}
void loop() {
  digitalWrite(LED,HIGH);
  delay(1000);
  digitalWrite(LED,LOW);
  delay(1000);
}
```
無事にLEDが点滅すればOKです。

# Bluetoothを使ってみる
1. Arduino IDEで「スケッチ」メニューの「ライブラリをインクルード」「ライブラリを管理」　を開きます。
1. BLEPeripheralで検索
1. 表示された項目を選択し、Installを押す（今回はv0.4.0)を選択しました
1. スケッチ例からiBeaconを選択して開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/61ff7c2e-7dda-4047-b002-df1a3e5d78b4.png)

このままでも書き込みは完了しますが、Bluetoothは有効になりません。
これは外部クリスタルの周波数の違いに起因するもので、レジスタの値を書き換える必要があります。
参考：[AE-TYBLE16をHack](https://blueeyes.sakura.ne.jp/2021/04/23/3924/)

参考先に従って、
"C:\Users\ユーザー名\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\cores\nRF5\SDK\components\toolchain\system_nrf51.c"に、外部クリスタルの周波数を変更するコードを追加します。
```
void SystemInit(void)
{
    /* 既存コード省略 */

    /* =======ここから追加部分=========*/
    if (*(uint32_t *)0x10001008 == 0xFFFFFFFF)
    {
        NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
        while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
        *(uint32_t *)0x10001008 = 0xFFFFFF00;
        NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
        while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
        NVIC_SystemReset();
        while (true){}
    }
    /* =======ここまで追加部分=========*/
    SystemCoreClockUpdate();
}

```
この状態でArduinoIDEに戻り、書き込みを行います。

# Bluetooth発信確認
Bluetoothが正しく発信されているか確認するために、Androidスマホを使います。
「[nRF Connect](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=ja&gl=US&pli=1)」というアプリをインストールし、SCANを開始します。
次の画像のように、UUID=[a196c876-de8c-4c47-ab5a-d7afd5ae7127]のiBeaconが見つかれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/d7d2981b-2006-75d4-c171-660921274360.png)


# UART接続
ArduinoIDEで以下のソースコードをコンパイルして書き込みます。
```
#define LED 4
void setup() {
  Serial.begin(9600);
  Serial.println("TX test");
  pinMode(LED,OUTPUT);
}
void loop() {
  if(Serial.available() > 0) { 
    int data = Serial.read();
    Serial.println(data);
    if(data=='1'){
      digitalWrite(LED,HIGH);
    }
    if(data=='0'){
      digitalWrite(LED,LOW);
    }
  } 
  delay(10);
}
```

USBシリアル変換器とAE-TYBLE16を接続します。
今回使っているCH-340Eは5Vレベルなので、本来は3.3Vに変換しなければなりませんが、5Vのままでも動くのでヨシ！！　という考えていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/9de7667c-3321-bee1-9834-485f3a14a9cc.png)


接続出来たらArduinoIDEのシリアルモニタを開き、
ボーレート9600bpsを選びます。
そして、「1」や「0」と入力してEnterキーを押して、
LEDが点滅することを確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492269/7ba0f05d-aa35-e4d3-8517-1a649c32b00d.png)