BLE Nano V2 を mbed CLI で Lチカ

 以前の記事で BLE Nano V2 をオンラインの開発環境で動かしてみました。

blog.akanumahiroaki.com

 その時は mbed CLI ではコンパイル&実行まではできていなかったので、今回試してみました。

書き込み用のボードの違い

 BLE Nano で開発するには書き込み用のボードが必要なので、初めて買う時には書き込み用ボードとセットになったキットを買う必要がありますが、私が BLE Nano V1 の時に買ったものと V2 の時に買ったものでは DAPLink のバージョンが異なっています。下記の写真の左側が V1 の時にセットになっていたもので DAPLink の v1.0、右側が V2 の時にセットになっていたもので DAPLink の v1.5 でした。

f:id:akanuma-hiroaki:20180804075656j:plain

 結論から言っておくと、 BLE Nano V2 と DAPLink v1.0 の組み合わせでは、 mbed CLI での書き込み&実行はうまくいきませんでした。 DAPLink のそれぞれのバージョンで試した結果を下記に記載していきます。

BLE Nano V2 + DAPLink v1.0

 まずは Lチカのサンプルをインポートして、そのディレクトリに移動します。

$ mbed import http://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-blinky/                                                                                                                                            
[mbed] Importing program "mbed-os-example-blinky" from "https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-blinky" at latest revision in the current branch
[mbed] Adding library "mbed-os" from "https://github.com/ARMmbed/mbed-os" at rev #485bdeee150e
$ cd mbed-os-example-blinky

 LED のピン番号の指定を、 BLE Nano V2 の本体の LED のピン番号になるように、 led1 のピン番号の指定だけ変更して P0_11 にします。変更後のコードは下記の通りです。

$ cat main.cpp 
#include "mbed.h"

DigitalOut led1(P0_11);

// main() runs in its own thread in the OS
int main() {
    while (true) {
        led1 = !led1;
        wait(0.5);
    }
}

 BLE Nano V2 + DAPLink v1.0 を Mac に挿した状態で mbed detect してみると、下記のように検知されています。

$ mbed detect
WARNING: MBED_GCC_ARM_PATH set as environment variable but doesn't exist

[mbed] Detected RBLAB_BLENANO, port /dev/tty.usbmodem1412, mounted /Volumes/DAPLINK, interface version 0241:
[mbed] Supported toolchains for RBLAB_BLENANO
+----------------+-----------+-----------+-----------+-----------+-----------+
| Target         | mbed OS 2 | mbed OS 5 |    ARM    |  GCC_ARM  |    IAR    |
+----------------+-----------+-----------+-----------+-----------+-----------+
| RBLAB_BLENANO2 |     -     | Supported | Supported | Supported | Supported |
+----------------+-----------+-----------+-----------+-----------+-----------+
Supported targets: 1
Supported toolchains: 3

 TOOLCHAIN は今回はどのケースでも GCC_ARM ですが、 TARGET は複数のパターンで試しました。まずは Detected RBLAB_BLENANO となっているので、 TARGET を RBLAB_BLENANO としてみます。

$ mbed target RBLAB_BLENANO
[mbed] RBLAB_BLENANO now set as default target in program "mbed-os-example-blinky"
$ mbed toolchain GCC_ARM
[mbed] GCC_ARM now set as default toolchain in program "mbed-os-example-blinky"
$ mbed config --list
[mbed] Global config:
GCC_ARM_PATH=/Users/akanuma/Documents/mbed_connect_ws/mac-workshop-content/MacOS/Section-2/gcc-arm-none-eabi-6-2017-q2-update/bin

[mbed] Local config (/Users/akanuma/workspace/mbed_cli_mac/mbed-os-example-blinky):
TOOLCHAIN=GCC_ARM
TARGET=RBLAB_BLENANO

 そしてコンパイル実行。

$ mbed compile
WARNING: MBED_GCC_ARM_PATH set as environment variable but doesn't exist
[Error] @,: Compiler version mismatch: Have 7.2.1; expected version >= 6.0.0 and < 7.0.0
Building project mbed-os-example-blinky (RBLAB_BLENANO, GCC_ARM)
Scan: .
Scan: env
Scan: mbed
Scan: FEATURE_BLE

Could not compile for RBLAB_BLENANO: Target does not support mbed OS 5

 RBLAB_BLENANO は mbed OS 5 に対応していないということでコンパイルできません。おそらくですが RBLAB_BLENANO は BLE Nano V1 という指定になるので、 mbed OS5 には対応していないということで、コンパイルが実行できないものと思われます。

 次に mbed detect の結果として Target に表示されていた、 RBLAB_BLENANO2 を Target に設定してみます。

$ mbed target RBLAB_BLENANO2
[mbed] RBLAB_BLENANO2 now set as default target in program "mbed-os-example-blinky"

 そしてコンパイルを実行します。

