BLE Client and Server using Switch Sience TY51822r3

Simple English explanation is bottom side.
updated on Oct. 28th, 2017
Run on mbed-os-5.6, Special command ->'~' (ASCII 0x7e) (Changed form '*')
updated on Feb.10th, 2018
Run without any information for MAC address. Just specify a device name.

1.始めに

mbed内を検索しても、Client(Central)側の参考となるプログラムがあまり見当たりません。
少ない中でも、例えば下記のようなものがあります。
https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_ButtonSense/
https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_LEDBlinker/
上記は、それぞれ下記のプログラムとペアとなり、Client(Central)とSever(Peripheral)の役割を担当します。
https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_Button/
https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_LED/
更に、Kenta Matsumotoさんが、下記のプログラムを公開しています。
https://developer.mbed.org/users/mbed_tw_hoehoe/code/BLE_Nano_CentralTest/
私もこれらを参考にして動作させてみましたが、次のステップに進めませんでした。
次のステップとは、双方向通信を行うことです。
参考にしたプログラムは、Client→ServerもしくはServer→Clientの一方向通信で、それらを改造して双方向を目指したのですが、うまく動作させることが出来ませんでした。
そんな中でたどり着いたのが、 Fabien Comteさんの"NORDIC DEVELOPPER ZONE"での「s130 potential unstability case」の質問に添付してあったcode.txtファイルでした。
https://devzone.nordicsemi.com/question/49705/s130-potential-unstability-case/
残念ながら、彼の質問に的確な回答はありませんでしたが、このプログラムは双方向通信の答えとしては充分すぎる内容でした。
Fabien Comteさんに深謝します。

2.何が出来るか?

2台のmbedで双方向通信が可能です。

3.使い方

二つのTY51822r3を用意して、下記のプログラムをそれぞれに書き込みます。

Import programBLE_Uart_Client

BLE Client UART function


Import programBLE_Uart_Server

this is a new program based on BLE_Uart_Peripheral. Change program name due to relation Client&Peripheral to Client&Server


mbedのUSB端子をPCに接続し、仮想COMに通信ソフトをつなげば、キーボードの打ち込み内容が相手側の画面に現れます。
Clientからでもserverからでも、文字送受信が出来ます。
私は、一台のPC(Win7)上で2台のmbedをUSBポートに挿して(HUB未使用)、ふたつのTera Termを立ち上げて確認しています。
I/Oポートを使用するプログラムとなっていますが、何も接続しなくても通信機能は確認できます。
/media/uploads/kenjiArai/uart_client_server_s.jpg
Client側からは、*(半角アスタリスク)~(ASCII 0x7e /半角チルド)で始まるスペシャルコマンドで、例えば~vでServer側の電源電圧を表示することも可能です。
2017-10-28変更 /media/uploads/kenjiArai/teraterm1_xx.png

4.事前準備(重要)

updated on Feb.10th, 2018
デバイス名を指定するだけで、接続できるようになりました。
Client側、Server側の両方に、同じ名前を定義します。

// Client side
const char PEER_NAME[] = "UART_PJL";
// Server side
const static char DEVICE_NAME[] = "UART_PJL";

noboru koshinakaさんに教えていただきました。
/users/noboruk/
従来通りの場合には、

#define USE_MAC

を有効にすると下記のような準備が必要です。

ソースコード修正!

双方向通信をするには、準備が必要です。
先ず、BLE_Uart_Serverを単独で動作させてください。
通信ソフトの画面上に、
mac_board_? = {0x5f, 0x1a, 0x9e, 0x6a, 0x63, 0xdd}; ←表示されるHEXデータはそれぞれ違う
が表示されます。
この内容を、BLE_Uart_Clientのmain.cppの#warning "You need to modify below value based on your board."の下に反映します。
nRF51チップには FICR内にチップ固有の数値が埋め込まれていて、この値が使われるためにソースコードを修正する必要があります。

5.今後の展開

