SmartKnob移植ESP32和STM32

news2024/9/20 20:47:48

目录

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



(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[ACTF新生赛2020]fungame 题解

开辟了一块内存空间,然后有两个函数,进入第一个跟一下 将输入的字符串进行异或,后比较, 解一下 y1[0x23,0x61,0x3e,0x69,0x54,0x41,0x18,0x4d,0x6e,0x3b,0x65,0x53,0x30,0x79,0x45,0x5b] y2[0x71,0x04,0x61,0x58,0x27,0x1e,0x4b,…

vue项目中main.js使用方法详解

目录 一、main.js文件解析 二、Vue.prototype的作用与使用 三、Vue.use的作用以及什么时候使用 1、组件 World 组件 2、定义一个index.js文件,并引入 两组件 ,并导出: 3、在 main.js 中引入index.js 4、全局使用(不用引入直接可以使用…

ESD静电监控仪如何提示设备阻值异常

在电子厂的生产过程中,静电是一个不可避免的问题。静电的存在会给电子产品的生产带来很多危害,因此,防静电措施是必不可少的。静电会对电子元器件的性能产生影响。电子元器件对静电非常敏感,即使是微小的静电电荷也可能会对元器件…

功能测试的6中方法你知道多少

对于测试人员而言,软件产品每个按钮的功能是否准确,链接是否能正常跳转,搜索时会不会出现页面错误,验证并减少这些软件使用过程中可能出现的各种小问题都是功能测试的内容。而对于用户而言,功能能否正常执行都是非常直…

新来了个23岁的测试员,本以为是菜鸡,没想到是扮猪吃老虎

咋这金3银4都完了还有人来面试的,一看简历,嘿?23岁,这不刚毕业的小毛孩子嘛,结果没想到人家上来就把现有的项目都测了一遍,找出一堆bug,给公司节解决了不少的麻烦,这种“王炸”打法&…

webpack手动配置一个vue3项目

感觉学webpack和vite比登天还难啊,所以只是止步于能用和一些基础的配置比如proxy等等。因为自己是看培训班视频入的门,有些东西不是非常清楚(话说清楚了不还是个前端),关于如何拓展自己的职业宽度,每个人有自己的想法,…

Qt消息的理解

分析 信号是什么,信号与槽(Signals&Slot)是QT编程的基础,也是Qt的一大创新。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作变得更加直观和简单。 信号(signal)就是特定下被发射的事件。 槽就是对信号响应的函数&#xf…

如何解决MySQL limit深分页问题

1、limit深分页为什么会变慢? 先看下表结构: CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键Id,name varchar(255) DEFAULT NULL COMMENT 账户名,balance int(11) DEFAULT NULL COMMENT 余额,create_time datetime NOT NULL …

机器视觉是如何实现激光焊缝追踪系统

随着工业科学技术的发展,机器更换的地方越来越多,现在一些焊接工作交给了机器,其核心技术是: 激光束追踪传感器通过计算,将激光放大后投影到被测量物的表面,其反射光透过高质量的光学系统并投影到成像矩阵…

二叉堆讲解

二叉堆讲解 大顶堆和小顶堆 从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。 堆性质:父亲的权值不小于儿子的权值(大根堆&#x…

AI制作视频——mov2mov以及inpaint

背景 AI制作视频的几种思路 1.从零开始生成:清华的cogview,runway gen-1、gen-2,微软的女娲 这个思路,就是认为可以通过文字描述的方式把视频画面描述出来,通过对文本-视频帧内容-视频内容的数据对的平行语料的学习…

微软限制我们使用Windows系统了,怎么办?

正如中国工程院院士倪光南所说,操作系统的成功与否,关键在于生态系统,需要搭建起完整的产业链上各个主体共生的生态体系。 当前我国国产操作系统市场发展很快,相比技术和市场突破,真正需要解决的问题是如何把生态建好…

Jvm-08a.类加载器

类与类加载器 对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。 通俗的讲就是比较两个类是否"相等",只有在这两个类是由同一…

设计模式实战 | 迭代器模式 | 分词器

1、场景 假设有下面这样一个字符串属性, 代表着属性逐级调用, 我们需要解析出每一个字段属性方便我们后续进行业务处理。 String properties "school.teacher[语文].student[3].user[4].english.score";2、传统写法 遍历该属性字符串然后不…

ChatGLM-6B模型结构组件源码阅读

一、前言 本文将介绍ChatGLM-6B的模型结构组件源码。 代练链接:https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py 二、激活函数 torch.jit.script def gelu_impl(x):"""OpenAIs gelu implementation."""r…

k8s系列(三)——kubernetes架构及部署

引入 在正式引入K8s之前,我们先来看一张图 虚拟化技术演历路径可分为三个时代: 物理机时代,多个应用程序可能跑在一台物理机器上; 这种方式会造成一旦某个服务出现溢出或者未知的错误,从而影响机器上所有服务的正常…

C++ -- 红黑树封装set和map

文章目录 1. 红黑树概念和性质1.1 概念1.2 性质1.3 实例1.4 分析 2. 节点定义3. 插入操作4. 检测5. 红黑树代码6. 红黑树实现set和map6.0 类设计图6.1 红黑树包装复用6.2 红黑树实现set6.3 红黑树实现map6.4 剖析代码6.4.1 如何复用6.4.2 如何区分set和map比较方式6.4.3 set和m…

如何用appuploader上架

转载:下载和安装appuploader IOS开发工具官网地址 Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 最新版本已经优化了没支付688给apple的账号登录流程,无需再安装其他软件。…

SDK案例配置记录

目前的极简配置 注意事项 默认的属性配置中,大多采用环境变量的形式,方便不同设备通用 比如“常规”->“输出目录”为 $(SolutionDir)..\bin\win_msvc2017$(Platform)\$(Configuration)\案例运行前的配置(除MwBatchSimPlugin&#xff0…

如何评估用户需求的价值?关键看4方面

一、需求本身是否有价值 评估一个需求是否有价值,主要是通过以下几个方面:需求的产生源、需求产生的时机(情景价值)、需求如何产生(问题解决价值)、需求如何解决(解决需求)。 在情景…