2020-10-10


title: Vorze SA 蓝牙协议(Cyclone A10 SA, UFO SA)
export_md: false
tags: 随笔
abbrlink: 865424390
date: 2019-01-04 10:31:56


Vorze SA Series (Cyclone A10 SA, UFO SA)

简介

Vorze SA系列是Rends Vorze系列玩具的蓝牙版本。

Vorze Cyclone SA它由一个可拆卸的滚筒组成,可以容纳一系列不同纹理的内胆。

UFO SA它有两个带有旋转元件的罩杯组成,可以连接不同纹理的刺激装置。

两者都允许通过蓝牙来控制硬件的旋转方向和速度。

设备识别

由于设备共享类似BLE GATT服务ID,因此可以使用其BLE设备名称进行识别。

对于Cyclone SA,蓝牙设备名称是CycSA

于UFO SA,蓝牙设备名称是UFOSA

蓝牙细节

Vorze玩具使用蓝牙BLE与其他机器进行通信。

使用下面的服务UUID

40ee1111-63ec-4b7f-8ce7-712efd55b90e

使用下面的写入数据特征UUID

40ee2222-63ec-4b7f-8ce7-712efd55b90e

USB无线发射器

Vorze玩具配有USB无线发射器,可以使用BTLE连接来模拟Windows上的串行端口。

这使得玩具可以轻松地用在所有没有BTLE功能的操作系统上,例如Windows XP/7/8OS X < 10.6或带有Bluez < 5.28的Linux等系统上。

与内置的蓝牙通讯不同,USB无线发射器的串行端口设置似乎对此无线发射器工作非常重要。

串口通信必须以19200波特 8/N/1运行 且无流量控制的方式来运行

使用任何其他波特率都会导致错误,并会导致机器需要重新上电才可恢复。

协议

要与Vorze设备进行硬件通信只需要使用简单的单向协议即可。

每个数据包由以下格式的3个字节组成:

0x01 0x01 0xe4 代表的意义是 设备ID字节 保留字节 方向和速度字节

蓝牙通讯协议传输上面的三个字节组成的数组作为一个完整的数据包

设备ID字节

在上面的例子中表示为0x01的16进制字节为设备ID

其定义如下:

设备名称 设备ID字节
Cyclone SA 0x01
UFO SA 0x02
PISTON SA 0x03
Bach Smart 0x00
保留字节

对于所有Vorze玩具,已经观察到保留字节总是为0x01

该保留字节是为Bach Smart振动器所使用的,其他设备都会使用0x01

方向和速度字节

在上面的例子中表示为0xe4的字节控制硬件的速度和方向。

方向由字节的首位指定。0表示顺时针转动,1表示逆时针转动。

速度由第3个字节的7个剩余位指定。

0-100的速度变化范围,所有速度设置大于100的参数都将被机器忽略。

例如:

要将Cyclone SA设备ID(字节1:0x01)设置为以50%速度顺时针旋转(字节3:
(通过16进制位运算:0x00 << 7 | 0x32得到0x32),最终发送的数据包:

0x01 0x01 0x32

要将UFO SA设备ID(字节1:0x02)以100%速度逆时针旋转(字节3:(通过16进制位运算:0x01 << 7 | 0x64得到0xe4),最终发送的数据包:

0x02 0x01 0xe4

超过100的速度将被忽略,因此,如果在数据包之后发送了下面的数据包

0x02 0x01 0xef

则玩具将以100%的速度继续旋转,该数据包将被忽略。

对于从CSV文件中读取的十进制数值也可先直接进行位运算再转为16进制数据

1 << 7 | 100 -> 得到228

228转16进制 -> 得到0xe4

CSV控制文件说明

控制文件为CSV格式。

每行代表一个控制信息,每个字段用英文逗号分割,换行结束。

每行从左至右共三个字段。

第一个字段为脚本执行动作时间,单位为 0.1 秒 例如:第10秒 100

在玩具未收到下一个数据包之前,玩具将一直执行上一个数据包中的内容

第二个字段为玩具旋转方向,0 顺时针转动,1 逆时针转动

第三个字段为玩具驱动力度,理论范围 0 (关闭)- 100 (最大)

对于SA设备来说,驱动力度小于45则驱动力过低,无法正常工作

蓝牙未收到新的数据包前会持续执行上一个数据包中的内容,

由于蓝牙通信延迟,CSV中过短的脚本时间间隔可能会产生问题。

例如:

10,0,50
18,0,0
20,0,50

会被一直执行10,0,50

过短的时间间隔似乎也会对驱动造成影响

例如:

10,0,50
15,0,0

则收到指令后不会转动

SA 设备按键的默认七档速度表

档位 数值
0 0
1 42
2 50
3 60
4 68
5 78
6 88
7 100