在树莓派上测试霍尔开关传感器

前端时间一直在调制我的3D打印机,它的轴限位开关使用的是机械限位开关SS-5GL微动开关,我一直在想如果不用机械开关那还可以用什么来代替,在网上有朋友提到用霍尔传感器来代替,于是决定先简单测试一下。

通过一番搜索,了解到霍尔传感器可以检测是否有磁场存在,它通常用于定位物体或测量旋转速度。例如,可以把一块磁铁绑在自行车的车轮辐条上,用它来测量自行车车轮旋转的速度 。为了验证这个想法,并检查传感器的触发距离,我决定使用树莓派和Python来完成本次测试。

霍尔开关传感器

测试选择的霍尔开关是稳定斩波型精密霍尔效应开关 A1120EUA-T ,它在网上的价格大约在4元左右,下面是A1120EUA-T的引脚定义图:

A1120霍尔元件的引脚图
A1120霍尔元件的引脚图

磁铁

为了可以方便的把磁铁安装在打印机上,所以我选择了稀土钕磁铁,尺寸是5 x 10毫米的小圆柱体,价格几毛钱一块。

稀土钕磁铁
稀土钕磁铁

电路连接

在树莓派上测试霍尔开关传感器
在树莓派上测试霍尔开关传感器

在上图中红色线为Vcc (3.3V),棕色线接地,橙色线为Vout。电路图如下:

霍尔传感器电路图
霍尔传感器电路图
树莓派A1120
 3.3V (Pin 1)Pin 1
 Gnd (Pin 6)Pin 2
 GPIO17 (Pin 11)Pin 3

霍尔传感器的Vcc连接到树莓派的引脚1 3.3V电源,GND连接到树莓派的引脚6。Vout连接到树莓派的引脚11 (GPIO17),当然也可以使用其他的GPIO引脚。电路中还采用了一个10K(或差不多阻值)的电阻把输出拉高。根据霍尔元件的厂家建议在Vcc和GND之间放一个0.1uF的电容来降低干扰,但是实际测试中我发现有没有这个电容对电路的影响并不大。

Python代码

这个Python脚本将GPIO 针配置为输入,并将其调为高电平状态并设置了回调函数。每当传感器的状态发生变化时,它就会触发回调函数并显示一些文本。当磁铁靠近传感器时,GPIO17会变为“低电平”,当磁铁被移开时,GPIO17又会回到“高电平”状态。

#!/usr/bin/python
# Import 所需的库
import time
import datetime
import RPi.GPIO as GPIO

def sensorCallback(channel):
  # 如果传感器输出发生变化,则调用
  timestamp = time.time()
  stamp = datetime.datetime.fromtimestamp(timestamp).strftime('%H:%M:%S')
  if GPIO.input(channel):
    # 没有磁铁
    print("Sensor HIGH " + stamp)
  else:
    # 磁铁
    print("Sensor LOW " + stamp)

def main():
  sensorCallback(17)
  try:
    # 进入循环,直到手动按CTRL-C退出
    while True :
      time.sleep(0.1)

  except KeyboardInterrupt:
    # 重置GPIO
    GPIO.cleanup()

# 告诉GPIO库使用GPIO引用
GPIO.setmode(GPIO.BCM)

print("Setup GPIO pin as input on GPIO17")

# 设置开关GPIO为输入
# 默认拉高
GPIO.setup(17 , GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(17, GPIO.BOTH, callback=sensorCallback, bouncetime=200)

if __name__=="__main__":
   main()

把上面的代码保存为 hall.py 。运行脚本使用:

(Python2时):python hall.py
(Python3时):python3 hall.py

触发距离

通过测试,我发现霍尔传感器的触发距离约为15mm。但不同体积不同形状的磁铁也会导致霍尔效应传感器的测量值发生变化。因此,如果将此贴和霍尔元件用于实际场景时,那么必须多次进行试验才能取得最佳效果。