Arduino霍尔传感器应用二例

2022-08-10 03:35牟晓东
电脑报 2022年30期
关键词:圈数霍尔磁铁

牟晓东

霍尔传感器是一种用来检测磁场的传感器,其内部磁场中有个霍尔半导体片,在恒定电流经过时(洛仑兹力的作用)就会产生电位差,即“霍尔电压”。霍尔电压会随磁场强度的变化而变化——磁场越强,电压就越高;磁场越弱,电压也就越低。常见的霍尔传感器有四个引脚,除了VCC正极和GND接地端外,另外两个引脚分别标注为DO和AO,对应数字信号和模拟信号的输入。利用霍尔传感器检测磁场时能够产生数字或模拟信号的特性,我们可以在Arduino中分别设计实现“时速计”和“智能路灯”。

利用霍尔传感器能够对检测到的磁场产生数字信号的特性,可以对“车轮”(由风扇模块来代替)每分钟转动的圈数进行计数,然后就能计算出它的时速。实验器材分为两大部分:一部分是树莓派带动风扇进行匀速转动,风扇的边缘处通过热熔胶粘贴上一小块圆形磁铁;另一部分是Arduino控制霍尔传感器对旋转的风扇磁铁进行检测并计数,最终计算出“车轮”的时速进行输出。

实验器材包括树莓派3B+和古德微扩展板各一块,ArduinoUNO一块,KY-024霍尔传感器一个,风扇模块一个,红色LED灯两支,圆形小磁铁一个,杜邦线若干。首先,将一支红色LED灯插入树莓派扩展板的5号引脚,注意“长腿正、短腿负”的规则;接着,通过杜邦线将风扇模块的VCC、GND和IA端分别连接到树莓派扩展板的24号引脚的VCC、GND和D端;最后,为树莓派连接数据线,通电启动操作系统。在浏览器中访问古德微机器人网站,切换进入“积木”编程区,通过“控制5号小灯亮”和“控制24号GPIO输出PWM800”等模块,实现风扇的转动(如图1)。

在Arduino中先将另外一支红色LED灯的长腿插入13号引脚、短腿插入GND引脚,然后通过杜邦线将霍尔传感器的VCC、GND和DO端分别插入Arduino的5V、GND和7号引脚,最后插入数据线并与计算机的USB接口连接。

运行Mind+,点击“扩展”按钮将“主控板”中的“ArduinoUno”添加后开始进行图形化编程。

在程序的初始化部分先设置串口波特率为9600,再新建“车轮半径”“车轮周长”和“圈数的计算值”三个变量,并且根据测量将“车轮半径”赋值为0.02(单位为米),即风扇模块上小磁铁与圆心间的距离是2厘米,“车轮周长”的计算公式即圆周长的求解公式,而变量“圈数的计算值”的初始值为0,作用是计算1分钟内车轮转过的圈数。

新建一个“重复执行1000次”的循环结构,內嵌的延时模块控制每次循环均等待0.005秒,因此循环从开始到结束的时间是5秒钟;在循环中设置变量“霍尔传感器”,其值为“读取数字引脚7”的信号,即检测到磁场信号时就会变为1(高电平);然后对其值进行是否为1的判断,条件成立的话则先将变量“圈数的计数值”进行“自增1”运算,再点亮红色LED灯作为提示;循环结束后新建变量“车轮转速”,并进行两次计算和输出:第一次计算的公式是变量“圈数的计数值”乘以60再除以5,这样得到的结果是车轮每分钟转动的圈数,即“车轮转速”,单位为“转/分钟”(r/min);第二次计算的公式是变量“车轮转速”乘以60再乘以变量“车轮周长”后再除以1000,此时的计算结果就是真正的“时速”,单位为“千米/小时”(km/h),均通过串口监视器输出显示。

将程序保存为“Arduino‘时速计’.sb3”,上传至Arduino中运行测试,注意此时要将转动的风扇模块靠近霍尔传感器的检测探头(保证风扇每转动一周时小磁铁都能近距离经过),同时还要打开串口监视窗口。很快就会有结果输出:“车轮的转速为:1296.00转/分钟”“车轮的时速为:9.77千米/小时”(如图2)。

保持实验器材及连接方式不变,再来尝试使用代码编程实现Arduino“时速计”。首先,通过“int Hall_Sensor_pin = 7;”和“int Red_LED_pin = 13;”实现霍尔传感器和LED与Arduino连接引脚号的声明,再通过“int Hall_Sensor_State = 0;”将霍尔传感器的初始状态定义为0(低电平);由于待构建的循环是固定的1000次循环,而不是一直循环,因此要保持void loop()函数为空,代码语句均在void setup()函数中完成——

