BLE Nano と mbed CLI で Lチカしてみる

※USB接続の書き込み用ボードとして MK20 がセットになったものと DAPLink がセットになったものがあります。当初 MK20 と書いていましたが、私が購入したものは DAPLink でしたので、修正しました。(2017/09/18)

 BLE デバイスの Firmware 開発に興味があって入門用のものを探したところ、 BLE Nano というのがみつかったので購入しました。

BLE Nano — RedBear

f:id:akanuma-hiroaki:20170910001301j:plain:w450

 BLE Nano 単体のものと、USB接続の書き込み用ボード MK20 もしくは DAPLink がセットになったキットがありますが、初めて買う場合は書き込み用ボードも必要なのでキットを買うことになります。

www.switch-science.com

 スイッチサイエンスでは在庫切れだったのですが、運よくツクモのロボット王国で購入できました。

 業界最小と謳っているだけのことはあり、かなり小さいです。実際にデバイスに搭載されるモジュール部分だけであれば100円硬貨と同じぐらいです。

f:id:akanuma-hiroaki:20170910001752j:plain:w450

 今回はチュートリアルに沿ってオンラインの開発環境で試した後、 mbed CLI でターミナル上から開発できるようにしてみたいと思います。

設定&チュートリアル

 BLE Nano のチュートリアルは下記ページに公開されています。

Getting Started - nRF51822 — RedBear

 ハードウェアセットアップの説明では MK20 と BLE Nano にピンヘッダをはんだ付けすることになっていますが、私が買ったキットは DAPLink とのセットで、すでにはんだ付けされていました。また、MK20 側のホールが余るような説明になっていますが、DAPLink 側のホールは余っていませんでした。

f:id:akanuma-hiroaki:20170910003341j:plain:w450

f:id:akanuma-hiroaki:20170910003411j:plain:w450

 BLE Nano の開発環境としては、 GCC、 mbed、 Arduino IDE に対応しています。手軽に使えそうなのは mbed なので、今回は mbed で試してみたいと思います。チュートリアルページで紹介されている mbed のリンク先ではアカウント登録はできないようで、下記ページから登録しました。

developer.mbed.org

 アカウント登録が終わったら、BLE Nano + DAPLink をUSBポートに挿すと、USBドライブとして認識されます。私の環境では /Volumes/DAPLINK として認識されていました。ドライブの中に含まれている MBED.HTM をブラウザで開きます。

f:id:akanuma-hiroaki:20170910011134p:plain

 RedBearLab BLE Nano の画面が開きますので、画面右上の Compiler メニューをクリックするとオンラインの開発環境にアクセスでき、下記のような画面になります。

f:id:akanuma-hiroaki:20170910004607p:plain

 画面右上の RedBearLab BLE Nano と表示されているところをクリックすると対象のプラットフォームを選択できますが、すでに BLE Nano が選択されているのでそのままで問題ないと思います。

 また、画面左上の インポート メニューから、公開されているリポジトリのプログラムをインポートすることができます。

f:id:akanuma-hiroaki:20170910005602p:plain

 チュートリアルでは mbed_blinky を検索して選択していますが、検索ではチュートリアルと同じものがみつからなかったので、直接下記URLを指定する形でインポートしました。

https://developer.mbed.org/teams/mbed/code/mbed_blinky/

 無事にインポートされると下記のようにファイルリストが表示されます。

f:id:akanuma-hiroaki:20170910005938p:plain

 main.cpp をダブルクリックして内容を表示し、チュートリアルにあるように、 myled の値を P0_19 に変更します。

f:id:akanuma-hiroaki:20170910010036p:plain

 そして画面上部の コンパイル メニューをクリックするとコンパイルが実行され、 mbed_blinky_RBLAB_BLENANO.hex というファイルがビルドされますので、 /Volumes/DAPLINK にコピーすると BLE Nano にプログラムが書き込まれ、実行されます。

f:id:akanuma-hiroaki:20170910011952j:plain:w450

