概要紹介
オンラインサクリングアプリのZwiftでは自転車のペダルを漕ぐ力出力:パワーの情報をもらって自転車のアバターが走行する仕組みとなっております。(ケイデンスなどでも可)
今回、通信環境の構築を一度したかったので試しにESP32のBLE通信を使って擬似的なパワー情報を生成してZwift内のアバターを動かしてみました。
環境
・Zwiftアプリ:iPad
・ESP32
github
参考元
BLE通信内容
参考元でほぼソフトはできていたので、自分のESP32のBLE通信の内容に合わせて更新したものとなります。まずは参考元をソフトを確認。
BLEService CyclePowerService("1818");
BLECharacteristic CyclePowerFeature("2A65", BLERead, 4);
BLECharacteristic CyclePowerMeasurement("2A63", BLERead | BLENotify, 8);
BLECharacteristic CyclePowerSensorLocation("2A5D", BLERead, 1);
ServiceID:1818, CharacteristicID:2A63 (Notifyが連続読込)となります。
short power;
unsigned short revolutions = 0;
unsigned short timestamp = 0;
unsigned short flags = 0x20;
byte sensorlocation = 0x0D;
bleBuffer[0] = flags & 0xff;
bleBuffer[1] = (flags >> 8) & 0xff;
bleBuffer[2] = power & 0xff;
bleBuffer[3] = (power >> 8) & 0xff;
bleBuffer[4] = revolutions & 0xff;
bleBuffer[5] = (revolutions >> 8) & 0xff;
bleBuffer[6] = timestamp & 0xff;
bleBuffer[7] = (timestamp >> 8) & 0xff;
powerを送信している部分が配列の[2]と[3]となっているので、適当にpowerに値を入れてBLUの送信変数の[2]と[3]に入れれば良さそうです。他の部分はちょっとよくわからないので、そのまま同じものを入れておきます。
今回使うソフトへの反映は下記。それぞれのUUIDに余分なものがついていますが初期の8桁の下4桁しか使用しないので、そこだけ先ほどのUUIDの値にします。
# include <BLEDevice.h>
# include <BLEServer.h>
# include <BLEUtils.h>
# include <BLE2902.h>
# define SERVICE_UUID "00001818-0000-1000-8000-00805F9B34FB"
# define CHARACTERISTIC_UUID "00002A63-0000-1000-8000-00805F9B34FB"
powerの値をloop周期に合わせて加算します。
adj_time += interval;
if(adj_time > 200){
power_add = 0;
adj_time = 0;
}else{
power_add += 1;
}
power = 100 + power_add;
buff[0] = flags & 0xff;
buff[1] = (flags >> 8) & 0xff;
buff[2] = power & 0xff;
buff[3] = (power >> 8) & 0xff;
buff[4] = revolutions & 0xff;
buff[5] = (revolutions >> 8) & 0xff;
buff[6] = timestamp & 0xff;
buff[7] = (timestamp >> 8) & 0xff;
あとはZwiftを起動して、パワーソースを選択します。”ESP32”の項目があるかと思いますので選択します。Zwiftの動作画面でPowerの値が変化していればOKです。
Zwiftにpower値を送れるようになったので、今後サイクリング用のデバイスを自作して連携できるようにしていきたいと思います。