lynxeyedの電音鍵盤

組み込みとか電装とか

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

f:id:Lynx-EyED:20190320231803j:plain:h200f:id:Lynx-EyED:20190428000712p:plain:h200
2019年4月時点で価格は20ドル。

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)をクリックします
f:id:Lynx-EyED:20190428002420p:plain:h300
コンソールに書き込み中を示す

[ xx%] [############################    ] [ Programming ]

のような表示がしばらく現れたのち、
** Program operation completed successfully **という文字がIDE内コンソールに出ていれば成功です。
この時点ですでにPSoC63評価ボードはBLEペリフェラルとして機能しています。

BLE Notifyのテスト

BLEセントラル(iOSバイス)の準備

iOSバイスをお持ちの場合は、LightBlueアプリから見ることができます。

LightBlue® Explorer

LightBlue® Explorer

  • Punch Through
  • ユーティリティ
  • 無料

p6xbleという名前が見つかれば一応ここまで成功です。


f:id:Lynx-EyED:20190428005814j:plain:w150
f:id:Lynx-EyED:20190428155030j:plain:w150
f:id:Lynx-EyED:20190428160419j:plain:w150
先ほどのLightBlueで表示されたデバイス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.usbmodemxxxxxxxxxxは任意の数値になります。 
ここでTerminal.app上で任意の文字を入力し最後にリターンを押すと、
f:id:Lynx-EyED:20190428014505p:plain:w200

BLE writeのテスト

次にLightBlueアプリのPeripheralのページに戻りUUID:AAAA、0xBBBB(Properties: Write)をタップします.
右上のHEXをタップしUTF-8に変更した方がわかりやすいと思います。Write new valueをタップします。
任意の文字を入力し、最後に完了またはdoneをタップします。例としてあいうえおと入力しました。


f:id:Lynx-EyED:20190428155318j:plain:w200
f:id:Lynx-EyED:20190428160419j:plain:w200
f:id:Lynx-EyED:20190428161010p:plain:w200
f:id:Lynx-EyED:20190428161340j:plain:w200
このあいうえおをタップするたびに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のシリアルポートに入力されます。


f:id:Lynx-EyED:20190428232919p:plain:w400
シリアル入力があった場合にFreeRTOSのBLEタスクにNotificationを送信するキューを書き込みます。

// 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で送信する


f:id:Lynx-EyED:20190428234914j:plain:w400

例として、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コードを紹介します。