购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

用ardunio制作无刷万向节

作者: Jonah Grubb 翻译:石头 校对:katrina tips 原文

这是个由andreas biekert和jonah grubb于2014年春天在波莫纳学院做的电子项目。感谢Whitaker教授,Tony Grigsby和波莫纳学院物理系我们的项目目标是制作用一个从加速度计/陀螺仪获得输入信号,并用arduino uno来控制的两轴无刷万向节。稍微解释一下,万向节是一个通过电机来消除摄像头抖动的稳定系统。消除撞击是首先要解决的问题,而我们的最终目标是创建完全稳定的镜头。“无刷”指的是无刷电机,这个我们稍后一点再作更详细的解释。我们能找到的其他所有万向节项目都是用万向节标配的驱动板来控制的,因此我们想通过更底层的方式来达成这个目标。我们期望制作一个不需要这些板子而是使用更具通用性的arduino uno来控制的无刷万向节。

不得不承认我们虽然没有搞到想找的万向节,但我们确实了解了设备的工作原理。所以我们把一些改进的方向和想法写了下来。希望这至少是一个良好的开始。如果你有任何问题和改进建议,都可以联系我们。

在学习如何控制无刷电机和与加速度计交互的过程中,我们翻阅了一些与项目相关的资料。在后面我们将参考一些用于在本项目中控制无刷电机的材料或照片。我们的代码主要是基于上述马达控制项目和带有控制MPU6050芯片示例代码的I2C库。非常感谢这两个项目给了我们努力的方向。

这一类的项目很多实现的方法。而用Arduino Uno就是其中一种主流的方法。我们在亚马逊上买了一个框架和无刷电机组。当然你也可以直接3D打印一个更合适的框架,但我们对这个项目的电子部分更感兴趣,所以直接购买了一个成品,这样更加方便快捷。加速度计也是从亚马逊上购买的:加速度计/陀螺仪GY-521电路板,是我们找到的最便宜的MPU6050模块了。虽然便宜,但用在这个项目里已经可以满足需求了。坏了一块,所以不得不再去订一块新的。到现在我们还没有弄清楚是不是因为我们的过失而弄坏的。

我们曾用了两个Mauser 511-L298 h-bridges(带散热器)来控制电机———后面还有更详细的介绍。它们能够给电机提供更高的驱动电压和电流,这样电机就能够移动框架和摄像。

其它的小组件还有2个2.2k的电阻,3个0.1μF的电容,还有一些配线:).

◆ 步骤1:无刷电机控制(第一部分-概念和原理)

无刷直流电机高效,精确,并且有足够的扭矩,因此使用在这个项目中是比较理想的;关键在于实际控制它们。一般的做法是去买块可编程的电子调速器,这类板子可以带动风门输入并将将其转化成无刷电机转速。但是那玩艺挺贵的,最便宜的也要20美刀,所以我们决定节省开支并搞清楚怎样可以不用那些板子去控制电机,不同于有刷直流电机简单的通过换向器改变在永磁场中线圈的电流方向来工作,无刷电机在定子和转子的线圈之间没有物理连接。最常见的无刷电机就是三相无刷电机。三相无刷电机有三组不同的线圈,一般用A,B,C表示。三组交叉线圈把永磁体包围起来。

我们的电机有12个线圈或者说3个电磁体(4个线圈一个)还有转子上的14个永磁体我们的想法是改变电磁体的极性,从而使永磁体跟着磁场变化转动。最简单的形式是,我们有三个电磁体(A,B和C),转子只是一个简单的NS永磁体。如果我们使得A为北极磁场B为南极磁场,C关闭。永磁体会尽量的与刚产生的磁场对齐。然后我们把电磁铁的极性旋转一个位置(A关闭,B北极,C南极)永磁体会跟着转动。通过这种方式我们就可以靠一组整流相位来使转子转动,当然我们也能让转子反方向转动。看一下下这两段视频,里面有清晰明了的图解。

视频一

http://player.youku.com/embed/XNzM0MDk3NzAw

视频二

http://player.youku.com/embed/XNzM0MjYxNjM2

我们之前做了一些研究,发现如果输入一组相位差120度的正弦波到电磁体的话,我们就能创建一个动态的磁场来驱动电机转动。通过引入正弦信号来改变电磁体的磁性使电机的动作平滑。

这个网站很实用,它把刚才提到的理论都转换到了Arduino中。实现这种方式的窍门在于用arduino来输入pwm信号,因为pwm信号只有高(1)和低(0),所以我们还需要一块H Bridge,这样我们才可以输出负极信号从而控制线圈的极性。