mbed CLI

 チュートリアルで紹介されているのはここまでですが、オフライン環境でも開発できて CLI から使える mbed CLI というのがあったので、こちらで同様のことを行ってみたいと思います。私としては vim から編集できて、コマンドラインからコンパイル等も行う方が好きなので、良さそうであればこちらのやり方でやっていきたいと思います。

 開発環境の設定については下記ページで紹介されていますので、紹介されている通りに手順を実行します。 Python, Git, Mercurial, GCC をインストールした後で mbed CLI をインストールする形になります。私の場合は Mac 環境なので、後者のページの手順を実行しました。

mbed オフラインの開発環境 | Mbed

mbed CLI (コマンドライン・インタフェース)を Mac OS X で使ってみる | Mbed

 必要なもののインストールが終わったら作業ディレクトリに移動して、オンラインの開発環境でやったのと同じように、公開されているプログラムをインポートします。

mbed_cli  $ mbed import https://developer.mbed.org/teams/mbed/code/mbed_blinky/
[mbed] Importing program "mbed_blinky" from "https://developer.mbed.org/teams/mbed/code/mbed_blinky" at latest revision in the current branch
[mbed] Adding library "mbed" from "https://mbed.org/users/mbed_official/code/mbed/builds" at rev #a97add6d7e64
[mbed] Downloading library build "a97add6d7e64" (might take a minute)
[mbed] Unpacking library build "a97add6d7e64" in "/Users/akanuma/workspace/mbed_cli/mbed_blinky/mbed"
[mbed] Couldn't find build tools in your program. Downloading the mbed 2.0 SDK tools...
[mbed] Auto-installing missing Python modules...

 上記の例だと mbed_blinky というディレクトリが作成されているのでその中に入ります。

mbed_cli  $ cd mbed_blinky/
mbed_blinky  $ 
mbed_blinky  $ ls -ltr
total 24
-rw-r--r--  1 akanuma  staff    66 Sep  9 23:14 mbed.bld
-rw-r--r--  1 akanuma  staff   168 Sep  9 23:14 main.cpp
drwxr-xr-x  4 akanuma  staff   136 Sep  9 23:17 mbed
-rw-r--r--  1 akanuma  staff  1329 Sep  9 23:18 mbed_settings.py

 mbed detect コマンドを実行すると、接続されているデバイスを検出してくれるので実行してみます。

mbed_blinky  $ mbed detect
Traceback (most recent call last):
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/detect_targets.py", line 25, in <module>
    from tools.options import get_default_options_parser
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/options.py", line 21, in <module>
    from tools.toolchains import TOOLCHAINS
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/toolchains/__init__.py", line 29, in <module>
    from tools.config import Config
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/config/__init__.py", line 29, in <module>
    from tools.arm_pack_manager import Cache
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/arm_pack_manager/__init__.py", line 2, in <module>
    from bs4 import BeautifulSoup
ImportError: No module named bs4
[mbed] ERROR: "/usr/local/opt/python/bin/python2.7" returned error code 1.
[mbed] ERROR: Command "/usr/local/opt/python/bin/python2.7 -u /Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/detect_targets.py" in "/Users/akanuma/workspace/mbed_cli/mbed_blinky"
---

 bs4 というモジュールがないということなので、 pip でインストールします。

mbed_blinky  $ pip install beautifulsoup4
Collecting beautifulsoup4
  Downloading beautifulsoup4-4.6.0-py2-none-any.whl (86kB)
    100% |████████████████████████████████| 92kB 2.5MB/s 
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0
mbed_blinky  $ 
mbed_blinky  $ mbed detect                                                                                                                                                                                                                    
Traceback (most recent call last):
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/detect_targets.py", line 25, in <module>
    from tools.options import get_default_options_parser
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/options.py", line 21, in <module>
    from tools.toolchains import TOOLCHAINS
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/toolchains/__init__.py", line 29, in <module>
    from tools.config import Config
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/config/__init__.py", line 29, in <module>
    from tools.arm_pack_manager import Cache
  File "/Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/arm_pack_manager/__init__.py", line 20, in <module>
    from fuzzywuzzy import process