$ mbed compile
WARNING: MBED_GCC_ARM_PATH set as environment variable but doesn't exist
[Error] @,: Compiler version mismatch: Have 7.2.1; expected version >= 6.0.0 and < 7.0.0
Building project mbed-os-example-blinky (RBLAB_BLENANO2, GCC_ARM)
Scan: .
Scan: env
Scan: mbed
Scan: FEATURE_BLE
Using regions bootloader, application in this build.
  Region bootloader: size 0x23000, offset 0x0
  Region application: size 0x5d000, offset 0x23000
Compile [  0.2%]: mbed_tz_context.c
Compile [  0.3%]: CAN.cpp
Compile [  0.5%]: Ethernet.cpp
〜〜〜中略〜〜〜
Compile [100.0%]: test_env.cpp
Link: mbed-os-example-blinky_application
Elf2Bin: mbed-os-example-blinky_application
Merging Regions
  Filling region bootloader with /Users/akanuma/workspace/mbed_cli_mac/mbed-os-example-blinky/mbed-os/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_softdevice.hex
  Padding region bootloader with 0xb58 bytes
  Filling region application with ./BUILD/RBLAB_BLENANO2/GCC_ARM/mbed-os-example-blinky_application.hex
Space used after regions merged: 0x40c54
+------------------+--------+-------+------+
| Module           |  .text | .data | .bss |
+------------------+--------+-------+------+
| [fill]           |    244 |     4 |   57 |
| [lib]/c.a        |  22447 |  2472 |   89 |
| [lib]/gcc.a      |   3112 |     0 |    0 |
| [lib]/misc       |    208 |    12 |   28 |
| [lib]/stdc++.a   |      1 |     0 |    0 |
| main.o           |    311 |     4 |    1 |
| mbed-os/drivers  |    785 |     0 |    0 |
| mbed-os/features |  62740 |    12 | 2082 |
| mbed-os/hal      |   1758 |     8 |  130 |
| mbed-os/platform |   3820 |   260 |  217 |
| mbed-os/rtos     |  10332 |   168 | 6133 |
| mbed-os/targets  |  13795 |    48 |  759 |
| Subtotals        | 119553 |  2988 | 9496 |
+------------------+--------+-------+------+
Total Static RAM memory (data + bss): 12484 bytes
Total Flash memory (text + data): 122541 bytes

Image: ./BUILD/RBLAB_BLENANO2/GCC_ARM/mbed-os-example-blinky.hex

 エラーなくコンパイルを実行することができましたので、出力された hex ファイルを DAPLink にコピーします。

$ cp ./BUILD/RBLAB_BLENANO2/GCC_ARM/mbed-os-example-blinky.hex /Volumes/DAPLINK/.

 コピー時もエラーは出ないのですが、コピーが終わっても実際には動作しませんでした。どうやら DAPLink v1.0 だと mbed CLI では書き込みがうまくいかないようです。

BLE Nano V2 + DAPLink v1.5

 次に BLE Nano V2 と DAPLink v1.5 の組み合わせで試してみます。この組み合わせで mbed detect すると、下記のような結果になります。

$ mbed detect
WARNING: MBED_GCC_ARM_PATH set as environment variable but doesn't exist

[mbed] Detected None, port /dev/tty.usbmodem1412, mounted /Volumes/DAPLINK, interface version 0242:
[mbed] Supported toolchains for None
+----------------------+-----------+-----------+-----------+-----------+-----------+
| Target               | mbed OS 2 | mbed OS 5 |    ARM    |  GCC_ARM  |    IAR    |
+----------------------+-----------+-----------+-----------+-----------+-----------+
| ARCH_PRO             | Supported | Supported | Supported | Supported | Supported |
| ARM_BEETLE_SOC       | Supported | Supported | Supported | Supported | Supported |
| ARM_CM3DS_MPS2       | Supported | Supported | Supported | Supported | Supported |
| B96B_F446VE          | Supported | Supported | Supported | Supported | Supported |
| DELTA_DFBM_NQ620     |     -     | Supported | Supported | Supported | Supported |
| DISCO_F303VC         | Supported | Supported | Supported | Supported | Supported |
| DISCO_F407VG         | Supported | Supported | Supported | Supported | Supported |
| DISCO_F413ZH         | Supported | Supported | Supported | Supported | Supported |
| DISCO_F429ZI         | Supported | Supported | Supported | Supported | Supported |
| DISCO_F469NI         | Supported | Supported | Supported | Supported | Supported |
| DISCO_F746NG         | Supported | Supported | Supported | Supported | Supported |
| DISCO_F769NI         | Supported | Supported | Supported | Supported | Supported |
〜〜〜中略〜〜〜
| NRF51_DK             | Supported | Supported | Supported | Supported | Supported |
| NRF51_DONGLE         | Supported | Supported | Supported | Supported | Supported |
| NRF52840_DK          |     -     | Supported | Supported | Supported | Supported |
| NRF52_DK             |     -     | Supported | Supported | Supported | Supported |
| NUCLEO_F070RB        | Supported | Supported | Supported | Supported | Supported |
〜〜〜中略〜〜〜
| WIO_3G               | Supported | Supported | Supported | Supported | Supported |
| WIZWIKI_W7500        | Supported | Supported | Supported | Supported | Supported |
| WIZWIKI_W7500ECO     | Supported | Supported | Supported | Supported | Supported |
| WIZWIKI_W7500P       | Supported | Supported | Supported | Supported | Supported |
| XDOT_L151CC          |     -     | Supported | Supported | Supported | Supported |
+----------------------+-----------+-----------+-----------+-----------+-----------+
Supported targets: 138

 mbed に登録されている開発ボードの中にはマッチするものがないということで、対応しているボードのリストが表示されます。この中から NRF52_DK を Target に設定します。

