IoTトレーニングボードアオノドン

アオノドンというオープンハードウェアのIoTボードを作りました

![IMG_20180610_125542.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/27b7db2a-a1a4-6046-b818-5cac258147b6.jpeg)

標準では、MDBT42とプログラムピンだけしか付いてませんが、中華製格安モジュールなどを追加して機能が増やせるようになっています。

機能を追加するだけではなく削除した例です。
以下は本体＋フラッシュメモリ＋6軸ジャイロ（裏側）＋LiPoバッテリ＋充電端子＋フルカラーLEDにしたものを、サイズを切り詰めてみたものです。


![IMG_20180624_020458.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/6a4f5026-22f6-4eeb-bafb-e8de145b4782.jpeg)

# 電子工作キット

AKBONE リリース6 に採用してます。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/f545e0c3-2ba5-cfb3-b08f-108d4d73d257.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/f291e20a-c528-53ce-8be3-1334e10f9102.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/e5d916b7-a292-d309-1f0e-f98ef23f9d71.png)



# MDBT42

コアのモジュールとして台湾RAYTAC 社の MDBT42 を使っています。

特徴

- Nordic nRF52搭載 Nordic NRF52832 32MHZ
- Ram64KBytes Flash512KBytes
- 32MHzのクリスタル内蔵して、電源つけるだけで動作する
- アンテナが、チップアンテナ版とパターンアンテナ版の2種類がある
- GPIOが多い
- NFC機能付
- 安価であり、キットの素材として使いやすい
- シリーズバリエーションが多く有り、シリーズ内の他のモジュールに置き換えることで機能追加・コストダウン・小型化などが期待できます
- シリーズ内で、nRF52系統の小型なおかつ手はんだづけの可能なものとしてMDBT42を選択しています
- 技適通ってます

仕様書

http://www.raytac.com/download/MDBT42/MDBT42Q-Version%20F.pdf 
(Rev.F)



# Arduino開発環境の設定

BLEモジュール MDBT42
https://qiita.com/nanbuwks/items/d26447c0bfa28b1d05df
を基に、設定、動作確認を行います。

# アオノドン説明

ピン配置
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/444019c4-bd23-6290-b1ff-16493c147b88.png)

## アオノドン無印、アオノドン20180727ピン配置
GPIO（左から）
1,3,4,5,7,9,10,11
このうち、3,4,5はそれぞれAIN1,AIN2,AIN3として使えます。

I2Cモジュール(左から)
VIN,3V3,GND,0,30,6,8
として、ジャイロモジュールの
VIN,3V3,GND,SCL,SDA,CS,SA0
につながっています。

SPIモジュール部（左から）
GND,3V3,22,23,2,21,1
として、SPI OLEDモジュールの
GND,3V3,SCK,MOSI,RST,MISO,SCL
につながっています。

SPIフラッシュ部（ICピン番号順）
7,21,3V3,GND,23,22,3V3,3V3

として、SPIフラシュの
1(*CS),2(MISO),3(*WP),4(GND),5(MOSI),6(SCK),7(WP),8(VCC)
につながっています。

ST-LINKモジュール部（左から）
GND,SWDIO,3V3,SWCLK

マイクモジュール部(上から)
31,GND,3V3
また、31はAIN7として使えます。

USBシリアルモジュール部（上から）
N.C.(DTR),27(TX),26(RX),5V,GND,3V3
として、CP2102 USBシリアルモジュールの
DTR,RX,TX,5V,GND,3V3
につながっています。

面実装スピーカ部
4とGNDにつながっています


## アオノドン20180822ピン配置

GPIO（左から）
13,3,4,5,7,9,10,11
このうち、3,4,5はそれぞれAIN1,AIN2,AIN3として使えます。
また、9,10,11はオンボードLEDの緑、青、赤につながっています。（負論理なのでLowで光ります。）

I2Cモジュール(左から)
VIN,3V3,GND,12,30,6,8
として、ジャイロモジュールの
VIN,3V3,GND,SCL,SDA,CS,SA0
につながっています。

SPIモジュール部（左から）
GND,3V3,22,23,2,25,21
として、SPI OLEDモジュールの
GND,3V3,SCK,MOSI,RST,MISO,SCL
につながっています。

SPIフラッシュ部（ICピン番号順）
7,25,3V3,GND,23,22,3V3,3V3
として、SPIフラシュの
1(*CS),2(MISO),3(*WP),4(GND),5(MOSI),6(SCK),7(WP),8(VCC)
につながっています。


