※USB接続の書き込み用ボードとして MK20 がセットになったものと DAPLink がセットになったものがあります。当初 MK20 と書いていましたが、私が購入したものは DAPLink でしたので、修正しました。(2017/09/18)
BLE デバイスの Firmware 開発に興味があって入門用のものを探したところ、 BLE Nano というのがみつかったので購入しました。
BLE Nano 単体のものと、USB接続の書き込み用ボード MK20 もしくは DAPLink がセットになったキットがありますが、初めて買う場合は書き込み用ボードも必要なのでキットを買うことになります。
スイッチサイエンスでは在庫切れだったのですが、運よくツクモのロボット王国で購入できました。
業界最小と謳っているだけのことはあり、かなり小さいです。実際にデバイスに搭載されるモジュール部分だけであれば100円硬貨と同じぐらいです。
今回はチュートリアルに沿ってオンラインの開発環境で試した後、 mbed CLI でターミナル上から開発できるようにしてみたいと思います。
設定&チュートリアル
BLE Nano のチュートリアルは下記ページに公開されています。
Getting Started - nRF51822 — RedBear
ハードウェアセットアップの説明では MK20 と BLE Nano にピンヘッダをはんだ付けすることになっていますが、私が買ったキットは DAPLink とのセットで、すでにはんだ付けされていました。また、MK20 側のホールが余るような説明になっていますが、DAPLink 側のホールは余っていませんでした。
BLE Nano の開発環境としては、 GCC、 mbed、 Arduino IDE に対応しています。手軽に使えそうなのは mbed なので、今回は mbed で試してみたいと思います。チュートリアルページで紹介されている mbed のリンク先ではアカウント登録はできないようで、下記ページから登録しました。
アカウント登録が終わったら、BLE Nano + DAPLink をUSBポートに挿すと、USBドライブとして認識されます。私の環境では /Volumes/DAPLINK
として認識されていました。ドライブの中に含まれている MBED.HTM をブラウザで開きます。
RedBearLab BLE Nano の画面が開きますので、画面右上の Compiler
メニューをクリックするとオンラインの開発環境にアクセスでき、下記のような画面になります。
画面右上の RedBearLab BLE Nano
と表示されているところをクリックすると対象のプラットフォームを選択できますが、すでに BLE Nano が選択されているのでそのままで問題ないと思います。
また、画面左上の インポート
メニューから、公開されているリポジトリのプログラムをインポートすることができます。
チュートリアルでは mbed_blinky を検索して選択していますが、検索ではチュートリアルと同じものがみつからなかったので、直接下記URLを指定する形でインポートしました。
https://developer.mbed.org/teams/mbed/code/mbed_blinky/
無事にインポートされると下記のようにファイルリストが表示されます。
main.cpp をダブルクリックして内容を表示し、チュートリアルにあるように、 myled の値を P0_19 に変更します。
そして画面上部の コンパイル
メニューをクリックするとコンパイルが実行され、 mbed_blinky_RBLAB_BLENANO.hex
というファイルがビルドされますので、 /Volumes/DAPLINK
にコピーすると BLE Nano にプログラムが書き込まれ、実行されます。
mbed CLI
チュートリアルで紹介されているのはここまでですが、オフライン環境でも開発できて CLI から使える mbed CLI というのがあったので、こちらで同様のことを行ってみたいと思います。私としては vim から編集できて、コマンドラインからコンパイル等も行う方が好きなので、良さそうであればこちらのやり方でやっていきたいと思います。
開発環境の設定については下記ページで紹介されていますので、紹介されている通りに手順を実行します。 Python, Git, Mercurial, GCC をインストールした後で mbed CLI をインストールする形になります。私の場合は Mac 環境なので、後者のページの手順を実行しました。
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 に変わっているようで、下記のサイトでインストール方法が紹介されていました。
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 に先ほどコンパイルして作成されたファイルを指定します。
「Debugger」タブで pyOCD の Executable に pyocd-gdbserver のパスを設定し、GDB の Executable に gdb のパスを設定します。
ここまで設定したら設定を保存して Debug
ボタンでデバッグを開始します。すると Eclipse の Debug Perspective が表示され、実行状況が見られるようになります。
試した限りではまだ実行中のコードを見ることができていないので、今後その辺りは調べてみようと思います。
まとめ
もともと Web 系のエンジニアだった自分としては BLE の Firmware 開発は敷居が高かったのですが、 BLE Nano と mbed で、ひとまず動かしてみるぐらいまでは手軽にできました。また、 mbed CLI でオフラインでターミナルから開発することができるので、 vim でコードを書いたり、Git でバージョン管理もやりやすそうなのですが、私の環境では mbed CLI だとプログラムのインポートや新規作成に10分以上かかってしまっていたので、初期に色々試してみる場合はオンラインの開発環境の方がやりやすいかもしれません。まだ単体で動かしているだけですが、今後色々なセンサーと組み合わせて動かせるようにしていきたいと思います。