【吐槽】Vanwheel 升级led借助vesc lisp编程
我真的没想到会在这个项目上用那么长的时间,3-22入的群,到现在才搞得差不多。其实大部分时间都是在等快递,还有就是卡在一些愚蠢的问题上。
为啥要搞led,其实直接买成品led控制器也是可以的,灯光的效果还多,但是听说vesc 6系固件多了内置编程的功能,当时一听就觉得,卧槽,这可太强了,现在的电调竟然不满足于仅仅是驱动电机了,还把编程语言给嵌入进去了,可扩展能力肯定强啊,还有就是因为看了一万lvan那个群友分享vanwheel成品里各种diy灯光效果的展示,确实是吸引了我,而且发现一个问题,它们虽然都驱动了led,但是led的显示却不够smart,最简单的来说就是,不能像onewheel那样自动根据前进方向切换板头板尾灯光,我这么一想,嗯,这个好搞,不用费太长时间,然后就一脚踩进深渊里了。
我先写了esp32网页端(前端)和固件端(后端),为了方便以后盖上脚踏板后不用再掀开升级,加了ota升级,还有网页(文件)的更新接口,led使用了fastled,然后就开始愁一个问题,前后灯条显示单色的时候,设置一次就可以运行了,但是大部分时候,前后灯条需要循环一个动画,动画有自己的执行顺序,两个灯条又各自占有时间片,要怎么在arduino这个loop中去实现,然后找各种解答,说有什么xxxSchedule的包,还有其他什么多线程的包,结果都不好用,最后才发现 esp32内部竟然有一个freertos,这就好办了,直接使用操作系统中的任务创建就好了,在loop中判断条件,然后决定任务,一个任务绑定一个灯条,任务和灯条(物理位置)一一对应,任务和责任是一对多的关系,什么意思呢?一个 任务是一个task,一个task绑定了一个灯条的全部信息,这个task只负责某一个灯条,但是task执行的责任是可以切换的,可以执行板头也可以执行板尾。这些确定好以后,就只要写动画效果就行了,其他都由任务调度去决定就行了。
串口这块原以为从vesc直接接串口到esp32就算完成了,然后发现一个问题,有的时候串口可以通信有的时候不可以,经过来回几次实验,发现是在轮子转动的时候串口没消息,不转动的时候有消息,这是因为vanwheel运行的是vesc的balance app,里面有一个刹车设置,当滑板 不符合运行的条件的时候,轮子就会产生一个阻力方便人上去,那么这个阻力的动力不用说肯定来自三相线,因为串口没消息的时候vesc控制器的指示灯显示为绿色,代表正在运行,我肯定会想到是不是balance app自身会占用串口,因为如果是干扰的话,起码我会收到一两个正确的信息才对,但是问题比我想象的难得多,电机在刹车的时候,串口的消息全部都是错误的,我的消息一直都没有收到截止符,导致我的消息一直都累积在一起没有打印出来,偶尔还会造成esp32的崩溃。好吧,我先写一个checksum吧,先从vesc lisp开始,好家伙,那个语言是人写的吗?vesc作者还极力推荐我们用lisp试试看,我把所有的例子全看了一遍才把我想做的copy出来,过程别提多痛苦了,写完vesc这边发送结果arduino接收那边几分钟就写完了,高下立判,lisp就是个垃圾。然后就是发现之前说的,当电机转动的时候串口全部都是错误的消息。
颓了一段时间,完全不知道怎么办了,说串口通信要共地,我共了呀,接了同一个电源难道不是共吗?怪事,蓝牙接在vesc,也是串口通信就没问题,我从电源降压到5v接esp32,然后连接vesc和esp32的串口就不行,然后我就开始想,该不会是降压模块自带滤波吧,把vesc的干扰滤掉了导致两个设备不共地吧,ok,去搜了下买了个串口隔离adum1201,终于成功了
下面链接分享了 vesc串口发送脚本和esp32灯控固件以及为vanwheel做的pcb板
链接: https://pan.baidu.com/s/1aPvJzKMBEiB9uBr9SbTa0g?pwd=hhk6 提取码: hhk6