ST-LINKモジュール部（左から）
GND,SWDIO,3V3,SWCLK

マイクモジュール部(上から)
31,GND,3V3
また、31はAIN7として使えます。

USBシリアルモジュール部（上から）
27(TX),26(RX),5V,GND,3V3
として、CP2102 USBシリアルモジュールの
RX,TX,5V,GND,3V3
につながっています。

面実装スピーカ部
4とGNDにつながっています

追加モジュール配置場所

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/bf6fcb81-eb05-e7ec-2e9b-58b5410d5e25.png)

搭載可能な追加モジュール

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/04b4eb02-7e26-71a0-3dec-1fb2ea2a3d25.png)

回路図
![aonodon-eeschema.png](https://qiita-image-store.s3.amazonaws.com/0/139524/9733136c-bb21-db9e-9257-fddf5bf0969a.png)

# ST-Linkを接続して動作確認する


最低限は以下のようにして使います。


![IMG_20180708_141200.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/dfe033f6-48a3-f435-1fe2-3c20c65ebfea.jpeg)


マイク端子を使ってLチカをするコードです


![image](https://qiita-image-store.s3.amazonaws.com/0/139524/9a03016c-fa91-a6a1-ce41-26451101498f.png)

うまく書けたら上図のようなメッセージが出ます。（環境設定で「書き込み」を「より詳細な情報を表示する」にしています。）

抵抗付きLEDを差し込んで、動作確認します。


![IMG_20180708_142107.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/4bd266f9-62e1-8ea8-751b-99a386cb7d82.jpeg)

# サンプルプログラム

## GPIOピンでインプット

タクトスイッチを以下のようにすると、 GND と GPIO30 で ON/OFF します。

![IMG_20180708_151858.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/5935cab4-4d69-f1c9-8aae-856a4b166811.jpeg)

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/3107b2c1-5d23-901d-7d54-5b43265a0626.png)

## アナログインプット

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/cab4c601-01e9-cc67-f822-6d575813a0d5.png)


analogInPin = A1;

とありますが、A0~A7は以下のように定義されています。

AIN0 P0.02
AIN1 P0.03
AIN2 P0.04
AIN3 P0.05
AIN4 P0.28
AIN5 P0.29
AIN6 P0.30
AIN7 P0.31

この、AIN1 が ArduinoIDEだと A1, P0.03が ArduinoIDEだと3番のデジタルポートになります。




## シリアル通信

Generic nRF52を選ぶと、シリアルポートは以下のようになっている。

```

#define PIN_SERIAL_RX       (0) // P0.00
#define PIN_SERIAL_TX       (1) // P0.01

```
なので、以下のようにUSBシリアルモジュールと接続するとPCとシリアル通信ができる。

![IMG_20180725_014526.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/cd061fc9-d839-386f-d338-ee4910814a24.jpeg)



なお、写真のようにシリアル通信アダプタがアドオンできるようになっている。

このシリアル通信アダプタはCP2102を使った中華製の格安USBシリアルモジュール。地味にオススメ。
![IMG_20180725_014416.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/5557c349-5993-bdfd-dbfd-39e065b43b40.jpeg)


このようにして使う場合は、

(Arduinoフォルダ)/packages/sandeepmistry/hardware/nRF5/0.5.1/variants/Generic/variant.h 

を編集
(ちなみに、Windowsの場合のArduinoフォルダは c:\Users\(ユーザ名)\AppData\Roming\Arduino15\・・・の中にあります)


```

/*
 * Serial interfaces
 */
// Serial
// #define PIN_SERIAL_RX       (0) // P0.00
// #define PIN_SERIAL_TX       (1) // P0.01

// Serial for Aonodon
#define PIN_SERIAL_RX       (26) // P0.26
#define PIN_SERIAL_TX       (27) // P0.27

```

## I2Cを使う

アオノドンは、I2Cモジュールをオンボードで載せることができます。ここを使う場合は、シリアルの場合と同様にvariant.hを書き換えます。


```

/*
 * Wire Interfaces
 */
#define WIRE_INTERFACES_COUNT 1
/*
#define PIN_WIRE_SDA         (20u) // P0.20
#define PIN_WIRE_SCL         (21u) // P0.21
*/

// for aonodon

#define PIN_WIRE_SDA         (30u) // P0.30
#define PIN_WIRE_SCL         (12u) // P0.00

```
上記の例は20180822バージョンの例です。
SDA、SCLの割当はバージョンによって異なるので、この文書の前掲の「ピン配置」を参照して変更してください。
変更したら、以下のI2CScannerを実行します


