DIY

X Shifterの通信仕様について

(2020/07/11 記事修正しました)

はじめに

以前から気になっていた機械式コンポを無線電動化するキットX Shifterを購入して、BLE通信をハック。自作アプリやBLEデバイスで変速できるようにしました。
今回は手持ちのarduino nano33 BLEにスイッチを取り付け変速できるようにしました。

このページではarduino nano33 BLEでXSifterを変速できるようにするために必要なX Sifterの仕様と実際にarduino nano33 BLEで動作するソースコードについて記載します。
XSifterの仕様に関しては勘違いなどあるかもしれません。もし間違いなどありましたらご指摘いただければ幸いです。

■BLE通信仕様

・X shifterのスイッチ側がセントラル
・X shifterのモーター側(以下Elink)がペリフェラル
・Elinkのデバイス名はElin
・サービスUUID 1523(00001523-0000-1000-8000-00805f9b34fb)
・変速用キャラクタリスティックUUID 1524(00001524-0000-1000-8000-00805f9b34fb)
・状態通知用キャラクタリスティックUUID 1525(00001525-0000-1000-8000-00805f9b34fb)
・サービス1523の中にキャラクタリンスティック1524とキャラクタリンスティック1525が含まれている

通信プロトコル

①ペアリング
 通信確立後、初めにUUID1524に以下のバイトデータを書き込む。(認証処理?)これをしないと②,③,④のデータを送っても無視される。
 (1)アプリからの認証時のバイトデータ
 { 0xdf, 0x89, 0x1e, 0x6a, 0x6a, 0xd5, 0x7f, 0x75, 0xae, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
 (2)スイッチからの認証時のバイトデータ
 { 0xaa, 0xcf, 0x00, 0x00, 0x5d, 0x4a, 0x81, 0x89, 0x32, 0xf7, 0x52, 0x12, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00}
 (1)で認証を行うとスマートフォンアプリから接続ができなくなるので注意。(調整ができなくなる)
スイッチユニットを自作する場合には(2)のバイトデータで認証を行うようにする。
②変速-段数を指定
 段数を指定して変速する時は、UUID1524に以下のバイト列を書き込む。XXは変速したい段数-1(16進数(例えば00が1段目,0bが12段目))
  {0x1e, 0xXX, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }

③変速-シフトアップ
  UUID1524に{0x21,0x02,0x00,0x00}をWrite

④変速-シフトダウン
UUID1524に{0x21,0x03,0x00,0x00}をWrite

⑤現在の段数の取得
  UUID1525のサブスクライブを有効にしてUUID1524に{ 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }を送信。
  するとUUID1525に値が書き込まれるので値を取得。
  先頭の2バイトが {0a,cc}のバイト列の5バイト目が現在の段数-1となる(16進表記)