尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Arduino Due自制Braccio机械臂扩展板:从电平转换到PCA9685驱动全解析

Arduino Due自制Braccio机械臂扩展板:从电平转换到PCA9685驱动全解析 1. 项目缘起从“吃灰”的Arduino Due到桌面机械臂手头有一块Arduino Due开发板性能比Uno强不少但很多经典的扩展板Shield因为引脚定义和电压问题并不能直接插上用。这板子就这么放着总觉得有点浪费。正好一直想搞个桌面机械臂玩玩用来抓取小物件、写写字或者单纯作为个酷炫的摆件。市面上成熟的桌面机械臂套件要么太贵要么是封闭系统可玩性不高。这时我注意到了Arduino官方出品的Braccio机械臂。它的设计很经典结构清晰有现成的库和教程。但问题是Braccio的官方控制板Shield是为Arduino Uno或Mega设计的无法直接兼容我的Due。官方的Braccio Shield使用了特定的引脚映射和PWM伺服控制芯片而Due的引脚布局、工作电压3.3V和PWM生成方式都不同直接插上不仅可能不工作甚至可能损坏伺服电机或开发板。于是一个想法诞生了为什么不自己动手为Arduino Due量身打造一块Braccio机械臂扩展板呢这不仅仅是简单的引脚转接更涉及到电源管理、信号电平转换、以及如何利用Due更强大的性能比如更多的PWM输出、更快的处理速度来提升机械臂的控制精度和流畅度。这个DIY过程既能彻底“盘活”手头的Due又能深入理解机械臂控制的核心硬件原理比直接买套件有成就感得多。2. 核心需求分析与方案选型为Arduino Due设计一块Braccio兼容盾不能是简单的“照葫芦画瓢”。我们需要先彻底理解原版Braccio Shield的工作原理然后针对Due的特性进行重新设计。2.1 原版Braccio Shield拆解原版Braccio Shield的核心功能可以概括为三点伺服电机驱动控制6个舵机通常4个用于底座、肩、肘、腕部俯仰1个用于腕部旋转1个用于夹爪。它使用了一片PCA9685 PWM伺服驱动芯片。这片芯片通过I2C与Arduino通信可以独立产生16路12位精度的PWM信号完美解决了Uno/Mega原生PWM输出不足且精度控制麻烦的问题。电源管理机械臂的舵机尤其是大扭矩的舵机工作电流很大单个堵转电流可能超过1A。原版Shield设计了一个外接电源接口常用7-12V DC并包含一个开关和一路5V稳压例如通过LM7805给Arduino板供电同时另一路电源通常经过一个二极管直接供给PCA9685芯片和舵机。这里的关键是舵机电源与Arduino逻辑电源的分离与共地避免电机噪声干扰核心控制。引脚映射与扩展Shield将Uno的特定引脚如SDA, SCL用于I2C某些数字引脚用于预留功能引出并保留了其他引脚供用户使用。2.2 Arduino Due的特殊性与挑战Due与Uno/Mega的主要差异构成了我们设计的挑战与机遇工作电压Due的逻辑电平是3.3V而绝大多数舵机包括Braccio常用的控制信号是5V TTL电平。直接用Due的IO口驱动5V舵机可能存在信号识别不可靠的问题长期使用也可能对Due的引脚造成压力。引脚布局Due的引脚排列与Uno完全不同因此原版Shield的物理接口无法兼容。PWM能力Due拥有多达12路原生PWM输出引脚2-13且精度更高。这让我们思考是否还需要PCA9685直接用Due的PWM驱动舵机是否可行性能Due基于32位ARM Cortex-M3内核84MHz主频性能远超8位的AVR。这意味着我们可以运行更复杂的运动学算法、轨迹规划甚至未来接入计算机视觉库。2.3 DIY方案决策基于以上分析我制定了两个主要方案方案A保守兼容方案复刻核心适配接口核心继续使用PCA9685伺服驱动芯片。这是最稳定、最接近原版体验的方案。PCA9685本身由5V供电其输出信号是5V完美匹配舵机。关键改造电平转换Due的3.3V I2CSDA1, SCL1需要经过双向电平转换模块如TXS0108E后再连接PCA9685确保通信可靠。电源设计保留外接电源输入7-12V一路通过DC-DC降压模块如LM2596得到稳定的5V供给PCA9685和舵机另一路通过低压差稳压器LDO得到3.3V单独给Due供电。两路电源共地。这里一个重要的经验是即使Due可以通过USB供电也强烈建议使用Shield上的独立电源为Due供电以确保系统稳定避免因USB供电能力不足导致的重启。接口定义重新设计PCB使排针孔位与Due的引脚布局完全匹配。方案B激进性能方案Due直驱核心摒弃PCA9685直接利用Due的12路原生PWM输出引脚驱动舵机。优势简化硬件降低成本并且由于Due的PWM由软件直接控制理论上响应更快更易于实现高级控制算法。巨大挑战电平不匹配必须为每一路PWM信号增加3.3V转5V的电平转换电路例如使用74HCT245这样的缓冲器其输入兼容3.3V输出为5V。电流考虑Due的单个IO口驱动能力有限虽然驱动舵机信号线输入阻抗高通常没问题但经过缓冲器更保险。软件负担需要自己编写或移植舵机控制库管理多达6路PWM的精度和角度映射这比使用现成的Adafruit_PWMServoDriver库针对PCA9685要复杂。我的选择与理由 我最终选择了方案A。原因在于DIY的首要目标是“可靠实现功能”PCA9685是经过市场验证的专用方案其16路独立12位PWM输出能提供非常平稳的舵机运动软件上有成熟的库支持极大降低了开发门槛。而方案B虽然硬件更简洁但电平转换电路设计、软件驱动稳定性都需要大量调试不确定性高。先追求稳定可用再考虑优化升级这是硬件DIY中的一个重要原则。我们可以把Due的强大算力留给上层运动控制而不是底层PWM生成。3. 硬件设计与核心电路详解确定了方案A就可以开始具体的电路设计。我使用立创EDA进行原理图绘制和PCB布局。3.1 核心电路模块拆解3.1.1 电源模块这是整个盾板的“心脏”设计不当会导致系统不稳定、舵机无力甚至损坏控制器。输入接口采用标准的5.5*2.1mm DC插座输入电压范围7-12V。并联一个电源开关方便断电。舵机电源通路输入电压经过一个肖特基二极管如1N5822防止反接后直接连接到一片大电流的DC-DC降压模块例如LM2596可调模块的固定5V版本。这一步将7-12V降至稳定的5V/3A以上输出专门用于驱动6个舵机。务必注意舵机在启动和堵转时电流极大电源必须留有充足余量。建议选择持续输出电流不低于3A的降压模块并在电源输入和输出端并联大容量电解电容如470uF-1000uF以缓冲电流冲击。控制板电源通路从上述5V舵机电源后再接入一片低压差稳压器LDO如AMS1117-3.3将其转换为3.3V为Arduino Due供电。这样设计保证了Due和舵机系统共地且Due的电源相对干净。一个关键细节在AMS1117的输入和输出端都需要紧贴引脚放置0.1uF和10uF的陶瓷电容进行滤波这是保证3.3V电源纯净、系统稳定的关键。3.1.2 主控与信号转换模块Arduino Due接口设计两组双排排母严格按照Due的引脚顺序包括两侧的电源引脚进行定义。确保物理上可以严丝合缝地插上。I2C电平转换Due的I2C1引脚SDA1-引脚20 SCL1-引脚21连接到一个双向电平转换芯片如TXB0108或TXS0108E。这类芯片可以自动识别方向将3.3V信号转换为5V信号与PCA9685通信反之亦然。注意TXB0108系列对上下拉电阻有要求需严格按照数据手册设计。PCA9685电路按照其数据手册设计。核心包括连接转换后的I2C信号SDA, SCL。外接一个精度较高的晶振通常25MHz以获得稳定的PWM频率。设置I2C地址的跳线A0-A5默认全为0地址是0x40。VCC接5V舵机电源V也接5V舵机电源如果舵机工作电压是5V。OE输出使能引脚可以接一个Due的GPIO方便软件全局禁用舵机输出这是一个安全特性。16路PWM输出引脚PWM0-PWM15通过排针引出我们只需要前6路。3.1.3 舵机接口与保护接口定义使用标准的3针舵机接口信号Signal 电源VCC 地GND。将6个接口整齐排列并清晰标注对应关节如Base, Shoulder, Elbow, Wrist Vert, Wrist Rot, Gripper。保护电路在每个舵机信号线与地之间可以串联一个220-470欧姆的电阻作为轻微的限流保护。更重要的保护是在电源线上。强烈建议为每个舵机接口的VCC引脚增加一个自恢复保险丝PPTC例如500mA的规格。当某个舵机卡死导致电流激增时保险丝会断开保护整个电源网络故障排除后又能自动恢复。这是从多次烧毁元件的教训中学来的宝贵经验。3.2 PCB布局与布线要点原理图正确只是第一步PCB布局布线决定了最终板的性能和抗干扰能力。电源路径优先首先规划电源的走线。从DC输入插座到降压模块再到舵机接口排针这条路径上的走线要尽可能短、尽可能宽。我会使用至少40mil约1mm的线宽来承载大电流。5V电源网络最好在PCB的底层或顶层进行铺铜以降低阻抗。数字与模拟/电源分离将PCA9685及其晶振、I2C线路等数字部分与DC-DC降压模块这类开关电源部件在布局上适当远离。如果空间允许可以在它们之间留出一定间隙或用地线进行隔离。去耦电容就近放置给AMS1117、PCA9685、Due的3.3V输入引脚附近放置的0.1uF陶瓷电容必须紧贴芯片的电源和地引脚回路面积最小化。这是抑制高频噪声最有效的措施之一。接口位置人性化DC电源插座、开关、舵机接口的位置要考虑到实际组装和使用时的方便性。例如舵机接口最好放在板子边缘方便插拔线缆。完成布局布线后生成Gerber文件就可以发送给PCB制板厂如JLCPCB进行生产了。为了美观和耐用可以选择沉金工艺并涂上阻焊层。4. 软件配置与机械臂库移植硬件焊接组装完成后就进入了软件环节。目标是让Arduino Due通过我们自制的Shield像原版Braccio一样控制机械臂。4.1 基础库安装与I2C通信测试安装必要的库在Arduino IDE中通过库管理器安装Adafruit PWM Servo Driver Library。这个库用于控制PCA9685。编写I2C扫描程序由于我们使用了电平转换芯片第一步是确认Due能否正确识别到PCA9685。上传一个简单的I2C扫描程序到Due查看串口监视器。如果一切正常应该能看到地址0x40或其他你设置的地址被扫描到。如果扫描不到首先检查焊接有无短路/虚焊电平转换芯片是否正常工作测量输入输出电平PCA9685的电源和地是否接好I2C上拉电阻通常PCA9685内部已集成但外部加4.7k上拉到5V也可能需要是否合适。4.2 适配Braccio库原版Braccio库Braccio.h/Braccio.cpp是直接针对使用特定引脚映射的Uno和Mega的它内部可能直接操作了某些硬件寄存器。对于DuePCA9685的方案我们需要进行“软”适配。核心思路是创建一个新的“BraccioDue”库或者修改原库将其底层控制舵机的部分替换为通过Adafruit_PWMServoDriver库向PCA9685发送指令。具体步骤理解原库结构原版Braccio.begin()函数会初始化各舵机引脚和初始位置。我们需要新建一个初始化函数例如BraccioDue.begin(addr)其中addr是PCA9685的I2C地址。在这个函数里初始化Adafruit_PWMServoDriver对象并设置PWM频率通常舵机为50Hz即周期20ms。重写舵机控制函数原库的核心是Braccio.ServoMovement()或类似函数它接受每个关节的角度值。我们需要重写这个函数将角度值例如0-180度转换为PCA9685需要的“脉宽计数”值。公式通常是pulse map(angle, 0, 180, SERVOMIN, SERVOMAX)。其中SERVOMIN和SERVOMAX是脉宽为0.5ms和2.5ms时对应的PCA9685计数器的值。由于PCA9685是12位精度4096级对应50Hz频率每周期4096计数计算如下每计数时间 20ms / 4096 ≈ 4.88us。0.5ms脉宽对应计数 0.5ms / 4.88us ≈ 102。2.5ms脉宽对应计数 2.5ms / 4.88us ≈ 512。实际上不同舵机的中位和行程可能有细微差异所以SERVOMIN和SERVOMAX可能需要微调例如设为100和500。这里一个重要的技巧是不要写死这些值最好将它们定义为全局常量方便在程序开头统一调整。提供角度到脉宽的映射函数创建一个私有函数writeAngle(int servo_num, int angle)它内部完成上述计算并调用pwm.setPWM(servo_num, 0, pulse)来驱动指定通道的舵机。4.3 示例代码与校准完成库适配后可以写一个简单的测试程序。#include Wire.h #include Adafruit_PWMServoDriver.h #include BraccioDue.h // 你的适配库 Adafruit_PWMServoDriver pwm Adafruit_PWMServoDriver(0x40); BraccioDue arm; // 假设你的类叫这个 void setup() { Serial.begin(9600); // 初始化PCA9685设置频率50Hz pwm.begin(); pwm.setPWMFreq(50); // 初始化机械臂设置初始角度 arm.begin(); delay(2000); // 等待舵机就位 } void loop() { // 示例让机械臂执行一个简单动作 // 参数顺序可能是底座肩部肘部腕部俯仰腕部旋转夹爪 arm.move(90, 45, 180, 0, 90, 10); // 移动到某个姿势 delay(3000); arm.move(0, 90, 90, 90, 0, 73); // 移动到另一个姿势 delay(3000); }至关重要的校准过程 上传程序后机械臂可能不会精确地到达你期望的位置。这是因为舵机中位90度对应的实际脉宽可能不是严格的1.5ms。舵机的运动范围可能不是标准的180度。机械臂的物理安装可能存在零点偏移。你需要一个校准程序逐个驱动每个舵机从0度到180度缓慢变化观察机械臂的实际运动。记录下每个舵机在机械极限位置不卡住时对应的脉宽计数即SERVOMIN和SERVOMAX以及中间位置如90度的计数。将这些校准后的值更新到你的BraccioDue库中。切记校准时要轻柔避免舵机堵转。这是整个项目中最需要耐心的一步但也是保证机械臂动作精准的基础。5. 系统集成、测试与性能优化当硬件和基础软件都跑通后就可以进行系统集成和进阶测试了。5.1 组装与静态测试机械结构组装按照Braccio的机械图纸或套件说明将舵机、支架、连杆、夹爪等部件组装起来。注意螺丝不要拧得过紧导致塑料件开裂也确保每个关节转动顺滑没有明显的阻力。电气连接将组装好的机械臂各舵机线对应插入自制Shield的接口。确保电源极性正确棕色/黑色线通常是GND。上电前最后检查万用表检查电源输入有无短路确认Due已通过USB连接到电脑用于上传程序和监控Shield上的电源开关处于关闭状态。分步上电测试先打开Shield电源开关观察Due是否正常启动电源指示灯亮。然后通过串口发送单个舵机控制命令观察每个关节是否单独正常运动。此时应密切注意舵机是否有异响抖动、吱吱声、电源模块或芯片是否异常发热。5.2 动态测试与问题排查进行连贯动作测试时可能会遇到以下典型问题及解决方案问题现象可能原因排查与解决方案动作卡顿、不流畅1. 电源功率不足导致大负载时电压跌落。2. PWM信号频率不稳定或有毛刺。3. 舵机本身性能差或机械阻力大。1.使用示波器或万用表监测5V电源线在动作时看电压是否稳定在5V以上。如果跌落严重需升级电源适配器或DC-DC模块。2. 检查PCA9685的晶振电路确保焊接良好。在代码中确认setPWMFreq(50)已正确执行。3. 尝试单独驱动该关节舵机如果仍然卡顿可能是舵机质量问题或机械安装过紧。舵机无法到达指定角度到达即回弹舵机扭矩不足无法克服机械臂在某个姿势下的重力矩。这是桌面机械臂的常见问题尤其在肩部和肘部关节。解决方案a) 更换更大扭矩的舵机如从9g舵机换为20kg-cm的舵机。b)优化动作轨迹避免让机械臂长时间处于“力臂最长”的全伸展状态。在运动学控制中可以规划更省力的路径。c) 减轻末端执行器夹爪的重量。控制一段时间后舵机位置出现漂移1. 舵机在持续受力下产生位置误差。2. PCA9685或Due因温度变化产生微小漂移。3. 电源噪声导致PWM信号基准变化。1. 这是廉价舵机的通病对于精度要求不高的应用可以接受。如需高精度需选用带位置反馈的数字化舵机。2. 确保PCA9685和Due的电源滤波电容充足且靠近芯片。3. 在控制逻辑中可以加入周期性归零或位置反馈校正如果使用带反馈舵机。I2C通信偶尔失败1. 电平转换电路不稳定。2. I2C线路过长或受到干扰。3. 电源噪声影响。1. 检查电平转换芯片的电源和地是否稳定尝试在I2C线SDA, SCL上加更小的上拉电阻如2.2kΩ以增强驱动能力。2. 尽量缩短Shield与Due之间的连接。3.在代码中加入错误重试机制例如如果一次I2C写入失败延迟几毫秒后重试一次。5.3 利用Due性能进行进阶优化硬件稳定后就可以发挥Due的性能优势了更平滑的运动轨迹原版Braccio库的运动可能比较“生硬”。我们可以利用Due强大的算力在move()函数中实现梯形速度规划或S曲线规划。不是直接让舵机从角度A跳到角度B而是计算出一系列中间角度和每个角度之间的延时让舵机以匀加速、匀速、匀减速的方式运动这样动作看起来会非常柔和、专业。逆运动学控制不再直接控制每个关节的角度而是告诉机械臂“把夹爪移动到空间中的某个坐标x, y, z”Due自动计算出每个关节需要转动的角度。这需要编写或移植逆运动学算法。Due的浮点运算能力通过软件FPU使得这些计算可以快速完成。外部通信与控制通过Due额外的串口Serial1, Serial2, Serial3或USB Host功能可以连接蓝牙模块、Wi-Fi模块甚至直接与电脑上的Processing、Python程序通信实现远程控制或更复杂的视觉伺服控制。完成这个DIY项目后你得到的不仅仅是一个能动的Arduino Due机械臂更是一套完全由自己掌控的、从硬件电路到核心控制软件的机器人开发平台。它可能没有商业产品那样精致的外壳但每一个细节你都了如指掌后续的任何功能扩展和性能优化你都知道从哪里入手。这种深度的掌控感和解决问题的能力正是硬件DIY最大的乐趣所在。
返回列表