目录
- 说明
- 一、SmartKnob简介
- 二、SmartKnob移植ESP32
- 2.1、电机部分
- 2.2、增加LED和按键
- 2.2.1、LED闪烁
- 2.2.2、按键
- 2.2.2.1、应变片方案
- 2.2.2.2、MT6701方案
- 2.2.2.3、实体按键
- 2.3、增加氛围灯
- 2.3.1、WS2812
- 2.3.2、FastLED 库
- 2.3.3、Freenove_WS2812_Lib_for_ESP32 库
- 三、SmartKnob移植STM32
- 四、重点说明
- 4.1、串口下载
- 4.2、零点校准
- 4.3、SmartKnob参数说明
SimpleFOC、ODrive和VESC 教程链接汇总:请点击
说明
1、SmartKnob源码使用SimpleFOC驱动电机,移植之前要有一定的SimpleFOC基础。
2、本篇主要移植了电机控制部分,其它如蓝牙、wifi、OLED显示屏没有涉及。
3、官方版本使用的是5V供电,本教程在现有驱动板的基础上移植,使用的是12V供电,smartknob中的参数可以直接用,但想要获得更好的效果还需要调试。
4、灯光色彩的变化可以让SmartKnob显得光彩夺目,本文专注电机控制核心技术,没有灯光的烘托,移植后的表现黯然失色,请理性面对。
一、SmartKnob简介
- SmartKnob 利用电机模拟机械旋钮的效果,且模式灵活多变,自带高级感,据说宝马的车内旋钮就是这样的。
- github网址:https://github.com/scottbez1/smartknob
二、SmartKnob移植ESP32
代码主要移植电机运动控制的算法,选择自己习惯的电机即可,本篇教程使用 2804电机 + AS5600编码器。
官方代码中使用MT6701编码器,本人也同时移植了MT6701和AS5047P编码器,只是AS5600的用户更加广泛,所以本篇教程以AS5600为例。
注意,请使用云台电机,航模电机有齿槽效应且功率大容易发热,并不适合当前应用场景。
ESP32drive 购买链接:某宝购买
2804电机 购买链接:某宝购买
代码资料 购买链接:某宝购买
2.1、电机部分
- 移植要先找到一个合适的示例,代码中不需要电流采样,所以简单点的就可以应对,
对这个代码不熟悉的,请阅读这篇教程:SimpleFOC之ESP32(三)—— 闭环控制
- 电机运动控制全靠算法,PID参数我做了较大修改似乎没有差别,保持官方一致,
-
核心算法如下,都是Arduino环境,移植还是比较简单的,复制粘贴,
移植的代码比较多比较碎,不再一一截图。
-
电机共有10种控制模式,对应不同的效果,
- 需要测试哪种模式,代码中配置。
每次只能体验一种模式,效率比较低,下面增加按键切换功能。
2.2、增加LED和按键
2.2.1、LED闪烁
- 上电点亮,进入主循环后闪烁,做为板子正常运行的指示。
2.2.2、按键
- 官方代码中提供了10种模式,按下电机时模式切换。
- 通过查看硬件设计和代码可以看出,按键的实现,原创者做了2种方案:应变片和MT6701。
2.2.2.1、应变片方案
应变片是一个电阻,电机被按压后PCB发生变形,应变片阻值变化,高精度的24位A/D转换器芯片 HX711采样,ESP32通过SPI接口读取HX711的采样值,
- 通过代码可以看出,震动分为2次,按下时强震,松开时轻震,
- 移植后的震动代码,下图:
2.2.2.2、MT6701方案
- 通过应变片检测按压,一致性差量产工艺复杂,而且按压寿命短可靠性估计也不高,
代码中使用MT6701,做为磁编码器,除了拥有较高的性价比外,还有按钮功能,而这个功能在当前的磁编码器中并不常见。
- 在原理图中可以看到这个引脚并没有使用,我理解为,这是一个 预留方案,
2.2.2.3、实体按键
- 本次移植,直接用板载 Boot 按键,可能不够炫,但足够实用,
2.3、增加氛围灯
底板上使用了8颗SK6812灯珠,按下按键,电机震动的同时色彩变化,效果会更好。
2.3.1、WS2812
WS2812和SK6812,可以理解为一样的灯珠,只是名字不同。
2.3.2、FastLED 库
- 代码中设置红色,实际灯珠点亮为绿色,搞了一上午没找到原因。
- 又找了别的库显示是正确的,“Freenove_WS2812_Lib_for_ESP32-1.0.5”,
- 不想继续查找原因了,本来这个氛围灯就不是重点。留给大家吧
2.3.3、Freenove_WS2812_Lib_for_ESP32 库
这个库比 FastLED 简单多了,色彩显示也准确,当然功能也少,
1、
2、
3、
4、
5、
6、
7、
8、
9、
- 添加灯光控制到代码中,只做了简单的红绿色变化。
- 最终效果
不得不承认,毫无美感可言。不过技术都到位了,我已经尽力!
B站视频:https://www.bilibili.com/video/BV1Gm4y187ya/?vd_source=33c70ef3713ea86e5385ac1e62223bcf
三、SmartKnob移植STM32
相比ESP32,STM32只移植了电机控制部分,没有移植按键,也没有移植氛围灯。
驱动板103 购买链接:某宝购买
电机 购买链接:某宝购买
代码资料 购买链接:某宝购买
1、本次移植是在第五篇教程的基础上移植,其实也可以在第四篇教程基础上移植,因为smartknob没有使用电流环。主要是考虑到第五篇支持更多的编码器类型,所以就用这个代码做基础了。
https://blog.csdn.net/loop222/article/details/121201638,
2、移植的时候修改了I2C的底层代码,I2C读编码器一直用的是片内外设,驱动板复位后经常会读不到AS5600的数据,需要断电重新上电才能恢复正常。修改后模拟I2C似乎好点。
3、keil不支持C++,所以ESP32的代码复制到STM32中,只需改下格式,总体还是比较简单的。
4、打勾 C99 Mode,格式变动幅度不用太大,提高移植的准确度。
5、模式切换,ESP32中通过按键切换,STM32板子上两个按键都不与GPIO连接,
本例中通过串口发送指令“K”实现模式切换,“K” 后面记得加上 回车换行。
6、代码支持以下编码器,
7、移植后的效果,B站视频:https://www.bilibili.com/video/BV1Gm4y187ya/?vd_source=33c70ef3713ea86e5385ac1e62223bcf
四、重点说明
4.1、串口下载
- 在曾经一个烧写器上千元的年代里,串口下载(ISP)做为一项黑科技,可以极大的降低开发成本并为量产提供便利,我一直都认为串口是最稳定最方便的下载方式。只是随着技术发展,有了更多的下载方式,突然发现很多年轻人不会用串口下载了,或者准确的说不会通过按键进入boot模式。
- 通过按键进入boot模式,我最先接触是在NXP的芯片上,后来STM32的芯片也用了相同的方法,随着STM32芯片影响的扩大,现在的芯片只要有boot模式,应该都是这个办法。
- 我不是抱怨年轻人不行,恰恰相反,我觉得我应该向年轻人靠拢,也许以后再设计ESP32的产品我会用USB接口。
进入boot的方法:
1、左手按下RST键不松开,右手按下Boot键并松开,然后再松开RST键,此时单片机进入boot模式。
2、点击Arduino上的上传,等待下载完成。
因为USB转TTL的兼容问题,有些会通信不上,需要重复操作几次,有些是死活都通信不上,需要更换USB转TTL。
4.2、零点校准
- SimpleFOC代码在驱动电机前要先 零点校准,获取电机的偏置角和方向,
- SmartKnob使用了SimpleFOC的库,所以也要 零点校准。
- 零点校准大概需要二十秒的时间,如果每次上电都校准比较麻烦且有负载情况下容易出错,
- 同一个电机,只需零点校准一次,写入参数后可以不用再校准的,
- 如果调整了电机三相接线,需要重新零点校准一次,
4.2.1、第一次使用,必须要零点校准,下图:
4.2.2、获取校准参数,下图:
多测几次,保证数据是准确可用的,
4.2.3、写入参数,重新编译上传
4.3、SmartKnob参数说明
- 官方代码目前给出了十种模式,完全通过调整参数实现,
- 通过十多天的操作,再对比这些参数,摸索出了一点规律,可能不准确,仅用于帮助大家理解参数。
如下图,定义起点到终点为 “一步”(position_width_radians),假如一步是10°,那么一圈就是36步(max_position - min_position)。
步距越大,电机转起来的颗粒感越大(粗糙);步距越小,电机转起来颗粒感越小(细腻)。
起点到中点阻力(detent_strength_unit)起做用,阻力越大转起来越费劲,手感越紧,
中点到终点推力(endstop_strength_unit)起作用,推力越大吸合感越强,
如果步距60°,只允许转动1步,那么就是开关模式,当然你也可以把步距调大到120°,行程更长,手感更好,
如果步距10°,允许转动36步,那么就是可以转1圈的粗糙的棘轮感。
如果步距1°,允许转动360步,那么就是可以转1圈的细腻的棘轮感。
参数设置要符合以下约束条件,修改时请注意,
(完)