操纵传感器|从零开始认识各种传感器
1. 什么是触摸操纵传感器?
操纵传感器是一种广泛应用于在各种电子设备中来执行控制或运动的装置。我们常用的相机上的控制拨盘,游戏机配置的手柄等,都用到操纵传感器。
图1 操纵传感器的应用
2. 操纵传感器是如何工作的?
我们以一个双轴按键摇杆为例,来看一下它的工作原理。它由两个滑动变阻器,一个摇杆和一个开关按键组成。 摇杆控制两个滑动变阻器的阻值,随着摇杆的角度变化,对应电路中分别输出 X、Y 轴上对应的电压值(图2),这样,就完成了对用户操纵方向的感知。
图2 操纵传感器工作原理
3. 常见的操纵传感器的种类
3.1 碳膜操纵传感器分类
目前市场上主要应用的有两种传感器,碳膜操纵传感器和霍尔操纵传感器。
图3 碳膜操纵传感器
图4 霍尔操纵传感器
碳膜摇杆通过检测摇杆在碳膜传感器的滑动来感知用户的操控,利用电阻值的变化来输出控制信号. 由于成本相对较低,一直是主流的游戏操纵手柄的首选。他的缺点是是摇杆和碳膜的接触会带来碳膜的磨损导致寿命降低,业界目前最高水平可达到200万次左右的使用寿命。
图5 碳膜的磨损
3.2 霍尔操纵传感器
霍尔操纵传感器的工作原理来自于霍尔效应,简单来说,霍尔效应表示当磁场干扰导体中的电流时,会引起电压的变化。
图6 霍尔效应
霍尔效应摇杆利用这个原理,它们内部装有永久磁铁,摇杆带动磁铁移动,这个移动被下面霍尔效应检测IC检测到,产生电压变化,转换为位置数据的变化。 由于采用的是非接触式设计,利用电磁感应去检测摇杆方向和位移距离,没有接触摩擦造成的损耗,因而霍尔摇杆比传统摇杆具有更高的耐用性、精准度和稳定性。霍尔摇杆的理论使用寿命是普通摇杆的2-5倍。而且可以应用在比较恶劣的环境中。比如具有粉尘,潮湿的户外作业场所。
图7 霍尔操纵传感器原理
3.3 两种操纵传感器的比较
这里列出了两种操纵传感器的对比。总的来说,碳膜摇杆由于具有较高的技术成熟度和市场普及度,在家庭娱乐的应用中具有很高的性价比。但是由于存在机械磨损的问题,寿命有一定的极限。目前业界最高水平也就达到200万次。而霍尔效应操纵传感器,由于没有机械接触造成的磨损,也不容易收到粉尘及潮湿的影响,具有更高的使用寿命和应用场景,最高使用寿命可达1000万次以上。但是目前相对价格较高,多应用于工业场景。
图8 两种操纵传感器的特性比较
4. 操纵传感器实验演示
最后,我们来演示如何使用配备显示屏的树莓派读取并显示操纵传感器的数据。这里我们选用的是一款碳膜操纵传感器。树莓派MCU通过模拟接口读取到的数字进行数字化处理后,在显示屏上直观地显示出来。
图9 树莓派读取操纵传感器展示
完整代码:
from breakout_colourlcd240x240 import BreakoutColourLCD240x240
from machine import ADC, Pin, Timer, PWM,I2C
from utime import sleep
import time, math,array
#------------------------------------------------------------------
######################################################################
######################################################################
#初始化
#显示屏
width = BreakoutColourLCD240x240.WIDTH
height = BreakoutColourLCD240x240.HEIGHT
display_buffer = bytearray(width * height*2)
display = BreakoutColourLCD240x240(display_buffer)
xtemp = ADC(2)
ytemp = ADC(1)
current_temp_Y = 0
current_temp_X = 0
#-------------------------------------------------------------------
#屏幕基本图形绘制
def display_init():
#绘制Y轴计
display.set_pen(0,255,0)
display.rectangle(30,30,13,160)
display.circle(36,190,6)
display.set_pen(255,0,0)
#绘制X轴计
display.set_pen(0,255,0)
display.rectangle(36,184,160,13)
display.circle(64,190,6)
display.set_pen(255,0,0)
#绘制文字
display.text("current", 150, 20, 194, 2)
display.text("Y_axis", 150, 35, 194, 2)
display.text("current", 150, 100, 194, 2)
display.text("X_axis", 150, 115, 194, 2)
display.update()
display.update()
#---------------------------------------------------------------------
def display_change_Y(temp, color):
global current_temp_Y
current_temp_Y = temp
#print(temp)
display.set_pen(color[0], color[1], color[2])
display.rectangle(30,30,13,160)
# display.circle(64,190,6)
display.set_pen(0,0,150)
display.rectangle(30,20,13,7+int((50-temp/2)/2)*6)
display.set_pen(0,0,0)
display.rectangle(145,50,100,40)
display.set_pen(0,255,0)
display.text(str(temp), 145, 50, 5, 5)
display.update()
def display_change_X(temp, color):
global current_temp_X
current_temp_X = temp
#print(temp)
display.set_pen(color[0], color[1], color[2])
display.rectangle(36,184,160,13)
display.circle(36,184,6)
display.set_pen(0,0,150)
display.rectangle(7+int((65-temp/2)/2)*6,184,160,13)
display.set_pen(0,0,0)
display.rectangle(145, 130, 100, 40)
display.set_pen(0,255,0)
display.text(str(100-temp), 145, 130, 5, 5)
display.update()
#----------------------------------------------------------------------
def get_temp_x():
Analogvalue=xtemp.read_u16()
voltage=100*float(Analogvalue)/65535
return voltage
def get_temp_y():
Analogvalue=ytemp.read_u16()
voltage=100*float(Analogvalue)/65535
return voltage
#-----------------------------------------------------------------------
def main():
global current_temp_Y,current_temp_X
timer1 = Timer()
timer2 = Timer()
color = [0,255,0]
display_init()
#timer初始化
timer1.init(freq=5,mode=Timer.PERIODIC, callback=lambda t:display_change_X(round(get_temp_x(),1), color))
timer2.init(freq=5,mode=Timer.PERIODIC, callback=lambda t:display_change_Y(round(get_temp_y(),1), color))
while True:
sleep(0.1)
main()