当前位置: 首页 > news >正文

[具身智能-396]:机器人舵机编码器的工作原理和示例

在机器人领域,舵机编码器是赋予舵机“感知能力”的关键元件,它让舵机从一个只能被动执行指令的“盲从者”,变为一个能够实时反馈自身状态的“智能”关节。

https://www.bilibili.com/video/BV134sFzwEXT

🧐 什么是舵机编码器?

舵机编码器是一种将舵机输出轴的机械旋转(角度、位置)转换为电信号的传感器。它作为闭环控制系统中的反馈环节,实时向主控板报告舵机的精确位置,使控制系统能够进行精准的修正和调整。

编码器 vs. 电位器

许多标准舵机(如SG90)内部使用电位器进行位置反馈。它结构简单、成本低,但存在明显缺点:

  • 精度较低:通常为几度的误差。
  • 机械磨损:滑动触点会随使用次数增加而磨损,影响寿命和稳定性。
  • 易受干扰输出的是模拟信号,容易受到电磁干扰。

相比之下,编码器(尤其是数字编码器)具有显著优势:

  • 高精度:分辨率可达0.1°甚至更高。
  • 长寿命:多为非接触式(如光学、磁性),无机械磨损。
  • 抗干扰强:输出数字信号,稳定可靠。

因此,在需要高精度控制的机器人关节、云台或机械臂中,使用带编码器的舵机或为舵机加装外部编码器是常见的做法。

⚙️ 编码器的工作原理

编码器主要分为两大类:增量式和绝对式。

增量式编码器

这种编码器通过输出连续的脉冲信号来工作。

  • 核心原理:编码器内部有一个码盘,旋转时会产生两路相位差为90°的方波脉冲(A相和B相)。
    • 判断方向:通过检测A相和B相信号的相位先后关系,可以判断旋转方向(顺时针或逆时针)。
    • 计算位置:控制器通过计算脉冲的数量来确定相对位移。例如,编码器每转一圈输出1000个脉冲(1000 PPR),那么每个脉冲就代表0.36°的转动。
  • 优点:结构简单、成本低、响应快。
  • 缺点断电后会丢失当前位置信息,重新上电时需要“回零”校准。
绝对式编码器

这种编码器为旋转范围内的每一个角度都提供一个独一无二的数字编码。

  • 核心原理:码盘上有多圈复杂的编码轨道,传感器读取这些轨道的组合,直接输出一个代表绝对位置的数字值(如二进制码或格雷码)。
  • 优点:上电即知当前位置,无需校准;抗干扰能力更强。
  • 缺点:结构复杂,成本较高。

💡 应用示例:为何需要编码器?

一个典型的应用场景是控制一个连续旋转舵机(也称360°舵机)精确转动指定圈数。

  1. 问题所在:普通的连续旋转舵机内部没有位置反馈(移除了电位器),它只能响应“正转”、“反转”、“停止”这类速度指令。你无法直接命令它“转5圈然后停下”,因为它不知道自己转了多少。

  2. 编码器解决方案

    • 加装“眼睛”:在舵机的输出轴上安装一个编码器(如磁性编码器AS5048A),让它实时监测舵机轴的转动。
    • 构建闭环:主控板(如Arduino)向舵机发送“正转”指令,同时持续读取编码器的数据。
    • 精确停止:程序设定一个目标值,例如转动10圈。主控板计算编码器反馈的脉冲数,当累计脉冲数达到10圈对应的数值时,立刻向舵机发送“停止”指令。

通过这种方式,一个原本“盲目”旋转的舵脉冲计数值机就变成了一个可以精确控制圈数和角度的智能执行器,可以应用于自动云台、卷帘门控制等需要精确定位的场景。

🛠️ 代码示例:读取编码器并控制舵机

下面是一个使用 Arduino 读取旋转编码器(如EC11模块)来控制普通舵机(如SG90)角度的入门示例。这模拟了“所见即所得”的控制方式:你转动编码器旋钮,舵机就跟着转动。

所需材料
  • Arduino UNO
  • SG90 舵机
  • EC11 旋转编码器模块
  • 杜邦线
硬件连接

表格

组件引脚连接到 Arduino
舵机VCC (红)5V
GND (棕)GND
Signal (黄)D9
编码器VCC5V
GNDGND
CLK (A相)D2 (中断引脚)
DT (B相)D3
SW (按键)(可选)
示例代码

此代码利用中断来精确、快速地读取编码器的转动,并控制舵机角度。