Server側には、nRF51_WakeUpのライブラリーが入っており、これを使って、例えば1時間毎に起動し、データをClient側が吸い上げることも可能です。
Client側から次の起動タイミングを決めることも可能ですから、複数のServerを時間差を設けて起動/休止させればかなりの台数からデータ収集することが可能でしょう。
複数Serverlを配したデータロガーシステムが構築できると思います。

a. Motivation

I have searched many times "BLE mbed Client" but I could get a few example in mbed world.
Those example can do only one way communication between Client and Server device.
I relay want to see "two way (mutual) communication" capability example.
In NORDIC DEVELOPER ZONE, I found a good example made by Mr. Fabien Comte as part of his Q&A session.
Thanks Mr. Fabien Comte for your big effort!

b. What kind of function?

This program can do tx/rx between Client and Server device both direction.

c. How to use it?

You need to prepare two Switch Science mbed TY51822r3.
You can see the communication progress using PC terminal software e.g. "Tera Term".
In my case:
PC: Windows 7
Terminal SW: Tera Term

d. Preparation

updated on Feb.10th, 2018
If you set a device name, you do NOT need following preparation anymore!

You should modify Client main.cpp before run the program!

You need to modify MAC address in main.cpp.
You can get the needed information by running "BLE_Uart_Server" program.
On the communication software screen, you can see following part.
mac_board_? = {0x5f, 0x1a, 0x9e, 0x6a, 0x63, 0xdd}; <- Contents are different!
nRF51 has an unique ID in FICR area and use it as MAC.

e. Next step

I would like to make "Data logger System with one Client and several Servers".
In the BLE_Uart_Server, you can see nRF51_WakeUp library and it can control deep sleep and wake up function.
The Client can control Server wake-up period and share the time for several Servers.


10 comments on BLE Client and Server using Switch Sience TY51822r3:

すみません、mbed初心者ですが、プログラムをインポートさせて使わせていただきたく存じます。  一度やってみたのですが、事前準備で、Ty51822R3のServer側を走らせて、TERA TERMに表示された MAC ADDRESSをclientの77行目に #warning "You need to modify below value based on your board." const Gap::Address_t mac_board_0 = {0xd2, 0x37, 0x7f, 0x78, 0x95, 0xee}; とコピペしました。 これで、SERVER,CLIENTともリセットボタンを押して接続確認したのですが、SERVER側が初期状態から変わりません。  何か、基本的な操作が、間違っているとおもうのですが、ご指導いただければ幸いです。

 宜しくお願いいたします。

09 Nov 2016

kenjiArai様ではないのに、発言してしまい恐縮なのですが、参考までに。

TY51822r3向けにインポートで、 mbed, nRF5182, BLE-APIのライブラリが必要な場合(BLE機能を使用する場合)、 softdevices130 v2.0.0を使うような設定になります。

その場合、BLE接続する場合、内部でアドバタイズを停止する関数コールでエラーが発生し、例外が起きます。その結果、haltしています。

mbedは、リビジョン113、nRF5182はリビジョン540、BLE-APIはリビジョン1041を使用することで、 softdevice s130 v1.0.0を使うようになります。

注意として、BLE-APIのリビジョン1041は、webのリビジョン管理からは使用することはできないので、スイッチサイエンスさんのサンプルをひとまずインポートして、BLE-APIがリビジョン1041となっているはずなので、それはコピーするようにします。

これで、オンラインでは、動作するビルドができるはずです。

しかし、オフライン開発のためにエクスポートすると、softdevice 関連やら、ターゲット用の設定ファイルが欠けたものがエクスポートされてしまいます。

以上です。ご参考になればよいのですが、外していたらすみません。

Satoshi Hasegawa様 ご親切なご指導ありがとうございます。 初心者なため、MBED操作がうまくできてません。 ble_apiの1041をどこからインポートしてくるのかわかりません。  SWITCH SCIENCEのどこからもってくればいいのでしょうか。 お手数おかけしてすみません。

10 Nov 2016

Satoshi Hasegawです。自分が実行したシーケンスです。webコンパイラを使用しています。