$ mbed target NRF52_DK
[mbed] NRF52_DK now set as default target in program "mbed-os-example-blinky"
$ mbed toolchain GCC_ARM
[mbed] GCC_ARM now set as default toolchain in program "mbed-os-example-blinky"
$ mbed config --list
[mbed] Global config:
GCC_ARM_PATH=/Users/akanuma/Documents/mbed_connect_ws/mac-workshop-content/MacOS/Section-2/gcc-arm-none-eabi-6-2017-q2-update/bin

[mbed] Local config (/Users/akanuma/workspace/mbed_cli_mac/mbed-os-example-blinky):
TOOLCHAIN=GCC_ARM
TARGET=NRF52_DK

 そしてコンパイル実行。

$ mbed compile
WARNING: MBED_GCC_ARM_PATH set as environment variable but doesn't exist
[Error] @,: Compiler version mismatch: Have 7.2.1; expected version >= 6.0.0 and < 7.0.0
Building project mbed-os-example-blinky (NRF52_DK, GCC_ARM)
Scan: .
Scan: env
Scan: mbed
Scan: FEATURE_BLE
Using regions bootloader, application in this build.
  Region bootloader: size 0x23000, offset 0x0
  Region application: size 0x5d000, offset 0x23000
Compile [  0.2%]: mbed_tz_context.c
Compile [  0.3%]: CAN.cpp
Compile [  0.5%]: Ethernet.cpp
〜〜〜中略〜〜〜
Compile [100.0%]: test_env.cpp
Link: mbed-os-example-blinky_application
Elf2Bin: mbed-os-example-blinky_application
Merging Regions
  Filling region bootloader with /Users/akanuma/workspace/mbed_cli_mac/mbed-os-example-blinky/mbed-os/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_softdevice.hex
  Padding region bootloader with 0xb58 bytes
  Filling region application with ./BUILD/NRF52_DK/GCC_ARM/mbed-os-example-blinky_application.hex
Space used after regions merged: 0x40cd4
+------------------+--------+-------+------+
| Module           |  .text | .data | .bss |
+------------------+--------+-------+------+
| [fill]           |    284 |     4 |   57 |
| [lib]/c.a        |  22447 |  2472 |   89 |
| [lib]/gcc.a      |   3112 |     0 |    0 |
| [lib]/misc       |    208 |    12 |   28 |
| [lib]/stdc++.a   |      1 |     0 |    0 |
| main.o           |    311 |     4 |    1 |
| mbed-os/drivers  |    785 |     0 |    0 |
| mbed-os/features |  62740 |    12 | 2082 |
| mbed-os/hal      |   1758 |     8 |  130 |
| mbed-os/platform |   3832 |   260 |  217 |
| mbed-os/rtos     |  10332 |   168 | 6133 |
| mbed-os/targets  |  13871 |    48 |  759 |
| Subtotals        | 119681 |  2988 | 9496 |
+------------------+--------+-------+------+
Total Static RAM memory (data + bss): 12484 bytes
Total Flash memory (text + data): 122669 bytes

Image: ./BUILD/NRF52_DK/GCC_ARM/mbed-os-example-blinky.hex

 エラーなくコンパイルされたので hex ファイルを DAPLINK にコピーします。

$ cp ./BUILD/NRF52_DK/GCC_ARM/mbed-os-example-blinky.hex /Volumes/DAPLINK/.

 こちらもエラーなくコピーされ、 DAPLink v1.0 との組み合わせの時と違い、 BLE Nano V2 本体で Lチカが実行されました。

まとめ

 BLE Nano のような開発ボードはチップのバージョンによる差や OS のバージョンによる差の影響が大きく、また、うまくいかなくても何が原因なのかがわかりづらいケースが多い印象です。実際何か目的があってボードやチップやOSを選定する場合は、うまくいく組み合わせなのかを少しずつ確認しながら進めた方が良さそうです。