PSoC6とModusToolbox IDE v1.1でBLEを試す
前置き
なんだかんだでPSoC63もわりと使えるかもしれないって思ってもらえれば幸い。
補足
ソースコードを逐一追って細かく解説はしません。IDEのインストールとか使い方はのりたんさんがQiitaで手取り足取り解説してくださっています。v1.0の解説だけど、v1.1でもそんなに変わりません。しらんけど。(おい
この記事でできること
- PSoC63ボードでBLE peripheralを作り notify / writeができるようになる。
- 外部からのシリアル入力をBLE notifyとしてセントラルに送ることができる
では参りましょう。
PSoC63基板の準備
プロジェクト一式
git cloneします
git clone https://github.com/panda5mt/psoc63_ble_notify_rtos.git
ModusToolbox IDEv1.1を起動しcloneしたプロジェクトをロードします。
評価ボード
CY8CPROTO-063-BLE
www.cypress.com
基板の書き込み用ファームウェアが古い場合があるので、最新のものに書き換えます。SW3(上の右側写真、親指で押している部分)を押しながらUSBに接続。
(以下はMacの場合です)
Terminal.appを起動し、fw-loaderでアップデートを行います。
/Applications/ModusToolbox_1.1/tools/fw-loader-2.1/bin/fw-loader --update-kp3
ModusToolboxにもどり、左下の[プロジェクト名] Program (KitProg3)
をクリックします
コンソールに書き込み中を示す
[ xx%] [############################ ] [ Programming ]
のような表示がしばらく現れたのち、
** Program operation completed successfully **
という文字がIDE内コンソールに出ていれば成功です。
この時点ですでにPSoC63評価ボードはBLEペリフェラルとして機能しています。
BLE Notifyのテスト
BLEセントラル(iOSデバイス)の準備
iOSデバイスをお持ちの場合は、LightBlueアプリから見ることができます。
p6xble
という名前が見つかれば一応ここまで成功です。
p6xble
をタップしてBLE接続しましょう。Notifyの確認をします。UUID:BBBB、0xCCCC(Properties: Notify)
をタップします。右上のHEX
をタップしUTF-8
に変更した方がわかりやすいと思います。Listen for notifications
をタップしてNotification受信待ちにしておきます
BLEペリフェラル(PSoC63)の準備
Terminal.appに戻ります。
sudo cu --parity=none --nostop --line /dev/tty.usbmodemxxxxx --speed 115200 Password:(パスワードを入力する) Connected.
tty.usbmodemxxxxx
のxxxxxは任意の数値になります。
ここでTerminal.app上で任意の文字を入力し最後にリターンを押すと、
BLE writeのテスト
次にLightBlueアプリのPeripheralのページに戻りUUID:AAAA、0xBBBB(Properties: Write)
をタップします.
右上のHEX
をタップしUTF-8
に変更した方がわかりやすいと思います。Write new value
をタップします。
任意の文字を入力し、最後に完了
またはdone
をタップします。例としてあいうえお
と入力しました。
あいうえお
をタップするたびにTerminalにWriteされた内容が反映されます。
Info : BLE - GATT write request Info : BLE - GATT read request write value = あいうえお Info : BLE - GATT write request Info : BLE - GATT read request write value = あいうえお ....
とりあえず動作確認はできました。
仕組み
Terminal.appからの入力(stdin)は評価ボード上のUSBシリアルを経由し、PSoC63のシリアルポートに入力されます。
// main.c,248行目付近 ble_commandAndData_t bleCommand = {.command = SEND_NOTIFICATION, .data=str }; xQueueSend(bleCommandDataQ, &bleCommand, 0u);
また、BLEタスクでWriteがあった場合は直ちにUSB-UART経由で出力(stdout)しています
// ble_task.c,355行目付近 case CY_BLE_EVT_GATTS_WRITE_REQ: { writeReqParameter = *(cy_stc_ble_gatts_write_cmd_req_param_t*)eventParam; DebugPrintf("write value = %s \r\n", writeReqParameter.handleValPair.value.val); }
応用
USB-UARTではなく別デバイスからの入力データをNotifyで送信する
例として、PSoC63のP9.0からのシリアル入力があった場合にNotifyを送信することができるようにしてあります。
ボーレートは38400baudです。先ほどとボーレートが異なりますので注意。
NMEAシリアル出力機能を持っているGPSモジュールなどの入力に使えるとおもいます。
// stdio_user.h, 157行目付近 #define IO_STDIN_UART KIT_UART_HW // この行のコメントを外す //#define IO_STDIN_UART UART_STDIO // この行をコメントにする
コンパイル後、書き込みをします。
Hibernateモードを有効化する
BLEペリフェラルはフィールドの要求に応じて、動作しない時電池の消費を極限まで抑える必要があります。
PSoC63もいくつかの消費電力を抑える機能を持っており、その一つがハイバネートモードです。
ほとんどのリソースを停止します。今回のコードではBLEセントラルからの接続が1分以上ない場合、基板上のスイッチSW2が押されるまで、Hibernateに遷移します。
この機能を有効化するには、以下のようにします。
// ble_task.c, 59行目付近 #define HIBERNATE_ENABLE 1 // ここを1にする
BLEセントラルからの接続を待つ待ち時間を変更したい場合は、そのすぐ上の行を変更します
// ble_task.c, 58行目付近 define TIMEOUT_INTERVAL pdMS_TO_TICKS(2 * 60000u) // 2分待つように変更
とこんな感じです。ちょっと長くなったのでここまでにします。
お疲れ様でした。
次回
BLE NotifyをLightBlueで確認するのはデータ量が増えるとすこし面倒です。
次回はRaspberry PiをBLEセントラルにして、PSoC63からのNotifyのデータをテキストや標準出力に表示するPythonコードを紹介します。