设置霍尔传感器的引脚为输入:“pinMode(Hall_Sensor_pin,INPUT);”,设置红色LED灯的引脚为输出:“pinMode(Red_LED_pin,OUTPUT);”,设置串口波特率:“Serial.begin(9600);”;新建浮点型变量car_r(车轮半径),赋值为0.02(单位为米);再新建浮点型变量car_c(车轮的周长),按照圆的周长公式进行计算赋值:“float car_c = 2*3.14*car_r;”;新建变量car_counter(对应圈数的计数值),初始值为0;使用for建立运行1000次的循环结构(for(int i=0;i<1000;i++)),语句“Hall_Sensor_State = digitalRead(Hall_Sensor_pin);”的作用是将霍尔传感器检测磁场的状态写入变量Hall_Sensor_State中(1对应高电平);然后通过if语句对Hall_Sensor_State的值进行判断,如果该值是1:“if(Hall_Sensor_State==1)”,则执行两条语句:一是变量car_counter进行自增1运算:“car_counter++;”,二是点亮红色LED灯:“digitalWrite(Red_LED_pin,HIGH);”;接着,通过语句“delay(5);”延时5毫秒,并且熄灭LED灯:“digitalWrite(Red_LED_pin,LOW);”。

1000次循环结束后,新建浮点型变量car_v1(车轮的转速),通过计算公式为其赋值为“car_counter*60/5”(单位为转/分钟),然后通过Serial.println将结果显示输出;再新建浮点型变量car_v2(车轮的时速),通过计算公式为其赋值为“car_v1*car_c*60/1000”(单位为千米/小时),同样也是通过Serial.println将结果显示输出。

将程序代码保存为“Speedometer.ino”,编译上传至Arduino进行测试,操作方法与图形化编程方式类似,同样注意要打开“工具”菜单下的串口监视器。此时可尝试在古德微机器人网站的“积木”代码中修改一下风扇模块的转速,比如提高至原来的3倍大小,最终测试的结果为:“车轮的转速(转/分钟)为:3444.00”“车轮的时速(千米/小时)为:25.95”(如图3)。

利用霍尔传感器能够对检测到的磁场产生模拟量信号的特性,根据这个模拟量数据范围再进行映射计算,对应驱动LED灯亮度的PWM值(0-255),最终实现有“人”(带磁铁)靠近时LED灯才发光、越靠近LED的灯光就越亮的“智能路灯”效果——当人远离至一定范围时(霍尔传感器检测不到有磁场信号),LED灯熄灭。

实验器材包括ArduinoUNO一块,KY-024霍尔传感器一个,红色LED灯一支,圆形小磁铁一个,微型改锥一把,小型面包板一块,杜邦线若干。首先,通过两根杜邦线从Arduino中将5V和GND引至面包板的侧边红色和蓝色卡槽线;接着,将霍尔传感器的VCC和GND端通过杜邦线连接至面包板的侧边卡槽,再将AO端连接至Arduino的A0模拟引脚;然后,将红色LED灯的短腿插入面包板的蓝色卡槽,长腿则通过杜邦线连接至Arduino的3号引脚(序号前标注有“~”表示支持PWM信号);最后,将圆形小磁铁吸至微型改锥的尖头处,放置待用,给Arduino插入数据线与计算机的USB接口连接。

运行Mind+,同样也是先设置好串口的波特率为9600,然后在“循环执行”中先建立变量“霍尔传感器”,赋值为“读取模拟引脚A0”的数据,并且使用串口字符串输出其读取的磁场信号值;接着,新建变量“LED的PWM值”,为其赋值为“映射变量霍尔传感器从[519,170]到[0,255]”,其中的519和170两个数据是运行程序测试得出的,分别对应霍尔传感器探头周围基本无磁场信号和小磁铁最靠近探头时读取的模拟数据量,同样也是将该值显示输出——“驱动LED的PWM值”;然后,通过“设置PWM引脚3输出”模块将变量“LED的PWM值”作为目标值,即控制LED灯发出对应强度的光线;最后,添加“等待0.01秒”的延时模块。

将程序保存为“Arduino‘智能路灯’.sb3”,连接设备后再上传至Arduino进行测试。当微型改锥带动小磁铁越来越靠近霍尔传感器的探头时,之前保持熄灭状态的红色LED灯會逐渐发光,而且是随着二者距离的缩短而越来越亮,直至相互接触时发出最强的红光;当远离时,LED灯的光线强度则会越来越弱,最终随着距离的增大而熄灭。同时,在屏幕的串口显示窗口上也会不断显示有相对应的提示信息:“从A0端读取的磁场信号为:376.00”“驱动LED的PWM值为:104.00”,实现了“智能路灯”的功能(如图4)。

依照上面Arduino“时速计”的图形化与代码编程方式,同样可以对“智能路灯”进行代码编程。

猜你喜欢
圈数霍尔磁铁
通过绞车钢丝绳计算井深
晨起转腰改善便秘
晨起转腰改善便秘
这个大童话讲猫(五)名侦探西尼·霍尔
空中显示计数的跳绳
离子推力器和霍尔推力器的异同
道格拉斯·斯高特·霍尔(1940-2013)
基于素质培养的霍尔效应实验
玩磁铁
用磁铁治病,由不信到信等