Bluetooth Low Energy(以下BLE)の通信モジュールには様々なものがありますが、ここではNordic Semiconductor社のBLE SoC「nRF51822」を使って、BLEデバイスの開発環境をMacOS上で構築する方法をご紹介します。
この記事は公式の手順ではないことをご了承下さい。また、Windowsユーザーの方は、Nordic Semiconductor社よりWindows向けの開発ツールが提供されていてドキュメントもしっかりあるので、この記事を見る必要はありません。
nRF51822は、2.4GHz帯通信モジュール、CPU(ARM Cortex M0)、Flashメモリ(256KB)、RAM(16KB)を1チップに搭載し、SoftDeviceと呼ばれるBLEとハードウェアの制御が可能なソフトウェアがあらかじめ用意されているので、BLEデバイス開発者はこのSoftDeviceを使って簡単にBLEデバイスの開発ができるようになっています。
(詳しく知りたい方は、nRF51822に関するスライドを見てみるといいと思います)
nRF51822ベースのBLEモジュールは、国内でも複数のメーカーから提供されているので、それらを使って開発すると認証取得コストを抑えられます。
nRF51822の評価キット・開発キット
nRF51822の評価キット・開発キットは技適未取得です。nRF51822ベースのBLEモジュールメーカー各社から販売されている技適取得済みの開発キットがありますのでそちらを利用しましょう。ここではキットの内容を参考までにご紹介します。
Nordic社から評価キットと開発キットが提供されています。ただし、開発キットを使う場合は、nRFgo Starter Kitにセットする必要があります。
開発キット+nRFgo Starter Kitには、LED8個、タクトスイッチ8個とDisplayが実装された汎用的なボードを利用することができ、複雑なアプリケーションの開発を行う際に便利そうです。また、開発キットには、アプリケーションを書き込むための J-Link LITE がボードとは別に付属しています。こちらも同じくMouserやChip1Stopなどで扱われています。
nRF51-SDKとSoftDeviceをダウンロードする
- nRF51822製品ページの Downloads タブを開く
- SOFTWARE の nRF51-SDK-zip をダウンロードする
- SOFTDEVICES の S110-SD-v6 をダウンロードする
$ mkdir /usr/local/nrf51_sdk
$ mv ~/Downloads/nrf51_sdk_v5_1_0_36092 /usr/local/nrf51_sdk/
$ mkdir /usr/local/softdevice
$ mv ~/Downloads/s110_nrf51822_6 /usr/local/softdevice/
SDKやSoftDeviceをダウンロードするにはキットに記載されている Nordic Product Key が必要です。
J-Linkソフトウェアをダウンロードする
- SeggerのDownloadページを開く
- J-Link software & documentation pack for MAC の Download ボタンを押す
- nRF51評価ボードの SEGGER と書かれたシールに記載されているシリアル番号をDownloadページのフォームに入力し Submit Serial number ボタンを押す
- ダウンロード後、インストーラーを起動しJ-Linkソフトウェアをインストールする
- ターミナルで JLinkExe と打ってSEGGER J-Link Commanderと表示されれば成功です
Xcode Command line toolsをインストールする
- ターミナルで以下のコマンドを実行します。
$ xcode-select --install
- ツールがインストールされていない場合は、インストール確認ダイアログが表示されるので「インストール」ボタンを押す
GCC ARM Cortex-M Toolchainをダウンロードする
- GNU Tools for ARM Embedded Processors ページの画面右にあるDownloadsメニューより gcc-arm-none-eabi-mac.tar.bz2 をダウンロードする
- ファイルを解凍し、/usr/local/gcc_arm ディレクトリに展開したディレクトリを移動する
$ mkdir /usr/local/gcc_arm
$ mv ~/Downloads/gcc-arm-none-eabi-4_8-2013q4 /usr/local/gcc_arm/
nrf51-pure-gcc-setupのテンプレートをダウンロードする
GCCとJ-Linkで開発できるmakeビルドスクリプトのテンプレートをgithubから入手します。
$ git clone git@github.com:hlnd/nrf51-pure-gcc-setup.git
$ mv nrf51-pure-gcc-setup-master/template /usr/local/nrf51_sdk/
サンプルプロジェクトをダウンロードしビルドする
SDKにも含まれているサンプルプログラムを今回利用するmakeビルドスクリプトでビルドできるようにセットアップしたものを用意しました。
blinky_example.zip
$ cd ~/Downloads/blinky_example/pure-gcc/
$ make clean
$ make
...
/usr/local/gcc_arm/gcc-arm-none-eabi-4_8-2013q4/bin/arm-none-eabi-size _build/blinky_example_blank.elf
text data bss dec hex filename
1732 1092 28 2852 b24 _build/blinky_example_blank.elf
makeコマンドを実行すると、pure-gcc/_buildディレクトリ内にblinky_example_blank.bin, blinky_example_blank.elf, blinky_example_blank.hexが生成されます。
JLink/JLink-Liteでファームウェアを書き込む
makeビルドスクリプトには、JLinkでファームウェアを書き込むスクリプトが含まれています。ファームウェアを書き込む前にFlashメモリ上を一度クリアしておきましょう。
// 全てクリアする
$ make erase-all
// main.cのプログラムを書き込む
$ make flash
printf "r\nloadbin _build/blinky_example_blank.bin 00000000\nr\ng\nexit\n" > flash.jlink
JLinkExe -device nrf51822 -if swd -speed 1000 flash.jlink
SEGGER J-Link Commander V4.80h ('?' for help)
Compiled Feb 28 2014 21:56:56
Script file read successfully.
Info: Device "NRF51822_XXAA" selected (257 KB flash, 16 KB RAM).
DLL version V4.80h, compiled Feb 28 2014 21:56:51
Firmware: J-Link OB-SAM3U128 V1 compiled Dec 11 2013 20:20:11
Hardware: V1.00
S/N: 480100527
VTarget = 3.300V
Info: Found SWD-DP with ID 0x0BB11477
Info: Found Cortex-M0 r0p0, Little endian.
Info: FPUnit: 4 code (BP) slots and 0 literal slots
Found 1 JTAG device, Total IRLen = 4:
Cortex-M0 identified.
Target interface speed: 1000 kHz
Processing script file...
Reset delay: 0 ms
Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
Loading binary file... [_build/blinky_example_blank.bin]
Writing bin data into target memory @ 0x00000000.
Info: J-Link: Flash download: Flash programming performed for 1 range (3072 bytes)
Info: J-Link: Flash download: Total time needed: 0.167s (Prepare: 0.084s, Compare: 0.001s, Erase: 0.000s, Program: 0.075s, Verify: 0.000s, Restore: 0.006s)
Reset delay: 0 ms
Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
Script processing completed.
make: [flash] Error 1 (ignored)
Error 1 (ignored)と出てますが、書き込みに成功しプログラムが動作しました。
#J-Linkに接続できない場合
オンボードのJ-Linkを使っている場合、make erase-allやmake flashでJ-Linkに接続しようとすると、
Can not connect to J-Link via USB.
となることがあります。その場合、毎回コマンドを使ってUSB CDCを無効にする必要があります。
$ sudo kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDCACMData.kext
$ sudo kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDCECMData.kext
$ sudo kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDCACMControl.kext
$ sudo kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDC.kext
一方、J-Link LITEを使うとこのコマンドを実行する必要はありません。