在本教程中,我们将学习如何使用伺服电机构建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和伺服系统供电。
这就是为什么我使用的降压转换器将转换为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·罗伯格的库和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秒。这是正常的吗?