BLE Nano -> Arduino連携時のデータ送信

シリアル経由のデータやり取りは、1文字ずつしか送れないため、シリアルモニターにも1文字ずつしか出力できない。そのため、終端文字を一緒に送って、「ここから、ここまでのデータを送るよ」と伝える必要がある。

(例)1111.111 ← 「1111.111」を送りたい。データの切れ目として「」(NULL終端文字)も一緒に送り、ここがデータの最後であることを伝える

■接続イメージ
BLE Nano(TX) -> (11番PIN)Arduino UNO

■送信データ(BLE Nano -> Arduino UNO)
1111.111

■そのまま出力した場合
シリアルモニターには以下のように1文字ずつ出力されてしまう
—————————————————————–
1
1
1
1
.
1
1
1

—————————————————————–

■データをためて一気に出力する場合のソース例(Arduino UNO側のソース)
#include

#define BLUETOOTH_TX 11
#define BLUETOOTH_RX 10

SoftwareSerial bluetooth(BLUETOOTH_TX,BLUETOOTH_RX);

char buffer; // BLUETOOTH_RXで受信する文字(1文字)
String value; // BLUETOOTH_RXで受信した文字をためる
char term_char = ‘’; // 受信終了を判断する終端文字

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);
}

void loop() {
  if(bluetooth.available()) {
    // 以下のソースだと1文字ずつシリアルに出力されてしまう
    //char value = (char)bluetooth.read();
    //Serial.println(value);

    // 受信した文字列(1文字ずつ)を変数にためてから一気に出力させる
    buffer = bluetooth.read();
    value = value + buffer;

    // 終端文字を受け取ったら出力して初期化
    if(buffer == term_char) {
      Serial.print(value);
      value = “”; // 初期化
    }
  }
}

■(オマケ)BLE Nano側のソース
#include “mbed.h”

Serial pc(USBTX, USBRX);

int main() {
    int counter = 1;

    while(1) {
        pc.printf(“counter=%d ”, counter);
        counter++;

        if(counter > 50)
            counter = 1;

        wait(1.0);
    }
}

MacでBLE Nanoをシリアルモニターに出力するにはArduino IDEが便利

Mac OSはTeraTermみたいなのはないので、BLE Nanoをmbedで開発したプログラムをシリアルモニターに出力する場合は、ターミナルでコマンドを打ち込んで出力するか、Macの有料アプリを利用する必要がある。ターミナルを使ってもよいが、コマンド打ったりしないといけないので少し面倒。
Arduino IDEのシリアルモニターでも出力できるので、もしArduinoも開発している人だった場合は、これを使うとよい。ただし、Arduino IDEのBoard Managerで、あらかじめBLE Nanoを利用できるようにしておく必要がある。

■Arduino IDEでBLE Nanoライブラリーを追加する
以下の「Using Arduino」を参考にして追加する。
http://redbearlab.com/getting-started-nrf51822

■シリアルモニターの利用イメージ
BLE NanoのBoardを選択してシリアルモニター画面を表示させれば、mbedで開発したものを出力することができる。

RedBearLab BLE NanoをiBeacon化

RedBearLab BLE NanoキットでiBeacon化する方法を紹介します。


■開発環境
【(iBeacon化)IoTデバイス】
・RedBearLab BLE Nanoキット(nRF51822) 技適ありで自由に開発できるモジュールは(おそらく)最安なので、これをiBeacon化します。
https://www.switch-science.com/catalog/2401/
・開発環境 – mbed

【PC】
・MacBookAir OS X EI Capitan Version 10.11.6
・Xcode Version 7.3.1

【モバイル】
・iPhone6 iOS 9.3


■iBeacon化までの全体像と手順
ファームウェア更新する → mbedでiBeaconサンプルファイル作る → BLE Nano接続してMBEDドライブにポイする → iPhoneにiBeaconアプリ入れる → BLE Nanoを発見する

以下、手順になります。

1.ファームウェアを更新する
BLE Nanoのリセットボタンを押しながら、PCのUSBポートに接続する。すると「BOOTLOADER」ドライブがマウントされる。
以下URLから「Firmware」ー「blenano_mk20dx_interface_20140912.bin」っぽい名前のファイルをDLしてから、ターミナルで
「dd if=DLしたファームウェアのパスとファイル名 of=/Volumes/BOOTLOADER/firmware.bin conv=notrunc」
(例) dd if=/Users/256hax/Downloads/blenano_mk20dx_interface_20140912.bin of=/Volumes/BOOTLOADER/firmware.bin conv=notrunc
と入力する。
https://developer.mbed.org/platforms/RedBearLab-BLE-Nano/
するとBLE Nanoが自動的に ファームウェアを更新 → ドライブをアンマウント → ドライブをマウント してくれる。

【RedBearLab BLE Nano – mbed(上記URL)で掲載されている手順】

Interface Firmware

To upgrade the interface firmware (inside the MK20 chip):

1. Press and hold the reset button on the MK20 USB board

2. Connect it to an USB port of your PC

3. “BOOTLOADER” drive will be shown

4. Release the button and the LED will keep flashing (slowly)

5.1 For Windows, just drag the new firmware to the MSD drive

5.2 For Linux or Mac OSX, use the follow command from the Terminal:

Quote:

