DIY Arduino 万向节 |自稳定平台
在本教程中,我们将学习如何使用伺服电机构建 Arduino 云台或自稳定平台。本教程其实是上一篇MPU6050教程的延伸。
您可以观看以下视频或阅读下面的书面教程。
我使用 3D 建模软件设计了云台。它由3个用于3轴控制的MG996R伺服电机和一个放置MPU6050传感器、Arduino和电池的底座组成。
您可以在 Thangs 的浏览器中找到并下载此 3D 模型,并进行探索。
STL 文件:
使用我的 Creality CR-10 3D 打印机,我 3D 打印了所有部件,它们非常完美。
组装云台非常容易。我开始安装偏航伺服。我使用 M3 螺栓和螺母将其固定在底座上。
接下来,使用相同的方法固定滚动伺服。这些部件经过专门设计,可轻松安装 MG996R 舵机。
为了将零件相互连接,我使用了作为伺服器附件的圆形喇叭。
首先,我们需要用两个螺栓将圆角固定在底座上,然后用另一个螺栓将它连接到之前的舵机上。
我重复了这个过程来组装其余的组件,Pitch 伺服和顶部平台。
接下来,我将伺服线穿过支架开口,以保持它们井井有条。然后我插入 MPU6050 传感器并用螺栓和螺母将其固定在底座上。
为了为项目供电,我使用了 2 节锂离子电池,我将它们放在这个电池座中。我用两个螺栓和螺母将电池座固定在底座上。
2 节锂离子电池将产生大约 7.4V 的电压,但我们需要 5V 来为 Arduino 和舵机供电。
这就是我使用降压转换器将 7.4V 转换为 5V 的原因。
现在剩下的就是将所有东西连接在一起。这是这个项目的电路图以及所有需要如何连接的东西。
您可以从以下链接获取本 Arduino 教程所需的组件:
最后,我将电子元件和电线挤入底座,并用底部的这个盖子盖住它们。
有了这个,自平衡平台或 Arduino 万向节就完成了,它按预期工作得很好。剩下的就是看一下程序了。
此示例的 Arduino 代码是 Jeff Rowberg 对 i2cdevlib 库中 MPU6050_DMP6 示例的修改。
你可以在这里下载代码:
代码说明: 所以,我们使用的是输出可读的偏航、俯仰和横滚。
一旦我们得到值,首先我们将它们从弧度转换为度数。
然后我们等待或读取 300 个读数,因为此时传感器仍在自校准过程中。另外,我们捕获 Yaw 值,它一开始并不是像 Pitch 和 Roll 值那样为 0,而是总是一些随机值。
在 300 个读数之后,首先我们通过减去上面捕获的随机值将 Yaw 设置为 0。然后我们将 Yaw、Pitch 和 Roll 的值从 – 90 到 +90 度映射为 0 到 180 的值,用于驱动舵机。
最后使用 write 函数,我们将这些值作为控制信号发送到伺服系统。当然,如果你只想稳定 X 轴和 Y 轴,你可以禁用 Yaw 伺服,并将这个平台用作相机云台。
请注意,这远非良好的相机云台。运动并不顺畅,因为这些伺服系统并非用于此目的。真正的相机云台使用一种特殊类型的 BLDC 电机来获得平稳的运动。因此,请将此项目仅用于教育目的。
这就是本教程的全部内容,我希望你喜欢它并学到了一些新东西。随时在下面的评论部分提出任何问题,不要忘记查看我收集的 Arduino 项目。概览
组装
Arduino云台电路图
Arduino 代码
// Get Yaw, Pitch and Roll values
#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
#endif
Code language: Arduino (arduino)// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
Code language: Arduino (arduino)// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
Code language: Arduino (arduino)// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
Code language: Arduino (arduino)
制造工艺