ImportError: No module named fuzzywuzzy
[mbed] ERROR: "/usr/local/opt/python/bin/python2.7" returned error code 1.
[mbed] ERROR: Command "/usr/local/opt/python/bin/python2.7 -u /Users/akanuma/workspace/mbed_cli/mbed_blinky/.temp/tools/detect_targets.py" in "/Users/akanuma/workspace/mbed_cli/mbed_blinky"
---

 今度は fuzzywuzzy がないということなのでこちらもインストールします。

mbed_blinky  $ pip install fuzzywuzzy
Collecting fuzzywuzzy
  Downloading fuzzywuzzy-0.15.1-py2.py3-none-any.whl
Installing collected packages: fuzzywuzzy
Successfully installed fuzzywuzzy-0.15.1
mbed_blinky  $ 
mbed_blinky  $ mbed detect                                                                                                                                                                                                                    

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

mbed_blinky  $ 

 Detected RBLAB_BLENANO ということで、 BLE Nano が検出されました。表の中と、 Supported targets に何も表示されていないのが気になるところですがひとまず進みます。続いてツールチェーン(コンパイラ)とターゲットを指定します。

mbed_blinky  $ mbed toolchain GCC_ARM
[mbed] GCC_ARM now set as default toolchain in program "mbed_blinky"
mbed_blinky  $ 
mbed_blinky  $ mbed target RBLAB_BLENANO
[mbed] RBLAB_BLENANO now set as default target in program "mbed_blinky"

 それではコンパイルしてみます。 mbed compile を実行するだけです。

mbed_blinky  $ mbed compile
Building project mbed_blinky (RBLAB_BLENANO, GCC_ARM)
Scan: .
Scan: env
Scan: mbed
Compile [100.0%]: main.cpp
Link: mbed_blinky
Elf2Bin: mbed_blinky
+-----------+-------+-------+------+
| Module    | .text | .data | .bss |
+-----------+-------+-------+------+
| Fill      |    20 |     0 |   15 |
| Misc      |  8389 |   124 |  301 |
| Subtotals |  8409 |   124 |  316 |
+-----------+-------+-------+------+
Allocated Heap: 3648 bytes
Allocated Stack: 2048 bytes
Total Static RAM memory (data + bss): 440 bytes
Total RAM memory (data + bss + heap + stack): 6136 bytes
Total Flash memory (text + data + misc): 8533 bytes

Image: ./BUILD/RBLAB_BLENANO/GCC_ARM/mbed_blinky.hex

 コンパイルが実行され、 ./BUILD/RBLAB_BLENANO/GCC_ARM/mbed_blinky.hex というファイルが作成されました。これを BLE Nano にコピーします。

mbed_blinky  $ cp ./BUILD/RBLAB_BLENANO/GCC_ARM/mbed_blinky.hex /Volumes/DAPLINK/

 コピーが完了すると BLE Nano でプログラムが実行されます。

 最初は Vagrant で Linux の VM 上に mbed CLI の環境を作ってみたのですが、インポートしようとすると [mbed] Downloading library build "a97add6d7e64" (might take a minute) で止まってしまって進まなかったので、Macに直接環境を作りました。

デバッグ環境の設定

 前述の mbed CLI の参考サイトにデバッグ方法も紹介されていたので環境設定をしてみました。紹介されている方法の中でMacで使えるのは Eclipse と pyOCD でのデバッグなので、その方法を試してみました。

 まずは Eclipse IDE for C/C++ Developers をダウンロードして解凍し、 Eclipse.app を Applications ディレクトリに移動して起動します。

 次は GNU ARM Eclipse plugin をインストールということなんですが、前述のページで紹介されているURLは Deprecated ということで、色々調べたところ、 GNU ARM plugin は GNU MCU plugin に変わっているようで、下記のサイトでインストール方法が紹介されていました。