mbedの下記ページのExample programsセクションのmbed_EddystoneURL_Beacon_ssciを利用しました

https://developer.mbed.org/platforms/Switch-Science-mbed-TY51822r3/

mbed_EddystoneURL_Beacon_ssciのページに飛び、そのプロジェクトをインポートします。

webコンパイラで、右端のプログラムワークスペースでの作業

  • BLE_Uart_ServerでBLE_APIのリビジョンが1041であることを確認
  • BLE_Uart_ServerのBLE_APIを削除
  • mbed_EddystoneURL_Beacon_ssciのBLE_APIを選択し、右クリックしてメニューが出るのでコピーを選択
  • BLE_Uart_Serverを選択、右クリックしてメニューが出るのでペーストします。
  • LE_Uart_ServerのBLE_APIのリビジョンが1041になっていれば成功

以上が私が実行した作業です。

Satoshi Hasegawa様  再度にわたり丁寧なご説明有り難うございます。 私の操作が不案内なので、リビジョン確認画面のスクリーンショットをHTMLでアップしました。 http://www.maru-yo.net/BLE/BLE_Server_rivision.html ここで、BLE_UART_ServertのBLE_APIのリビジョンとEddystoneURL_BeaconのBLE_APIのリビジョンを確認した画面の スクリーンショットです。この確認操作でよいのか、ご確認いただいてから、本題にはいったほうがよいと存じます。

全くの初心者で、お手間をおかけして申し訳ございませんが、基本的な操作のご指導宜しくお願い致します。

14 Nov 2016

Satoshi Hasegawaです。 EddystoneURL_Beaconをインポートする場合に、最新のリビジョンにしてはいけません。

インポート時に、webブラウザでダイアログが表示されますが、Update:の項目が、最新のリビジョンにする・しないの選択をする項目です。このチェックボックスをONにしてはいけません。 ONにしてしまうと、mbed-リビジョン113、nRF5182-リビジョン540、BLE-API-リビジョン1041がインポートできないのです。

再度、削除してインポートしなおすか、インポート時に上記でのべたダイアログでプロジェクト名を変更してインポートして 先にpostしたライブラリのコピーをしてください。

Satoshi Hasegawa様  再三にわたりご丁寧なご説明有り難うございます。  Update無しにインポートしてリビジョンを確認してみました。  インポートファイル名 リビジョン (BLE_APIリビジョン / nrf51822リビジョン / mbedリビジョン)で下記です。

①BLE_Uart_Server 5:394920d 13 jun 2016 (1200:6615968 06 Apr 2016 / 637:f7faad3 11 Apr 2016 /121:6c34061 25 May 2016 )

②mbed_EddystoneURL_Beacon_ssci 6:30b60c0 26 Aprl 2016 (797:1316435 19 Aug 2015 / 638:c90ae14 14 Sep 2016 / 129:0ab6a29 6days,7hours ago)

 未だ操作、確認で不慣れな点があるみたいです。ご指導宜しくお願いいたします。

17 Nov 2016

Satoshi Hasegawaです。 スイッチサイエンス様のExample programsセクションから、mbed_EddystoneURL_Beacon_ssciを利用したのは、確かだたのですが、リビジョンは、今回の目的のものではなかったようでした。間違ったもので、何度もテストしていただいて、すみませんでした。

BLE_HTM_TY51822R3というプロジェクト(下記のページからインポートしてください。)

https://developer.mbed.org/teams/Switch-Science/code/BLE_HTM_TY51822R3/?platform=Switch-Science-mbed-TY51822r3

は、mbed-リビジョン113、nRF5182-リビジョン540、BLE-API-リビジョン1041でした。

Satoshi Hasegawa様  再三にわたりご丁寧なご説明有り難うございます。

おかげさまで、コンパイル無事通りました。

大変お世話になりました。

また、宜しくお願いいたします。

04 May 2019

Hello,

I am interested in using ble over uart to make two ble devices communicate over UART. Is this code compatible with other ble modules?

Please log in to post comments.