```

// i2c_scanner
// from https://playground.arduino.cc/Main/I2cScanner
 
#include <Wire.h>
void setup()
{
  Wire.begin();
  Serial.begin(115200);
  while (!Serial);
  Serial.println("\nI2C Scanner");
}
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
  }
  Serial.print("Found I2C devices: ");
  Serial.println("nDevices");
  delay(5000);
}
```

実行すると、以下のように結果が返ります。

```

I2C device found at address 0x6B  !
Found I2C devices: nDevices
Scanning...


```

これは、GY-LSM6DS3 という6軸加速度センサモジュールをつなげた場合の例です。
0x6Bで認識しました。

## Neopixel系フルカラーLEDを使う

「スケッチ」-「ライブラリをインクルード」-「ライブラリを管理...」で

「Adafruit NeoPixel by Adafruit」 を検索してインストール。

「スケッチ例」-「Adafruit NeoPixel」-「simple」で、

```

#define PIN            6

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      16

```
↓以下に変更

```

#define PIN            3

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      1

```
 

## SPI OLEDを動かす

AVTOKYO 2017 BADGE で OLEDプログラム
https://qiita.com/lowlevel/items/bbdce97ee2faf4768de3

を元に、以下のようにしました。
ライブラリをインストール

- Adafruit GFX Library 
- Adafruit SSD 1306

スケッチ例から、

- Adafruit SSD 1306 - ssd1306_128x64_spiを呼び出す
- コンパイル
- #error ("Height incorrect, please fix Adafruit_SSD1306.h!");
- と出るので

（Arduinoフォルダ）/libraries/Adafruit_SSD1306 の Adafruit_SSD1306.h
の該当箇所を書き換える。

```

   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16
```

上記のように SSD1306_128_64 を有効にするとコンパイルが通るようになる。

まだ画面でないのでアオノドンのピンアサインに合わせて以下のように変更

```

// If using software SPI (the default case):
/*
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
*/
// software SPI ( AONODON Version -201807):
/*
#define OLED_CLK   22
#define OLED_MOSI  23
#define OLED_RESET  2
#define OLED_DC    21
#define OLED_CS     1
*/
// software SPI ( AONODON Version 20180822):

#define OLED_CLK   22
#define OLED_MOSI  23
#define OLED_RESET  2
#define OLED_DC    25
#define OLED_CS    21
```

![IMG_20180725_015453.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/d94d36ca-16bd-b31c-3acc-2c5cd2ca1c52.jpeg)

## BLE

Bluetoothを使うには、

- BLEライブラリを追加
- SoftDeviceを使用できるよう設定、
- SoftDeviceを書込
- 低速クロックを設定

する必要がある。

### BLEライブラリを追加


- 「ファイル」 - 「環境設定」 -  「追加のボードマネージャのURL:」 に" https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json" を追加
- 「ツール」 - 「ボード:・・・」 - 「ボードマネージャ...」 から、 "Nordic Semiconductor nRF5 Boards" をインストール


### SoftDeviceを使用できるよう設定

https://github.com/sandeepmistry/arduino-nRF5
ここにしたがって、

https://github.com/sandeepmistry/arduino-nRF5/releases/download/tools/nRF5FlashSoftDevice.jar をダウンロードして、

(Arduinoフォルダ)/tools/nRF5FlashSoftDevice/tool/に配置する。

Arduino開発環境を再起動。

### SoftDeviceを書込

nRF52の場合は、

> SoftDevice S132 v2.0.1 supports nRF52 in peripheral and central role. It is 112k in size.

を使う。
- 「ツール」 - 「Softdevice:・・・」 を 「S132」に設定
- 「ツール」 - 「nRF5 Flash SoftDevice」 を実行

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/a36b4750-534f-7fb9-6b43-bb8f07b41942.png)

以下のように書き込めればOK

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/54127194-10ba-5e38-6e90-4102d8729bbb.png)


### 低速クロックを設定

- 「ツール」 - 「Low
- 　Frequency Clock:"」を「synthesized」に設定

## サンプルプログラムを動かしてみます。

https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/starter/starter.ino