无刷电机最大的挑战就是,如果你要很好的控制这玩意,你必须知道转子相对于定子的位置。只有这样控制器才能准确知道开始或是跳到某个换向周期。我们希望加速度计能给我们这个反馈,做到这一点就算是一个阶段性的成功。更复杂的办法包括使用用霍尔感应器监测转子位置,或是在线圈中使用”反电势”。

◆ 步骤2:实现无刷电机控制

引入H-Bridge来控制电机,来满足万向节的双向性要求,同时也使得电机的转动也很平滑。H-Bridge可以改变电磁铁中的电流方向,还可以产生高,中,低三档不同的电压。就如在之前的引言中提到过的,我们使用的是15个引脚的L298 h-bridges如图所示我们把他们连接起来。

下面是数据表

·引脚1:地线

·引脚2:电机引脚1

·引脚3:电机引脚2

·引脚4:外部电源电压(一个0.1μF电容接地)

·引脚5:Arduino的PWM数字输出(引脚3或9)

·引脚6:Arduino的+5 V(一个0.1μF电容接地)

·引脚7:Arduino的PWM数字输出(引脚5或10)

·引脚8:地线

·引脚9: Arduino的+5 V

·引脚10:Arduino的PWM数字输出(引脚6或11)

·引脚11: Arduino的+5 V

·引脚12:不连接

·引脚13:电机引脚3

·引脚14:不连接

·引脚15:地线

‘我们的参考的代码给出了一个非常巧妙的结构来生成正弦信号。通过在正弦函数上等距抽样的48个点,用0-255(8比特)的数字信号来表示每一点的电压,然后输出到A B C三个电磁体,三组输出之间刚好相差16个值的间隔。也就是相位差刚好120度。只是简单的有序的循环输出这个数列中的所有状态值,就能产生正弦波。结果arduino控制输出的信号,让电机运转的很平滑,当然你怎么搞也突破不了电机本身的物理速度限制。

我们使用了跟参考代码里一样的PWM正弦数组,我们的数字算法允许我们用给定的步长来推算出正弦信号中相应点的电压值,于是我们把采样点由48个提升到96个,这样我们能更精准地控制电机。我们的电机并不需要整圈的旋转,只需要根据底座的位置调整相应的相机位置就可以了,根据实验表明每次最小0.2度的调整才能满足我们的要求。

应当注意到,我们控制无刷电机的方法基本上只能算是个权益之计。在任意时刻,我们需要让一个电磁体保持高电流,一个低电流,另外一个高阻态。所谓高阻态是一种非高又非低的状态,我们的这个例子中“高阻态”指的是让电流流向地,但是这样电机会发出很多热量,所以我们一个很明确做需要做出改进的地方就是防止电机在长期(大约1~2分钟)工作的状态下过热实现上还有一个难点,就是框架和摄像头的重量超出电机的实际扭矩,可能导致电机过转或者滞转,这种情况下我们的程序无法意识到电机和信号已经不同步了,只能等到电磁体的磁场恰好又到一个契合的位置,从而恢复电机正常运转。

◆ 步骤3:使用加速度计和陀螺仪

加速度计使arduino时刻获得相机相对地心引力的位置,同时也能获得轴的加速度信息。陀螺仪能测量角度的变化。通过这些数据我们可以搞出一个保持万向节在特定位置的伺服系统(我们用一组信号来实现反馈回路控制)。

我们使用了GY 521板子上的MPU 6060 6-DOF(Degree of Freedom)加速度计和陀螺仪

我们把加速度计和arduino连接起来,如上图所示,很不幸这块电路板没有data sheet .这是我们在亚马逊上找到的注释:

VCC: A rduino+3.3 V(0.1μF电容接地)
GND:接地
SCL: Arduino uno  A5(接2.2k上拉电阻到Arduino +5V)
SDA: Arduino uno A4(接2.2k上拉电阻到Arduino +5V)
XDA:无连接
XCL:无连接
ADO:接地
INT: Arduino数字引脚2

我们也找到一些anduino的代码,从中能够得到一些粗略的信息。但是这些东西很杂乱也不是特别有用。MPU 6050有一个内置的数字动作处理器(dmp),只是没有提供操作指南。

麻省理工的一些天才逆向了这个芯片,找到了使用这个芯片并从中获取有用数据的方法。(非常感谢Jeff Rowberg!)用了他的代码之后我们可以获得几种不同格式的数据,这些数据包括欧拉角,复数,或是旋转矩阵(YPR)

