1. 项目概述与核心思路
大家好,今天我想和大家分享一个非常实用的STM32项目——如何用STM32的PWM功能精准控制一个二维机械臂,并且实现摇杆控制和上位机控制两种模式。我自己在做这个项目的过程中踩了不少坑,也积累了一些经验,希望通过这篇文章能帮助大家少走弯路。
这个项目的核心思路其实很简单:我们使用STM32的定时器生成PWM信号来控制舵机,通过数学建模计算出机械臂末端要达到指定坐标时各个关节应该转动的角度,然后结合AD转换读取摇杆信号,再加上串口通信实现上位机控制。最终实现的效果就是,你可以用摇杆实时控制机械臂的运动,也可以通过电脑发送指令让机械臂自动移动到指定位置。
我选择的是STM32F103C8T6这款芯片,也就是我们常说的"蓝色药丸",因为它价格便宜、功能强大,而且资料丰富,非常适合初学者使用。机械臂结构方面,我用了两个舵机(MG996和MG90S)来实现二维平面的运动,再加上一个舵机控制电磁铁的升降,这样就可以实现抓取功能了。
2. 硬件搭建与电路设计
2.1 元器件选择与电源管理
在做这个项目时,元器件的选择真的很重要。我最初用的电源模块功率不够,导致舵机在运动时会出现电压跌落,机械臂就会抖动。后来换了一个DC电源模块,可以同时输出3.3V、5V和12V,问题就解决了。
关键元器件清单:
- STM32F103C8T6最小系统板 x1
- MG996舵机 x2(用于机械臂关节)
- MG90S舵机 x1(用于电磁铁升降)
- PS2摇杆模块 x1
- 12V电磁铁 x1
- 3.3V继电器 x1
- 12V锂电池 x1
- DC电源模块(多路输出)x1
电源部分要特别注意:STM32需要3.3V供电,舵机需要5V,电磁铁需要12V。我建议用锂电池接DC电源模块,然后分别给各个部分供电。千万不要尝试用STM32的GPIO直接给舵机供电,那样肯定会烧芯片的!
2.2 电路连接细节
接线时我建议先用面包板做原型,确认一切正常后再焊接。STM32的引脚分配很重要,我的是这样安排的:
PWM输出引脚:
- PA1 - TIM2_CH2 - 控制第一个关节舵机
- PA2 - TIM2_CH3 - 控制第二个关节舵机
- PA3 - TIM2_CH4 - 控制电磁铁升降舵机
AD转换引脚:
- PA6 - ADC1_CH6 - 读取摇杆X轴
- PA7 - ADC1_CH7 - 读取摇杆Y轴
串口通信:
- PA9 - USART1_TX
- PA10 - USART1_RX
继电器控制:
- PB12 - 控制电磁铁开关
实际接线时,舵机的信号线(一般是橙色或白色)接STM32的PWM输出引脚,电源正极接5V,负极接地。摇杆模块的X、Y输出分别接PA6和PA7,电源接3.3V。电磁铁通过继电器控制,继电器线圈用3.3V驱动,触点端控制12V电磁铁。
3. 位置解算算法实现
3.1 数学模型建立
要让机械臂末端到达指定的(x,y)坐标,我们需要知道两个舵机应该转动的角度。这就用到了逆运动学算法。我把机械臂简化成了两个连杆:L1是第一个关节到第二个关节的长度,L2是第二个关节到末端的长度。
在我的项目中,L1=9.6cm,L2=11.0cm。根据三角几何关系,我们可以推导出角度计算公式:
// 计算末端到原点的距离
L = sqrt(x*x + y*y);
// 使用余弦定理计算角度
Ib = (L1*L1 + L*L - L2*L2) / (2*L1*L);
Ic = (L*L + L2*L2 - L1*L1) / (2*L*L2);
a = atan2(y, x); // 基础角度
b = acos(Ib); // 第一个关节角度
c = acos(Ic); // 第二个关节角度
Angle1 = a - b; // 最终第一个关节角度
Angle2 = b + c; // 最终第二个关节角度
这里有个特殊情况需要处理:当机械臂完全伸直时(L1+L2 = L),上面的公式会出现除零错误,需要单独处理。
3.2 算法验证与调试
我强烈建议先在电脑上验证算法再写到STM32中。我用Visual Studio写了一个测试程序,输入坐标计算出角度,然后再用这些角度计算回坐标,看是否一致。
// 验证函数
C_AStruct Check_Angle(float Angle1, float Angle2)
{
C_AStruct result;
// 将角度转换为弧度
float rad1


138

被折叠的 条评论
为什么被折叠?