#include <Servo.h> Servo myservo; // 创建舵机对象 // 定义编码器引脚 const int encoderPinA = 2; // 连接到CLK,使用中断0 const int encoderPinB = 3; // 连接到DT volatile long encoderPos = 0; // 编码器位置计数,使用volatile因为在中断中修改 int currentAngle = 90; // 舵机当前角度,初始为90度 void setup() { pinMode(encoderPinA, INPUT_PULLUP); pinMode(encoderPinB, INPUT_PULLUP); // 附加中断服务函数到A相引脚的CHANGE事件 attachInterrupt(digitalPinToInterrupt(encoderPinA), readEncoder, CHANGE); myservo.attach(9); // 舵机连接到D9 myservo.write(currentAngle); // 初始化舵机到90度 Serial.begin(9600); // 开启串口监视 } void loop() { // 将编码器的计数值映射到舵机的0-180度范围 // 这里假设编码器转动一圈(40个计数)对应舵机转动180度 // 实际项目中需要根据编码器分辨率和舵机范围进行调整 int targetAngle = map(encoderPos, 0, 40, 0, 180); targetAngle = constrain(targetAngle, 0, 180); // 限制角度在0-180之间 // 只有当目标角度变化时才更新舵机,减少不必要的操作 if (targetAngle != currentAngle) { myservo.write(targetAngle); currentAngle = targetAngle; Serial.print("Encoder Pos: "); Serial.print(encoderPos); Serial.print(" -> Servo Angle: "); Serial.println(currentAngle); } delay(50); // 简单的延时,稳定读取 } // 中断服务函数:读取编码器A/B相,判断方向和计数 void readEncoder() { static uint8_t oldAB = 0; // 读取A、B两相的当前状态 oldAB = (oldAB << 2) | (digitalRead(encoderPinA) << 1) | digitalRead(encoderPinB); // 根据A、B相的相位关系判断旋转方向 if ((oldAB & 0x0F) == 0x07) { // 顺时针旋转 encoderPos++; } if ((oldAB & 0x0F) == 0x0B) { // 逆时针旋转 encoderPos--; } }
http://www.jsqmd.com/news/674719/

相关文章:

  • Rugged最佳实践总结:从新手到专家的完整成长路径
  • C语言编译报错:invalid suffix ‘x‘ on integer constant 的根源剖析与解决之道
  • 2026年评价高的不锈钢钛棒过滤器优质供应商推荐 - 品牌宣传支持者
  • 2026吹风机源头工厂外贸推荐:260手提吹风机/风力灭火机源头工厂实力解析 - 栗子测评
  • K210摄像头数据如何‘飞’上云端?ESP8266+MQTT实战教程,轻松对接阿里云IoT
  • 快速上手Gitee:从注册到代码提交全攻略
  • 如何快速掌握Spring Boot开发:全面实践教程与项目示例
  • 如何捕获与存储BullMQ错误堆栈:完整异常追踪指南
  • 2026靠谱装修公司推荐:装修施工一站式服务哪家好?家装施工装修公司+全屋装修设计服务推荐全整理 - 栗子测评
  • uniapp 实现身份证上传选择文件上传相册选择拍摄
  • Day04 完整学习计划 | 阿里云ACP大模型解决方案专家
  • 【万字文档+PPT+源码】基于springboot+vue的剧本杀服务平台-计算机专业项目设计分享
  • 别再手动抄代码了!用Python+efinance批量抓取A股全量数据(附完整脚本与MongoDB存储方案)
  • [具身智能-398]:AS5600磁编码器功能和管脚详解
  • 别再死记硬背了!用MySQL的`rand(0)`和`group by`亲手复现一次SQL报错注入
  • 2026年靠谱的层叠式过滤器/不锈钢层叠式过滤器厂家综合对比分析 - 品牌宣传支持者
  • 2026年全自动连线玻璃激光打孔设备厂商排行榜:专业公司推荐榜单 - 品牌策略师
  • 终极对比:Kitura vs Express 如何选择最适合你的Web框架?
  • 新手入门:AI超清画质增强镜像从部署到使用完整指南
  • 告别裸奔通信:手把手教你用Petalinux 2020.1为Zynq7000配置OpenAMP异构框架
  • Hive SQL进阶:用posexplode搞定‘多列同时炸裂’这个老大难问题(附完整避坑指南)
  • 如何快速上手Riak:10分钟构建你的第一个分布式应用
  • [具身智能-399]:AS5600 OUT信号以及PGO详解
  • Agent 出现幻觉怎么解决?RAG 检索准确率低怎么优化?Agent 多轮对话状态怎么管理?
  • C语言:指向数组的指针和指向数组首元素的指针
  • 程序员追不上机器人干脆开电瓶车跟;小米徐洁云辟谣“雷军被人堵在车里维权”;DeepSeek被曝融资20亿 | 极客头条
  • geogram实战案例:基于几何算法的10个工业应用场景解析
  • 兔抗53BP1抗体亲和纯化,高效富集目标蛋白,低丰度样品稳定输出
  • 终极指南:OCI内容描述符如何保障容器镜像的安全寻址与验证
  • 【万字文档+PPT+源码】基于springboot+vue的学生操行评分系统-计算机专业项目设计分享