参考链接
【1】【树莓派】拉线式编码器/位移传感器数据读取(AB相)
【2】【Arduino】拉线式编码器/位移传感器数据读取(AB相)
【3】树莓派引脚编号
接线效果图
键盘输入q后停止计数、计时代码
由于拉线传感器代码只能在拉线传感器产生位移时有数据,因此为了计算被测物的移动速度,需要记录位移产生变化的时刻,而树莓派的GPIO.add_event_detect()不能传递参数,因此需要在def中断服务函数中声明全局变量(global),每次中断产生一次新位移+时刻,再把新位移+时刻插入到位移数组与时刻数组内,由于新位移的数量不确定且每次记录数据至txt内都会产生时延(导致记录缺步且降低精度),因此只能在记录完成时通过键盘输入q终止程序+记录数据
代码,能跑
import RPi.GPIO as GPIO #导入RPi.GPIO库
import time #导入time库
import numpy as np
import array
APin = 23#Green,BCM
BPin = 24#White,BCM
GPIO.setwarnings(False) #不加这句会有警告,因为该引脚已经被设置成了非默认值(也可以不加,不影响正常使用)
GPIO.setmode(GPIO.BCM) #使用BCM编码的引脚号
GPIO.setup(APin,GPIO.IN,GPIO.PUD_DOWN)#配置引脚模式
GPIO.setup(BPin,GPIO.IN,GPIO.PUD_DOWN)#设置引脚模式
status = 0 #记录电平状态
arr_encoder=np.array([])#arr_encoder记录新产生的位移数据
time_encoder=np.array([])#time_encoder记录新产生的位移数据对应的时刻
def APinInterrupt(APin):#外部中断服务函数
global status#全局变量
global arr_encoder#全局变量
global time_encoder#全局变量
AAA=GPIO.input(APin)
BBB=GPIO.input(BPin)
if AAA==BBB :
status=status+1
else :
status=status-1
#记录数据
arr_encoder=np.append(arr_encoder,status*0.125)#arr_encoder记录位移,mm
time_encoder=np.append(time_encoder,time.time())#time_encoder记录arr_encoder位移产生的时刻
print(status*0.125)#mm,输出位移
def inter():#中断函数
GPIO.add_event_detect(APin,GPIO.BOTH,APinInterrupt)#中断服务函数
if __name__=='__main__':
inter()
value_input=input()#键盘输入q后终止程序、记录数据至txt内
if value_input=='q':
print('save the txt file')
np.savetxt('Data-encoder.txt',arr_encoder,delimiter=',')
np.savetxt('Time-encoder.txt',time_encoder,delimiter=',')
注:
Python time.time()的功能是:返回当前时间的时间戳,即1970纪元后经过的浮点秒数,返回值精确到小数点后六位
精确到小数点后六位
精确到小数点后六位
精确到小数点后六位
时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(背景时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲,时间戳是一份能够表示一份数据在一个特定时间点已经存在的可验证的数据。