其中YPR数据跟控制相机刚好相关,所以我们决定用它来控制我们的相机。我们有一个俯仰电机(想象一下抬头,低头)还有一个反转电机(想象一下一个转弯时的飞机)。

一旦获得了这种格式的数据,编码实际上是相当容易的,我们写了一个基本的伺服器代码使得电机能够靠输入相应方向的正弦信号转到设定的任意角度。这两个轴向的电机可以很好的配合工作,因此我们可以独立控制他们,并且没有任何相互干扰。以上就是本项目核心概念的简单表述。

YPR数据有点折腾的地方就是它只给-90到90度的角度数据,当在水平位置时候伺服就偶尔会罢工。理论上对万向节应用来说不是个问题(当然我们认为认为这是个值得改进的地方)。

◆ 步骤4:组装

在我们的成品里,我们只是把电机控制两个简单概念以及加速度计读数整合在一起做成了伺服系统。你可以从这里查看结果数据。

当然,解决方案并不是那么简单在组装阶段我们克服了很多困难,还有很多是我们无法解决的。最初我们只是安装的了两根轴中的一根轴,并且痛苦了很长一段时间才最终把电机和加度计协调起来,相比之下让两个电机独立工作就变得没那么麻烦。我们发现一件奇怪的事,就是在Arduino I2C引脚A4/A5和+5v之间的2.2k的上拉电阻,如果这里阻值超过3.3k的话电机就无法通电(译者注:那是因为片内分压过低导控制信号由1变为0)。上拉电阻往往接到模拟端口这样可以稳定信号,同时可以防止Arduino不工作,它们更像预防措施,而非强制的必须,因此理论上所有的阻值都应该可以(合理范围内)。

我们的结论是:这上拉电阻肯定是为了修正什么,虽然我们无法确定它到底要修正什么。

不知道什么原因我们增加外部电源电压,且在一个轴上超过7-8V(虽然我们最终解决了1轴的问题),连接两个轴总是3v到4v(0.3安培看起来是是极限了)通过H-bridges。这样加速度计的数据看起来是一堆乱码。Arduino最终崩溃了,所以电机也无法工作了。

通过示波器我们发现了一些状况。基本上我们把外接电源接入电路时,电流大约是0.8安培,所有地方都出现了大量干扰噪声。接地的电压大约在-2到+3V之间!!!

明显是这原因导致了加速度计没办法工作。这也应该就是所有问题的根源,如果我们解决了这个问题,应该这玩意应该就可以工作了。

在使用无刷电机的时候,你实际上搞出了一个通过线圈的变化磁场。根据法拉第定律线圈种会有一个反电势。我们猜测是这个反电势导致了之前提到的那些噪声。

第二个可能就是我们根本没有搭建好。我们在H-Brige和一个加速计之间用了太长的导线。长导线和高电压非常容易影响电磁体从而把噪声引入电路。

最终我们貌似通过了2.2k的上拉电阻解决了其中一个轴的问题。我有了一个跑的很好的俯仰伺服并且还能承受15v的电压,同时输出很大的扭矩。注意我们现在要尝试将伺服调整到0度角来测试它的动作,并确定不是重力做了所有的工作。一般来说,万向节工作时会使用重力来保持稳定,因此重心的位置很重要。

视频

http://player.youku.com/embed/XNzM0MjM0NzQ4

电器控制起来还是有点跳动,而且总是以一个恒定的速度运行。我们觉得应该可以通过两件事情解决,第一件就是创建一个更高精度的正弦数组。然后应用一个PID库,这个库能根据目标位置的距离算出需要多快的速度。如果目标位置非常远它就移动的更快,在他接近目标的时候会慢下来,最后稳定。这样我们就能消除颤抖做出反应更快,转动更平滑的万向节。这里是我们最终的2轴动作。它只能达到比较低的电压和比较小的电流,所有我们没有达到需要的扭矩。我们再给安装的倾斜一点。

视频

http://player.youku.com/embed/XNzM0MDk5ODQw

这是GoPro相机拍摄的测试记录–录像的稳定性没有我们想象的完美。可怕的噪音从无刷电机里发出来,我们也不确定这正不正常,但是感觉没有录音的必要了。

视频

http://player.youku.com/embed/XNzM0MTAxNDAw Mxe48h3P17ELMQD3rVdBha7css2AjOao+rKL/K/6CfjcniaiwBGRwTZi7RuwusbE

点击中间区域
呼出菜单
上一章
目录
下一章
×