gnu-mcu-eclipse.github.io

 Marketplace で検索してインストールするやり方ではエラーになってしまったので Install New Software から下記のURLを指定してインストールしました。

http://gnu-mcu-eclipse.netlify.com/v4-neon-updates/

 PyOCD はインストール済みでした。

mbed_cli  $ pip install pyocd
Requirement already satisfied: pyocd in /usr/local/lib/python2.7/site-packages
Requirement already satisfied: websocket-client in /usr/local/lib/python2.7/site-packages (from pyocd)
Requirement already satisfied: enum34 in /usr/local/lib/python2.7/site-packages (from pyocd)
Requirement already satisfied: intelhex in /usr/local/lib/python2.7/site-packages (from pyocd)
Requirement already satisfied: six in /usr/local/lib/python2.7/site-packages (from pyocd)
Requirement already satisfied: future in /usr/local/lib/python2.7/site-packages (from pyocd)
Requirement already satisfied: hidapi in /usr/local/lib/python2.7/site-packages (from pyocd)
Requirement already satisfied: setuptools>=19.0 in /usr/local/lib/python2.7/site-packages (from hidapi->pyocd)

 GDB がインストールされていなかったので brew でインストールします。

mbed_blinky  $ brew install gdb

 環境の準備ができたら --profile debug オプションをつけてプログラムをコンパイルします。

mbed_blinky  $ mbed compile --profile debug
Building project mbed_blinky (RBLAB_BLENANO, GCC_ARM)
Scan: .
Scan: env
Scan: mbed
Compile [100.0%]: main.cpp
Link: mbed_blinky
Elf2Bin: mbed_blinky
+-----------+-------+-------+------+
| Module    | .text | .data | .bss |
+-----------+-------+-------+------+
| Fill      |    21 |     0 |   15 |
| Misc      |  8604 |   124 |  301 |
| Subtotals |  8625 |   124 |  316 |
+-----------+-------+-------+------+
Allocated Heap: 3648 bytes
Allocated Stack: 2048 bytes
Total Static RAM memory (data + bss): 440 bytes
Total RAM memory (data + bss + heap + stack): 6136 bytes
Total Flash memory (text + data + misc): 8749 bytes

Image: ./BUILD/RBLAB_BLENANO/GCC_ARM/mbed_blinky.hex

 そして Eclipse からデバッグ設定をします。Eclipse での設定も前述の mbed オフラインの開発環境 | Mbed のページに書かれています。

 「Run」メニューの 「Debug Configurations…」からデバッグ設定をします。GDB PyOCD Debugging の下に新しい設定を作成し、 C/C++ Application に先ほどコンパイルして作成されたファイルを指定します。

f:id:akanuma-hiroaki:20170910145301p:plain

 「Debugger」タブで pyOCD の Executable に pyocd-gdbserver のパスを設定し、GDB の Executable に gdb のパスを設定します。

f:id:akanuma-hiroaki:20170910145520p:plain

 ここまで設定したら設定を保存して Debug ボタンでデバッグを開始します。すると Eclipse の Debug Perspective が表示され、実行状況が見られるようになります。

f:id:akanuma-hiroaki:20170910145637p:plain

 試した限りではまだ実行中のコードを見ることができていないので、今後その辺りは調べてみようと思います。

まとめ

 もともと Web 系のエンジニアだった自分としては BLE の Firmware 開発は敷居が高かったのですが、 BLE Nano と mbed で、ひとまず動かしてみるぐらいまでは手軽にできました。また、 mbed CLI でオフラインでターミナルから開発することができるので、 vim でコードを書いたり、Git でバージョン管理もやりやすそうなのですが、私の環境では mbed CLI だとプログラムのインポートや新規作成に10分以上かかってしまっていたので、初期に色々試してみる場合はオンラインの開発環境の方がやりやすいかもしれません。まだ単体で動かしているだけですが、今後色々なセンサーと組み合わせて動かせるようにしていきたいと思います。