dd if=src_firmware.bin of=/Volumes/BOOTLOADER/dst_firmware.bin conv=notrunc

6. The LED should keep flashing (very fast this time)

7. Remove the board from the USB port

8. Reconnect it to the USB port
Firmware:

※正常に書き込まれると自動的にマウント解除+再接続してMBEDドライブが表示される。
※ファームウェアのファイルをBOOTLOADERドライブにドラッグ&ドロップする、というコメントをブログで見かけたが、自分の場合はそれだとダメだった。
※何か間違えて書き込んでしまってBLE Nanoが動かなくなってしまった場合でも、上記の方法で元に戻すことができる。例えば、BLE NanoをUSBポートに差し込んでも認識されなくなった・・・みたいな状況になった場合は上記を試すと直ることがある。

2.mbedでiBeaconサンプルファイル作る
【mbedの利用方法は以下を参照】
http://redbearlab.com/getting-started-nrf51822

上記の知識がある前提で以下を実行する。

Importボタンを押して「ibeacon」で検索し、Team Bluetooth Low EnergyがAuthorになっている「BLE_iBeacon」をインポートする。
※よく「Libraries」のタブ開いて検索しちゃうことがあるため、「Programs」タブを開いているか確認しておくこと

次に、インポートしたプログラムのmain.cppを開いて、初期値になっているUUIDをコメントアウントしてユニークなUUIDを記述する。以下のUUIDは一例です。
————————————————————————————————————–
     /* Comment out – Default UUID
    const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
                            0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61};
    */
    /* Add – RedBearLab UUID */
    const uint8_t uuid[] = {0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48, 0xD2, 0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0};
    uint16_t majorNumber = 1122;
    uint16_t minorNumber = 3344;
————————————————————————————————————–

コンパイルしてhexファイルをDLする。

3.BLE Nano接続してMBEDドライブにポイする
BLE NanoをPCのUSBポートに接続して、上記でDLしたhexファイルをマウントされた「MBED」ドライブにドラッグ&ドロップする。
※この時にhexファイルがMBEDドライブに書き込まれるのは見えないが、 アンマウント → マウント が自動的に実施されれば正常に書き込みが出来ている。

4.iPhoneにiBeaconアプリ入れる
Radius NetworsのLocate BeaconをiPhoneにインストールする。
https://itunes.apple.com/jp/app/locate-beacon/id738709014?mt=8

もしXcodeでiBeaconのiOS向けサンプルプログラムをいじりたい場合は、以下のIoT Design Shopの「Download the
BeaconDemo Project Here.」をDLしてから、UUIDをBLE Nanoの値に書き換えればOK。
http://developer.iotdesignshop.com/tutorials/integrating-ibeacon-with-your-apps-the-beacondemo-project/

【BLE NanoのUUID】
以下パターン1か2のどちらかを状況に合わせて記述する。※以下は例なのでUUIDはご自信が生成されたユニークなUUIDを使ってください。
パターン1:E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
パターン2:0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48, 0xD2, 0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0

(BLE NanoのGetting StartedにもUUIDは載っています)
http://redbearlab.com/getting-started-nrf51822

5.BLE Nanoを発見する
iPhoneからLocate Beaconアプリを立ち上げて、右下のレーダーマークになっているメニューをタップして、「To configure other UUIDs, click the “Gear” icon above.」をタップして以下を設定する。
——————————————————————–
Beacon Name:BLE Nano
UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
Major:1122
Minor:3344
Power:デフォルト(-59)
——————————————————————–

次に、前の画面に戻って左下の レーダーマークのメニューを再度タップして、登録したBLE Nanoデバイスが表示されれば成功。表示されているデバイスをタップすると、DistanceとかCalibrateが実行できる。

■備考
・開発方法は、mbed, Nordiac, Arduinoの3種類あるが、開発はmbedがおすすめ。Nordiacは環境整えるが難しすぎる。Arduinoはまだ一般提供レベルではないっぽい。

・MacのOSが古いとBLE Nanoを差してもMBEDがマウントされないことがあるらしい。もし最新なのにマウントされない場合は、ファームウェアの更新をしてみてください。

・ iBeacon化のサンプルが少なく、この記事で紹介したものぐらいしか、2016年8月現在では、ちゃんとしたものが発見できなかった(おそらく時間が経ってソースやらデバイスやらが追いついていないっぽい)。

・Xcodeで開発する場合は、Apple公式の「AirLocate」が定番になっているようですが、iOS7以降にソースが対応しておらず(ユーザー許可関連)、
iPhoneで発見できなかった。なにやら、Blutoothを利用する時にユーザー許可が必要うんぬんとかで、ソースを修正しないと動かないようです
(修正してみたがうまく動かせず)。
https://developer.apple.com/library/ios/samplecode/AirLocate/Introduction/Intro.html

・Xcode開発時に、アプリをシミュレータで動かして動作確認すると思いますが、Bluetoothは動かせないとのことで、XcodeからiPhone実機にアプリをインストールして動作確認する必要があります。

・UUIDは全世界でユニークでることが国際規格で決まっているので、重複がおきないように気をつけてください。
アプリックスさんのサイトにわかりやすい説明が載っています → http://www.aplix.co.jp/beacon/refinfo/refinfo0105.html

・UUID生成サイト → https://www.uuidgenerator.net/