Arduino控制磁悬浮演示

2015-08-284万
精华项目
AI 快速预览详细 收起
本项目介绍如何使用Arduino控制磁悬浮装置。所需硬件包括Mega168、L298N控制板、直流稳压电源、UGN3503线性霍尔传感器等。通过PID算法得出一组可以使物件平稳悬浮的参数。关键步骤包括线圈的选择与连接、霍尔传感器的位置调整以及PID参数的调试。最终效果是实现磁悬浮装置的平稳悬浮。


Arduino控制磁悬浮演示

Arduino控制磁悬浮演示图5

磁悬浮演示装置:是一个可以通过磁力悬浮的装置,在这个装置中我们可以悬浮物件。通过pid算法得出一组可以使物件平稳悬浮的参数。这次做得磁悬浮演示主要参照了动力老男孩博客盗梦陀螺的方案
Step1:所需硬件
器件名称
规格
数量
功能
Mega 168

1
数据采集,逻辑控制,输出控制
L298N控制板

1
大电流输出,用于控制线圈磁场
直流稳压电源
20V,2A
1
电源
UGN3503

3
线性霍尔传感器,
用于测量磁场强度
LM358N

1
数字电流放大器
LM7809

1
输出9V电压,给Arduino供电
电阻
100k,2k
2,2
用于数据采集电路
多圈电位器
10k
2
用于设置空载时的电压。
需要精确设置
调节电位器
10k
2
用于调节位置,
精度要求不高
导线
最好是芯硬一点的
若干

杜邦头

若干

圆环形磁铁
145*80*20
1
产生斥力让浮子悬浮
钕铁硼强磁

1
用作浮子
一元钱硬币


浮子配重


制作过程
Step2:硬件准备

a. 线圈的选择:
线圈我这里是淘宝直接买到的成品,有兴趣的大家可以自己买漆包线和线圈骨架自己绕线圈(一个线圈大概是八百匝左右)制作线圈的时候不能选有铁芯的漆包线
b. 关于浮子:
浮子一定要选择磁性强的钕铁硼强磁,浮子在测试的时候最好包上一圈保护塑料袋减少浮子和底盘磁铁碰撞产生的损坏。
c. 线性霍尔传感器在测试的时候比较容易损坏,需要多准备几个有备无患。



Step3:电路连接
Arduino控制磁悬浮演示图2

下推式电路示意图

Arduino控制磁悬浮演示图3

                     连线图



焊接过程中主控板与放大电路的连接应该没有问题,比较关键的是线圈部分的安装:
1) 两个线圈的同名端相接,构成一对线圈。另一对也一样。也就是说对应的两组线圈要头尾串联连接。(产生一斥一拉的效果)
2) 霍尔传感器的位置尽量在线圈中轴线上,高度上也尽量放在中心的高度。
3) 一对线圈接L298的OUT1,OUT2,另一对接L298n的OUT3,OUT4。刚开始这个不是很严格,你只要一对线圈接一组输出就可以。但是如果你成功后,你就要记住你哪对线圈接OUT1,2;哪对线圈接OUT3,4;一对线圈中哪根线接了OUT1,哪根线接了OUT2。不然你拆了下来,在接上去和上次的接法不同,那你就悲剧了,要在调了。(可以在线圈上标记出对应的数字以免接错)

Arduino控制磁悬浮演示图4

   标记的对应两组线圈

Step4 Mega168的应用
这边引用一段老男孩博客里Android Mega的介绍:
Android Mega一共有四种IO接口:模拟输入输出和数字输入输出。其中模拟输入标记为“ANALOG IN”,可以测量0~5V的电压,对应在代码中的读数范围是0~1023,示例代码如下:
  1. int readValue1 = analogRead(read1 Pin);  
复制代码


模拟输出实际上输出的是一串方波,通过高低电压的占空比来产生“平均电压”。在板上对应的标记是PWM,输出电压同样是0~5V,但是请注意设置的数值范围却是0~255。示例代码如下:
  1. analogWrite(power1Pin, Pid1.power);