母艦(Ubuntu16.04)のBluetoothインターフェースで検索してみたが見つからない
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/1398a74d-a372-090b-3119-ff97154dce8c.png)

ふと、こちらのアプリを試してみた。
![Screenshot_20180725-133050.png](https://qiita-image-store.s3.amazonaws.com/0/139524/e21cf73c-f64d-b462-6bd8-cbfc29019aab.png)


インストールして使ってみる

スキャンすると出てきた
![Screenshot_20180725-133627.png](https://qiita-image-store.s3.amazonaws.com/0/139524/1d9d0032-d957-5787-0f8e-cdb172b3dbbc.png)

CONNECTを押す

![Screenshot_20180725-133642.png](https://qiita-image-store.s3.amazonaws.com/0/139524/d2bdeab0-37ea-fbc1-f041-a58e15160f2f.png)

つながった

nRF Connect（Androidアプリ）
![Screenshot_20180725-133651.png](https://qiita-image-store.s3.amazonaws.com/0/139524/664d2ff0-9d7b-cf4a-b6ec-1f14d5e95775.png)

# ハードウェアロジックボム

HIDデバイスとして使用することができます。キーボードやマウスとしてペアリングすれば、ほぼあらゆる操作をホストにおこなうことができます。

# アドオン基板
アオノドンと組み合わせる基板を作成しました。
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/fbac0635-57fc-cc87-7e21-688e9bfe1de6.png)


CR2032で動作します。

バンドをつけると腕時計のように使えます。

組み立て方

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/d206b92f-c2d6-aba0-4569-88f0fdb10dd0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/4a94cef9-0c33-3249-374c-5dd4603b8508.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/ac38fd7a-b625-b4ac-88ae-289ca070bbbc.png)

完成！

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/b93bc2a4-0cfe-96ab-a507-88cfea05be26.png)



バンドをつけると、腕時計のように使うことができます。

# errata

オンボードのフルカラーLEDはパターンミスのため、実装できません

# 参考資料


## 類似ボード

下記のボードは、アオノドンと基本構成が同じで、ポートの割当などをし直せば同様と考えることができます。

SparkFun nRF52832 Breakout
https://www.sparkfun.com/products/13990?_ga=2.21330491.1296895606.1532412711-30008175.1532412711

Adafruit Feather nRF52 Bluefruit LE
https://www.adafruit.com/product/3406
MDBT42Qを搭載しています。

hackaBLE
https://hackaday.io/project/21160-hackable
MDBT42を使っているようです。

nRF52 DK
https://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF52-DK

RedBear BLE nano 2 および BLE Blend 2
https://www.kickstarter.com/projects/redbearinc/bluetooth-5-ready-ble-module-nano-2-and-blend-2?lang=ja
そのレポジトリ
https://github.com/redbear/nRF5x/tree/master/nRF52832

その他、中華なECサイトでnrf52で検索するとちらほら見つかります。

## 情報源

sandeepmistryのプロジェクトのレビュー
https://recordnotfound.com/arduino-BLEPeripheral-sandeepmistry-5894

sandeepmistryのgitterコミュニティ
https://gitter.im/sandeepmistry/arduino-BLEPeripheral

NordicのQ&A

https://devzone.nordicsemi.com/f/nordic-q-a

RedBearのnRF52のフォーラム
https://discuss.redbear.cc/c/nrf5x

arduino 上で nrf5 を使う。sandeepmistryもフォローされている。
https://www.bountysource.com/teams/arduino-nrf5/issues

micro:bit は nRF51 ではあるが、Arduino 開発環境 + sandeepmistryライブラリ で使う例などがあり、同様に使うことができる。
https://qiita.com/cyclon2joker/items/d0d73d2c94462449415c

redbearのディスカッションページ
https://discuss.redbear.cc/c/nrf5x

MySensorsのNRF5ボードのページ
一般的なNRF5の概要と注意についてまとまっている
https://www.openhardware.io/view/376/MySensors-NRF5-Platform


## 類似レポジトリ

sandeepmistryライブラリ以外にも、Arduino 開発環境に組み合わせて使える環境は多数ある。（未検証）

https://github.com/mysensors/ArduinoHwNRF5
https://github.com/adafruit/Adafruit_nRF52_Arduino
https://github.com/electronut/arduino-bluey
https://github.com/sparkfun/Arduino_Boards/ (ここに含まれている設定は sandeepmistry レポジトリを使用している)