设为首页收藏本站

[应用教程] Arduino控制磁悬浮演示

金轮法王 发表于 2015-8-28 17:12:03 | 显示全部楼层 [复制链接]
5 6922
本帖最后由 金轮法王 于 2015-9-2 02:35 编辑

Arduino控制磁悬浮演示

QQ图片20150902023451.png

磁悬浮演示装置:是一个可以通过磁力悬浮的装置,在这个装置中我们可以悬浮物件。通过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:电路连接
图片1.png

下推式电路示意图

图片2.jpg

                     连线图



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

图片3.jpg

   标记的对应两组线圈

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 (807 Bytes, 下载次数: 1105)
发表于 2015-8-29 12:31:18 | 显示全部楼层
厉害~~
回复 支持 反对

使用道具 举报

发表于 2015-8-29 12:34:16 | 显示全部楼层
赞一个!!
回复 支持 反对

使用道具 举报

发表于 2017-2-3 14:29:55 | 显示全部楼层
学习了

大神
回复 支持 反对

使用道具 举报

发表于 2017-2-9 21:15:11 | 显示全部楼层
问一下,不用放大电路行吗。我直接将霍尔元件连在了arduino上,也好使,不加放大电路行吗
回复 支持 反对

使用道具 举报

发表于 前天 20:24 | 显示全部楼层
阿斯蒂芬a 发表于 2017-2-9 21:15
问一下,不用放大电路行吗。我直接将霍尔元件连在了arduino上,也好使,不加放大电路行吗 ...

最近正在帮家里孩子做磁悬浮,感谢大大的代码,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则 允许回帖同步到新浪微博  

推荐阅读

精华导读




公司简介| 联系我们| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表