在本教程中,我们将学习如何使用伺服电机构建Arduino Gimbal或自稳定平台。本教程实际上是前一个教程的扩展MPU6050教程。
我使用3D建模软件设计了Gimbal。它由3 Mg996R伺服电机组成,用于3轴控制,并放置MPU6050传感器,Arduino和电池的基座。
你可以在这里找到并下载这个3D模型以及用于3D打印的STL文件:
DIY万向节3D模型:
STL文件:
用我的Creality CR-10 3D打印机,我3D打印所有的部分,他们都是完美的。
组装
装配万向架很容易。我从安装偏航伺服开始。我用M3螺栓和螺母将它固定在底座上。
接下来,使用相同的方法我固定卷伺服。这些部件专门设计成容易地符合MG996R伺服伺服电池。
用于将部件彼此连接,我使用了与伺服伺服有附件的圆角。
首先,我们需要用两个螺栓将圆角固定在底座上,然后用另一个螺栓将圆角固定在之前的伺服上。
我重复这个过程,以装配其余的组件,俯仰伺服和顶部平台。
接下来,我通过伺服电线通过持有人的开口,以保持他们有组织。然后我插入了MPU6050传感器,用螺栓和螺母将其固定在底座上。
为了为项目供电,我使用了我放置在该电池夹中的2个锂离子电池。我使用两个螺栓和螺母将电池支架固定到底座上。
2个锂电池将产生7.4V左右的电压,但我们需要5V来为Arduino和伺服系统供电。
这就是为什么我使用buck转换器,它将转换7.4V到5V。
Arduino框架电路图
现在留下了什么,是将一切连接在一起。这是该项目的电路图以及一切都需要连接。
你可以从下面的链接获得这个Arduino教程所需的组件:
- MPU6050 IMU .....................................亚马逊/Banggood/aliexpress.
- mg996r伺服....................................亚马逊/Banggood/aliexpress.
- 巴克转换器 ....................................亚马逊/Banggood/aliexpress.
- Arduino Board .............................. ...... ......亚马逊/Banggood/aliexpress.
- 面包板和跳线............亚马逊/Banggood/aliexpress.
必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我的收入来自符合条件的购买。
最后,我把电子元件和电线挤进底座,用底部的盖子盖住它必威lol们。
通过这种自平衡平台或Arduino Gimbal,它可以按预期工作。剩下的是看看这个程序。
Arduino Code.
示例的Arduino代码是对MPU6050_DMP6示例的修改i2cdevlib库,Jeff Rowberg。
这里你可以下载代码:
代码说明:因此,我们正在使用输出可读的偏航,俯仰和卷。
//获取偏航,俯仰和滚动值#ifdef OUTPUT_READABLE_YAWPITCHROLL mpu。dmpGetQuaternion (q, fifoBuffer);微控制器。dmpGetGravity(重力、q);微控制器。dmpGetYawPitchRoll (ypr问,重力);//偏航,俯仰,滚动值-弧度到角度ypr[0] = ypr[0] * 180 / M_PI;ypr[1] = ypr[1] * 180 / M_PI;ypr[2] = ypr[2] * 180 / M_PI;//跳过300个读数(自校准过程)if (j <= 300) {correct = ypr[0];//偏航从随机值开始,因此在300个读数后获取最后一个值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
一旦我们得到值,首先我们把它们从弧度转换成角度。
//偏航,俯仰,滚动值-弧度到角度ypr[0] = ypr[0] * 180 / M_PI;ypr[1] = ypr[1] * 180 / M_PI;ypr[2] = ypr[2] * 180 / M_PI;
然后我们等待或做300个读数,因为这段时间传感器还在自校准过程中。同样,我们捕获了偏航值,它在开始时不像俯仰和横摇值那样为0,而总是一些随机值。
//跳过300个读数(自校准过程)if (j <= 300) {correct = ypr[0];//偏航从随机值开始,因此在300个读数后获取最后一个值j++;}
在300读之后,首先通过减去上面的捕获随机值将偏航设置为0。然后,我们将偏航,音高和滚动的值从 - 90到+90度映射到0到180的值,该值用于驱动伺服电脑。
//在300个读数后else {ypr[0] = ypr[0] - correct;/ /设置偏航0度- currrent值减去最后一个随机偏航值使偏航0度/ /地图MPU6050传感器的值从-90年到90年为伺服控制价值观suatable从0到180 int servo0Value =地图(ypr[0], -90年,90年,0,180);int servo1Value = map(ypr[1], -90, 90, 0, 180);int servo2Value = map(ypr[2], - 90,90,180,0); / ///根据MPU6050定位控制伺服伺服伺服0.write(servo0Value);servo1.write (servo1Value);servo2.write (servo2Value);}
最后使用写入功能,我们将这些值发送到伺服器作为控制信号。当然,如果您只想稳定x和y轴,您可以禁用偏航伺服,并将此平台作为相机万向节。
请注意,这远远距离良好的相机万宝路。动作不顺畅,因为这些伺服物质并不意味着这种目的。真正的相机万向手使用一种特殊类型的刷电机为了获得平稳的运动。因此,仅考虑此项目仅供教育目的。
这将是本教程的全部,我希望你喜欢它并学会了新的东西。请随意在下面的评论部分提出任何问题,不要忘记检查我的Arduino项目的收集bet188me。
这是奇妙的 - 这是我能够获得稳定的偏航读取的唯一代码,一旦它落下,它真的稳定,Quarthion调整真的很棒!
我唯一要补充的是电池线上的保险丝,以防短路。
很高兴听到这个消息。感谢您的输入!
伟大的项目...... ..创建步骤解释
你能做一个以MPU6050为特色的四轴飞行器项目吗?
干得好,IMU必须是相机安装的一部分,而不是把手,因为目标是稳定它!
谢谢你的建议。
哇! !我试着用基本的mpu数据读取来写我自己的代码,但问题是不稳定的,甚至在我应用了所有的条件后,这是唯一基于jeff rowberg的库和Dejan的代码创新如此顺利的代码。你因为浪费了那么多时间才得到了一个粉丝。(甚至在补偿! !)
快速问题。您是否还需要将GND从降压转换器连接到Arduino?此外,您的原理图表似乎展示您如何为您的Arduino板提供PWR。这也来自你的电池吗?或者您有单独的电源吗?
Buck转换器的GND应该和Arduino的GND相连。在电路图中,Arduino是通过连接到Buck变换器5V输出的5V引脚供电的。
你好,我试着在这个项目做一模一样的万向节,但是我遇到了你用的组件的一些问题。你能告诉我你没有提到的那些东西的规格吗?我写了下面的清单。
- 18650节电池容量(ex, 2600mA)
—M3螺栓长度
- 您使用的动作相机
- 圆角的直径
感谢阅读我的评论。
嘿,电池的容量并不重要,只是定义它可以持久的时间。
我使用的M3螺栓的长度是12或14mm。
动作摄像机也不重要。也不要期望与这个设置,以获得漂亮和平滑的镜头,这个项目只是显示了一个简化的工作概念。
圆角作为配件与伺服电机。
你好,德扬,
谢谢你这个循序渐进的项目。
我用电动机运行了一个问题,其中电动机在连续地在一个方向上开始旋转。一切都按照预期的偏航,俯仰和滚动电机与陀螺一起移动。但在一点之后,电机开始旋转,似乎失控。
关于如何排除故障有什么想法吗?
克里斯
阅读您的项目以学习使用MPU6050,并发现了一个问题。
mpu6050库在编写指南后进行了更新,所以您的代码将在安装时卡住,无法工作。
几个小时后,我发现这是因为它们添加了一个新的校准函数,您需要先调用它们。
所以,添加这三行
//校准时间:生成偏移并校准我们的MPU6050
mpu.CalibrateAccel (6);
mpu.calibraygyro(6);
mpu.PrintActiveOffsets ();
就在之前
mpu.setdmpleabled(true);
一切都会像魅力一样工作。
同时看着我的序列,我发现我的YPR值稳定需要很长时间。大约5〜10秒。这是正常的吗?