说明
cemu就是这个 http://cemu.info/ (之所以做这个是因为我xbox手柄没体感 + 闲的)
nodemcu硬件选的esp12,体感用mpu6050
目前勉强每秒17帧数据吧,lua语言真的不会
项目地址 https://github.com/feilongfl/wifi-gyro
测试用硬件
我真的懒得焊板子…


绿色的是逻辑电平转换,我也不知道这是什么鬼,以前从来没用过这货,这次竟然不用读取不出来数据,不然我几根线就连好了(就是不想焊板子…)mpu6050插在IIC0上面
准备工作
wireshark
nodemcu代码及编译工具
cemu作者提供的PadTest(https://files.sshnuke.net/PadTest_1011.zip)
cemu传感器协议
这个主要可以参考项目 https://github.com/hjmmc/WebGyroForCemuhook ,里面注释描述了整个cemu传感器包
整个协议我也描述在 https://gist.github.com/feilongfl/2fe93501561d46ba59689b6a26b91ec5 这个wireshark插件里面了(虽然偷懒了一些只描述了陀螺仪和加速度计).

我实际用到的只有三种报文,分别是电脑的ping,mcu的pong和传输传感器数据的报文,三种报文使用相应的头部算法
头部

定义了包头,版本号,包长度,校验,id和类型,crc使用的是特征值为 0xCBF43926 的crc算法,nodemcu固件库中不存在,可使用https://github.com/nodemcu/nodemcu-firmware/pull/2771 (由于nodemcu成员希望绝大多数包使用lua语言创建,所以这个pr被合并的可能性不大)
电脑端ping报文
这个数据是电脑发送出来用于识别器件的,mcu收到后需要响应

这个包不需要制作出来,收到后解析(解析时候可以偷懒,毕竟mcu性能有限(我的lua太渣)),可得到电脑ip和端口
mcu的pong报文
这个报文就需要自己制作了,里面写一些状态参数,电池,id什么的

这个包基本是常量,直接硬拼出来就行了
传感器数据报文
先声明所有的unused指的是我没用到(偷懒)协议里面是有用的

陀螺仪单位是°,加速度单位是g,都是浮点型
lua优化记录
这个货开始的时候每秒2包都不到,经过一番艰难爬坑终于能有个十七八包左右(凑合应该能用了吧).
首先,绝对不要使用table.insert函数,这个函数巨慢无比可以使用t[#t+1] = xxx
的写法,会快不少.
表的插入巨慢无比,因此在启动时先初始化包,以后每次仅修改有变化的位置
table序列化如果单纯使用lua去循环会奇慢无比,本来我制作了 https://github.com/nodemcu/nodemcu-firmware/pull/2774 来实现table序列化,但是被https://github.com/nwf指出修改了lua语言…好吧,这个库是lua的,nodemcu只是移植过来,不能乱改
不过https://github.com/nwf提供了lua的快速实现方法,利用unpack将table拆开送给string.char方法,不过这样的问题就是table里面只能存在数字,字符串是不可以的,也就是报文头部dsus和dsuc需要用ascii代替
mpu6050驱动在https://github.com/nodemcu/nodemcu-firmware/pull/2769不过同crc,他们更希望lua语言实现(这里在校准零点漂移需要注意喂狗,不然会重启)
float转化字符在https://github.com/nodemcu/nodemcu-firmware/pull/2773不过被指出可以用struct包实现(我没试,不过看文档好像可以)
启动的时候检查到lua文件则启动编译成.lc,按道理应该会快,不过我没感觉
尽量不要写死循环,用定时器代替,长时间循环注意喂狗
大量数据打印会浪费时间同时导致lua传输失败
目前还记得的就这些,想起来再补充 (最核心的就是lua太慢的时候就拿c来提速,逃:)
参考链接
https://github.com/hjmmc/WebGyroForCemuhook
https://nodemcu.readthedocs.io/en/master/
https://cemuhook.sshnuke.net/padudpserver.html
mpu6050 datasheet