首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

SmartKnob移植ESP32和STM32——棘轮手感

  • 23-09-28 03:42
  • 2101
  • 8347
blog.csdn.net

目录

  • 说明
  • 一、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没有使用电流环。主要是考虑到第五篇支持更多的编码器类型,所以就用这个代码做基础了。
http://iyenn.com/rec/391944.html,
在这里插入图片描述

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转串口驱动板
TXRX
RXTX
GNDGND

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圈的细腻的棘轮感。
在这里插入图片描述
在这里插入图片描述
参数设置要符合以下约束条件,修改时请注意,
在这里插入图片描述

 
 
(完)
 
 

注:本文转载自blog.csdn.net的loop222的文章"https://blog.csdn.net/loop222/article/details/130653623"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top