BLEデバイスの開発環境を構築する（nRF51822 & MacOS編）

Bluetooth Low Energy（以下BLE）の通信モジュールには様々なものがありますが、ここではNordic Semiconductor社のBLE SoC「[nRF51822](http://www.nordicsemi.com/jpn/Products/Bluetooth-R-low-energy/nRF51822)」を使って、BLEデバイスの開発環境をMacOS上で構築する方法をご紹介します。

``` この記事は公式の手順ではないことをご了承下さい。また、Windowsユーザーの方は、Nordic Semiconductor社よりWindows向けの開発ツールが提供されていてドキュメントもしっかりあるので、この記事を見る必要はありません。```

nRF51822は、2.4GHz帯通信モジュール、CPU(ARM Cortex M0)、Flashメモリ(256KB)、RAM(16KB)を１チップに搭載し、SoftDeviceと呼ばれるBLEとハードウェアの制御が可能なソフトウェアがあらかじめ用意されているので、BLEデバイス開発者はこのSoftDeviceを使って簡単にBLEデバイスの開発ができるようになっています。
（詳しく知りたい方は、[nRF51822に関するスライド](http://www.slideshare.net/Nordic-Yamazaki/nordic-wj2013seminarn-rf51moduleslideshare)を見てみるといいと思います）

nRF51822ベースのBLEモジュールは、国内でも複数のメーカーから提供されているので、それらを使って開発すると認証取得コストを抑えられます。

# nRF51822の評価キット・開発キット
``` nRF51822の評価キット・開発キットは技適未取得です。nRF51822ベースのBLEモジュールメーカー各社から販売されている技適取得済みの開発キットがありますのでそちらを利用しましょう。ここではキットの内容を参考までにご紹介します。 ```

Nordic社から[評価キット](http://www.nordicsemi.com/jpn/Products/Bluetooth-R-low-energy/nRF51822-Evaluation-Kit)と[開発キット](http://www.nordicsemi.com/jpn/node_176/Bluetooth-R-low-energy/nRF51822-Development-Kit)が提供されています。ただし、開発キットを使う場合は、[nRFgo Starter Kit](http://www.nordicsemi.com/jpn/node_176/2.4GHz-RF/nRFgo-Starter-Kit)にセットする必要があります。

> 評価キットには評価ボードとUSBドングル型が含まれています。[Mouser](http://jp.mouser.com/ProductDetail/Nordic-Semiconductor/nRF51822-EK/?qs=7xCC5jQa1OIt3SGYCQ2BhQ%3D%3D)や[Chip1Stop](http://www.chip1stop.com/dispDetail.do?partId=NORD-0000028&utm_medium=cpc&utm_campaign=aggregator&utm_source=fc&utm_term=NORD-0000028&cid=fc_NORD-0000028)などで扱われています。


>開発キット＋nRFgo Starter Kitには、LED８個、タクトスイッチ８個とDisplayが実装された汎用的なボードを利用することができ、複雑なアプリケーションの開発を行う際に便利そうです。また、開発キットには、アプリケーションを書き込むための __J-Link LITE__ がボードとは別に付属しています。こちらも同じく[Mouser](http://jp.mouser.com/ProductDetail/Nordic-Semiconductor/nRF51822-DK/?qs=7xCC5jQa1OIl3kU93M4e0g%3D%3D)や[Chip1Stop](http://www.chip1stop.com/dispDetail.do?partId=NORD-0000027)などで扱われています。

# nRF51-SDKとSoftDeviceをダウンロードする
1. [nRF51822製品ページ](http://www.nordicsemi.com/jpn/Products/Bluetooth-R-low-energy/nRF51822-Evaluation-Kit)の __Downloads__ タブを開く
2. __SOFTWARE__ の __nRF51-SDK-zip__ をダウンロードする
3. __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ソフトウェアをダウンロードする
1. Seggerの[Downloadページ](http://www.segger.com/jlink-software.html)を開く
2. __J-Link software & documentation pack for MAC__ の __Download__ ボタンを押す
3. nRF51評価ボードの __SEGGER__ と書かれたシールに記載されているシリアル番号をDownloadページのフォームに入力し __Submit Serial number__ ボタンを押す
4. ダウンロード後、インストーラーを起動しJ-Linkソフトウェアをインストールする
5. ターミナルで JLinkExe と打ってSEGGER J-Link Commanderと表示されれば成功です

# Xcode Command line toolsをインストールする
1. ターミナルで以下のコマンドを実行します。
```
$ xcode-select --install
```
2. ツールがインストールされていない場合は、インストール確認ダイアログが表示されるので「インストール」ボタンを押す

# GCC ARM Cortex-M Toolchainをダウンロードする
1. [ __GNU Tools for ARM Embedded Processors__ ページ](https://launchpad.net/gcc-arm-embedded)の画面右にあるDownloadsメニューより __gcc-arm-none-eabi-mac.tar.bz2__ をダウンロードする
2. ファイルを解凍し、/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](http://cl.ly/0W3f3U1s3Q2L)


```
$ 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を使うとこのコマンドを実行する必要はありません。


http://hg.cmason.com/nrf/src/66fec128728e1d131e12937cf1194694267f83a2/scripts/disable_cdc.sh?at=default