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ポートを使用するプログラムとなっていますが、何も接続しなくても通信機能は確認できます。
Client側からは、*(半角アスタリスク)~(ASCII 0x7e /半角チルド)で始まるスペシャルコマンドで、例えば~vでServer側の電源電圧を表示することも可能です。
2017-10-28変更
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:
Please log in to post comments.
すみません、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側が初期状態から変わりません。 何か、基本的な操作が、間違っているとおもうのですが、ご指導いただければ幸いです。
宜しくお願いいたします。