SmartKnob移植ESP32和STM32平台的详细步骤

目录

  • 说明
  • 一、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接口。
  • 1、接线:

    USB转串口 驱动板
    TX RX
    RX TX
    GND GND

    2、左手按下Boot键不松开,右手按下RST键并松开,然后再松开Boot键,此时单片机进入boot模式。

    3、点击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圈的细腻的棘轮感。


    参数设置要符合以下约束条件,修改时请注意,



    (完)

    物联沃分享整理
    物联沃-IOTWORD物联网 » SmartKnob移植ESP32和STM32平台的详细步骤

    发表评论