基于Arduino的上拉式磁悬浮.
介绍
基于Arduino或者其他MCU的磁悬浮项目其实是一个很古老的东西,网上已经有很多的教程和演示。这里分享我的代码以及磁悬浮装置制作中的一些经验,可能可以帮助到同样想制作一个磁悬浮装置的小伙伴。
有两种常见的磁悬浮种类:上拉式
和下推式
。在这个项目中是上拉式
,并且有两个版本,一个是基础版本
,需要手动为每一个浮子设置参数,另一个是重量自适应版本
,参数可以自动设置。
基本原理
![](principle.gif)
上面的Gif图展示了上拉式磁悬浮的基本原理。上面的磁铁提供吸引力来抵消浮子的重力,这样一来我们就可以以浮子刚好被抵消重力的位置作为参数AdjustValue
。而电磁线圈只需要提供相对比较小的力就可以让浮子保持在平衡位置。
浮子悬浮的过程是动态的,浮子往上跑就控制线圈给浮子排斥力,相反就给吸引力。霍尔传感器非常敏感,浮子微小的位置变化都可以被探测出来,从而通过控制算法可以使浮子相对稳定的悬浮在空中。
硬件部分
![](top-view2.jpg)
1. Arduino Uno (也可以是其他MCU)
2. 霍尔传感器
我使用的是49E011BD
,其他的线性霍尔传感器其实都差不多,只要工作电压大概在3 - 6.5V之间都可以。霍尔传感器可以探测附近磁场变化并且输出电压信号,非常适合用来探测浮子的位置变化。
3. 运算放大器
虽然霍尔传感器很敏感,但是输出的电压范围很小,说一需要加上运算放大器将输出电压进行放大,作为Arduino的输入信号。这里我使用的是LM358N
。
4. 电机驱动模块
L298N
,它可以进行全桥DC电机控制,在这里被用来驱动线圈。
5. 磁铁
浮子本身是磁铁,线圈上方的也是磁铁,我使用的都是铷磁铁。
电路原理图
![](Schematic_MagLev2.png)
算法部分
源码比较简单,这里就只说一下重要的几个点。
1. 基本版本-PID
确定AdjustValue
:
装置制作好之后,拿着浮子放到线圈下方,不断调整位置,直到有个位置浮子重力被抵消,这个位置就作为平衡点位置AdjustValue
。
可以通过Arduino IDE自带的串口监视器或者绘图器来确定具体值,我是用的4位数字显示器。
PID参数整定:
我只是用了P和D。先调P值,从小到大开始试,间隔大一点,然后找浮子稳定震荡最大的一个区间,然后再调小间隔,在这个区间进行微调,找到精确的P值。往往不用特别精细,因为一定范围内效果差不多。
在P值确定后,用同样的方式寻找D值,合适的D值会使浮子震荡大幅减小,找到震荡幅度最小的D值,然后这组P和D值就确定了,不出意外的话浮子已经可以悬浮了。
滤波:
由于霍尔传感器很敏感,加上周围环境造成的波动,想要读取到一个稳定的值需要进行滤波处理。这里我使用的就是取平均值的方式,简单粗暴。
2. 改良版本 - 浮子检测和重量自适应
为了避免麻烦的位每个浮子设置平衡点的操作,我进行了改良。当然PID还是需要提前整定好的。
浮子检测:
在装置刚运行的时候,也就是还没有把浮子放过去的时候,记录下当前的传感器值作为初始值。当浮子进来后,磁场变化会导致传感器读取值发生很大变化,浮子拿走后,读取值又会变回到初始值差不多大小(可能会有一定误差)。也就是说通过当前的传感器的值和初始值的差的大小,可以判断线圈下,传感器上有没有浮子。
重量自适应:
浮子检测机制的引入,让我们可以对每个新进来的浮子进行一次平衡点位置的读取。一旦一个浮子进入范围,也就是我们用手拿着浮子放到线圈下方,需要在平衡位置保持几秒钟,在这几秒钟里,程序会持续读取传感器的值,以此获取浮子平衡位置的AdjustValue
。一旦检测到悬浮中的浮子被拿走,就进入一个等待循环,直到下一次有浮子进入,重新开始读取平衡位置,然后进行悬浮的主循环。
代码
(https://github.com/xiaochutan123l/MagLev-Project)
参考
- 本文作者: 谭啸楚
- 本文链接: http://xiaochutan.com/2021/11/20/上拉式磁悬浮/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!