首页 / 资讯中心 / 文章详情

把档位写进代码:SmartKnob 开源触觉反馈旋钮完整上手指南

把档位写进代码:SmartKnob 开源触觉反馈旋钮完整上手指南 ★ FEATURED ARTICLE
把档位写进代码SmartKnob 开源触觉反馈旋钮完整上手指南【免费下载链接】smartknobHaptic input knob with software-defined endstops and virtual detents项目地址: https://gitcode.com/gh_mirrors/smar/smartknobSmartKnob 是一个软件定义止动点software-defined endstops与虚拟凹轮virtual detents的开源智能旋钮项目你按到的每一格卡位、每一端阻力、每一次按压回弹都可以通过代码在运行时重新定义。本文带你走完硬件选型、固件烧录、串口连接全流程并给出可以直接抄的调参起点。它解决什么问题旋钮手感不再是物理定死的普通旋钮的手感由机械结构决定齿轮数、弹簧力矩、限位塑料块出厂即固定。而 SmartKnob 把手感变成了一组可写的参数。原理一句话磁编码器实时读出轴的角度PID 控制器根据角度算出该施加多少反向扭矩电机无刷云台 BLDC通过 FOC 力矩控制把扭矩顶回你的手指。于是旋钮有多少格 → 由min_position/max_position决定每格多宽 → 由position_width_radians决定每格咔哒多强 → 由detent_strength_unit决定两端多硬 → 由endstop_strength_unit决定还能通过detent_positions只在部分档位磁吸其余位置顺滑通过也就是说同一颗旋钮下一秒就可以从10 格细档变成3 格粗档或干脆变成无级旋转。这就是软件定义触觉。五分钟跑起来两条路径看到第一格卡位结论先说完整体验用View 板自研 PCB带 240x240 圆屏快速上手可以用社区的NanoFOC DevKit选nanofoc编译环境即可固件开箱可用。第一步获取源码并编译git clone https://gitcode.com/gh_mirrors/smar/smartknob cd smartknob pio run -e view # 或 pio run -e nanofoc pio run -e view -t upload第二步校准。上电后固件会要求一次电机校准测量极对数、零位电角度偏移和转向结果存为MotorCalibration持久配置。预期效果校准完成后旋钮可被电机平稳托住不再自由乱转。如何验证用手轻拨旋钮松开后它应缓慢回到最近的档位中心而不是停在原地。第三步连上你的电脑验证。项目自带 Python 示例进入 software/python/ 后按目录内 Pipfile 配置环境运行 simple_example.py。按下回车发送一份配置config.min_position 0 config.max_position 5 config.position_width_radians math.radians(10) config.detent_strength_unit 1预期效果旋钮立刻变成 6 档0~5每档占 10°有明显的咔哒感。如何验证拧动旋钮终端会按current_position0→5 变化打印 State 消息屏幕如装配了 LCD同步显示当前档位和文字。⚠️ 官方 README 明确提示这不是即插即用项目。View 板涉及小间距 SMD 焊接推荐 stencil 回流或热风动手前建议先读一遍原理图。硬件并不复杂但选型有坑结论先说整套 BOM 不神秘真正的坑只有一个——电机的齿槽转矩cogging。核心部件一览部件型号关键参数在系统里的角色电机32mm 转子空心轴云台 BLDC32mm 转子 / 15mm 总高 / 5.9mm 空心轴 / 内置径向磁铁力矩输出 自带编码器磁铁磁编码器MT6701MagnTekSSI/I2C/ABZSSI 带 CRC角度测量推荐电机驱动TMC6300-LA2–11V 输入1.2A RMS3x3mm QFN六路 FOC PWM主控ESP32-PICO-V3-02Lilygo T-Micro32 Plus921600 波特率串口运行固件显示GC9A01 圆屏240x240 SPI实时显示参数灯环SK6812-SIDE-A x8侧发光环绕旋钮电机为什么这么讲究你希望关掉凹轮时旋钮完全顺滑这就要求电机断电时也不该有位置吸附。但几乎所有便宜云台电机的转子在断电时都会跳格——这就是齿槽转矩。它会直接干扰甚至压过你的虚拟凹轮尤其是低强度或细密档位。README 的 FAQ 直言社区测过的便宜云台电机基本全都不行推荐的这颗32mm 空心轴款是当时唯一称得上合格的现货。编码器三选一编码器评价主要问题MT6701推荐噪声小、SSI 带 CRC、响应快无低功耗模式美国分销商难买TLV493D常见适合原型有 breakout 板噪声大需滤波内部 ADC 有已知锁死缺陷固件里专门写了检测与复位逻辑AS5600便宜易买噪声更大强磁体下需 8–10mm 气隙防饱和PCB 下单注意两点来自 electronics/ 目录下的 KiCad 工程主控板用白色阻焊层反射 RGB 灯环的光、板厚1.2mm而非默认 1.6mm屏幕板必须 1.2mm丝印上的 0.6mm 是 VHB 胶厚度别混淆。固件内部一个虚拟凹轮是怎么算出来的固件是 FreeRTOS 多任务架构入口在 main.cpp显示任务与串口接口任务跑在 core 0电机控制任务独占 core 1任务间用队列通信。核心在 motor_task.cpp 的主循环每 1ms 一次做四件事loopFOC()完成磁场定向控制检查命令队列校准 / 新配置 / 触觉播放判断是否该切换到下一个档位——这是虚拟凹轮的灵魂if (angle_to_detent_center snap_point_radians_decrease) { current_detent_center config.position_width_radians; current_position--; }旋钮偏出当前档位中心超过吸合点snap_point典型 0.5–1.5构成迟滞档位中心就向前平移一个position_width_radians位置计数加一。之后 PID 的比例项以离档位中心多远为输入输出把旋钮拉回中心的扭矩——卡位感就是这样凭空造出来的。通过 protobuf 广播当前状态current_positionsub_position_unit几个值得知道的设计细节保护机制转速超过 60 rad/s 时直接输出零扭矩防止越拧越紧的正反馈失控D 参数自适应细档位用小 D 防止放大传感器噪声粗档位放大 D 制造清脆咔哒snap_point_bias把吸合点偏离中心做出小心放会停住、稍用力弹回 0 位的非对称手感detent_positions最多声明 5 个磁吸档配合滚动发送实现任意多档位的稀疏分布通信协议串口 921600 波特率protobuf 消息 COBS 帧定界 CRC32 校验协议定义见 smartknob.proto位置用press_nonce/position_nonce做去重与强制刷新从剪辑时间线到音频混音它接上软件后能干什么结论触觉旋钮的价值在于用阻力传递信息所以接入方式决定了体验上限。官方 README 里给了两个最有代表性的演示设想视频剪辑时间线jog 轮滚动时你能摸到片段边界切到播放速度模式后旋钮带弹簧回位在 1x/2x/4x 处吸附音频混音给不同通道旋钮设置不同position_width_radians物理上区分粗调/细调浏览器端接入用 WebSerial核心封装在 software/js/packages/smartknobjs-webserial/示例应用见 example-webserial-basicconst serialPort await navigator.serial.requestPort({ filters: SmartKnobWebSerial.USB_DEVICE_FILTERS, });预期效果连接后调用sendConfig()修改任意参数旋钮手感即时变化界面实时收到 State 回显。如何验证把detentStrengthUnit从 0.5 改成 0手感应立刻从10 格变无级顺滑。Node.js 端则有 smartknobjs-nodePython 端复用 smartknob_io.py底层协议实现COBS 解码、CRC32 校验、250ms 超时重传都在这几包里自写集成时值得通读一遍。调参与避坑最影响手感的 5 个参数参数典型范围调大的效果起点建议position_width_radians3°~30°/档每格更宽、P 项误差更大、手感更钝10°math.radians(10)detent_strength_unit0~1咔哒更硬1 可能不稳定1endstop_strength_unit0~1两端更顶手0 则无阻力但位置仍受限1snap_point0.5~1.5吸合更晚需要拧过更多角度才换档0.7~1.1snap_point_bias0 起吸合点偏移做出非对称可复位手感0常见问题对照来自 README 与源码注释旋转不平滑、有顿挫→ 先确认电机齿槽转矩是否超标其次检查FOC_LPF低通参数适当加大平滑有可闻/可感的嗡鸣→ 通常是 PID 的 D 项放大了编码器噪声TLV493D 上尤其明显换 MT6701 或加滤波凹轮切换不灵敏/跳档→snap_point至少 0.5固件会拒绝更低值并打印日志同时检查编码器安装气隙电机发热→ 调低FOC_VOLTAGE_LIMIT与FOC_PID_LIMIT默认 limit 为 3越界时临时抬到 10换过电机/装配→ 重新执行校准否则零位偏移与转向判断全部失效 一个实用技巧固件基于 SimpleFOCmotor.monitor_downsample打开后可用 SimpleFOC Studio 通过串口实时改 PID 参数比改代码重烧快得多。资源地图从这里继续你想做什么去哪里看总览、BOM、FAQREADME.md改/读固件firmware/src/电机motor_task.cpp显示display_task.cpp串口serial/改通信协议proto/smartknob.proto generate_protobuf.py 重新生成 nanopb画 PCBelectronics/view_base/ 与 electronics/view_screen/KiCad 工程附 JLCPCB 导出脚本机械结构cad/README.mdFusion 360 模型索引需打印 Enclosure、Knob、ScreenPlatform、RotorSpacer、MountBase、BackPlate 共 6 件写上位机software/python/、software/js/ 两套示例社区与方向项目作者在 README 里挂了 Discord 社区入口遇到问题或想晒作品直接去那边。路线图包括迁移 ESP32-S3 模块省内存跑 WiFi/MQTT、显示层迁移 LVGL、Home Assistant 集成。软件/电子/文档为 Apache 2.0硬件与机械结构为 CC BY 4.0见 LICENSE.txt商用二次分发需保留署名。️ 总结一句SmartKnob 把手感从机械加工变成了软件配置。先跑通pio run -e view和 Python 示例把五个参数在手上拧出直觉剩下的集成工作——时间线、混音器、任意你自己的应用——都只是往队列里发一条 Config 消息的事。【免费下载链接】smartknobHaptic input knob with software-defined endstops and virtual detents项目地址: https://gitcode.com/gh_mirrors/smar/smartknob创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站