复制代码
数字输入输出需要先设置管脚的模式,直接看示例代码吧:
  1. pinMode(Pin1, OUTPUT);     //设置为输出管脚  
  2. pinMode(Pin2, INPUT);      //设置为输入管脚
  3. digitalWrite(Pin1, HIGH);  //输出高电压
  4. int v = digitalRead(Pin2); //读取Pin2的电压,返回结果是0或1
复制代码


其中0~53所有的接口都可以作为数字输入输出接口,而其中只有2~13可以用作PWM模拟输出。模拟输入的接口编号是0~15,和刚才的编号是互相独立的,不会冲突。对于盗梦陀螺来说,传感器和电位器的读数显然要用模拟输入,而线圈电流的控制也显然要用模拟输出。强烈建议把接线的编号集中写在程序的最前面,这样可以一目了然的看出是怎么接的线:
  1. int adjust1Pin = ;    //用来调节A方向的电位器  
  2. int adjust2Pin = 2;    //用来调节B方向的电位器  
  3. int read1Pin = 4;      //用来连接输入A传感器  
  4. int read2Pin = 3;      //用来连接输入B传感器  
  5. int i1Pin = 36;        //连接电机驱动板的I1接口  
  6. int i2Pin = 37;        //连接电机驱动板的I2接口  
  7. int i3Pin = 39;        //连接电机驱动板的I3接口  
  8. int i4Pin = 38;        //连接电机驱动板的I4接口  
  9. int power1Pin = 5;     //连接电机驱动板的EA接口  
  10. int power2Pin = 6;     //连接电机驱动板的EB接口  
复制代码


细心的朋友一定看到上面代码中,有I1到I4四个接口,我将会把它们设置成数字输出。这里再顺便介绍下L298N的用法。
L298N直接连接了20V的电源,通过板内取电的方式提供5V电压给电路使用。板上包含了对称的两组电流驱动电路,以I1,I2,EA为例:
  1. I1=0;I2=1;  //输出正电压,EA范围0~255时,输出电压对应为0~+20V  
  2. I1=1;I2=0;  //输出负电压,EA范围0~255时,输出电压对应为0~-20V  
  3. I1=0;I2=0;  //输出电压均为0  
  4. I1=1;I2=1;  //输出电压均为0  
复制代码


我们可以用数字输出I1和I2控制线圈的电压方向,用模拟输出EA控制电压的大小。I3,I4和EB是完全一样的,这里就不多说啦。友情提醒一下,Arduino的地线,L298N的地线,还有焊接电路的地线,这些地线一定要都连在一起。的地线,这些地线一定要都连在一起。
附完整代码下载附件PID.rar
Step5 PID参数调整
关于PID控制简单来说就是通过比例(P)积分(I)微分(D)控制的调节器控制。
调节过程中调P的话,会左右的抖动,而且幅度会越来越大。可以开始加上一些Kd,Kd偏小的时候表现就是震荡,Kd偏大的时候表现是无法稳定,从侧面滑走。原理虽然并不算特别复杂,但是在实际测试的时候PID参数的调整还是一个非常耗时的过程。(在接近正确参数的时候可以适当增加浮子的负重,增加的稳定性相当可观)









创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(9)
20060606
20060606
线圈能给个连接吗?
DFrybIvUoE8
DFrybIvUoE8
牛逼啊啊啊啊啊啊啊啊啊啊
王仕品
王仕品
楼主 在吗 可以加下我吗 我也在做这个 请教一下你 15089936050
DFrko1MRycQ
DFrko1MRycQ
霍尔元件与arduino怎么连的啊,小白一个,求各位大佬帮帮忙
张少奎
张少奎
PID里面怎么没有提到输入
阿斯蒂芬a
阿斯蒂芬a
问一下,不用放大电路行吗。我直接将霍尔元件连在了arduino上,也好使,不加放大电路行吗
chinazgm
chinazgm回复阿斯蒂芬a
最近正在帮家里孩子做磁悬浮,感谢大大的代码,谢谢!
david.ding
david.ding
学习了
大神
Jane
Jane
赞一个!!
dsweiliang
dsweiliang
厉害~~;P
- 没有更多了 -