简 介: : ,
§01 光流传感器
一、背景介绍
在中对于光流传感器进行了初步测试。有一个问题: 传感器输出与相对速度之间是否是线性? 最大的测量速度是否有上限?
| 二、测量方法
1、测试方法
为了测试光流传感器上述特性, 使用一个直流电机带动一个转盘转动。 放在光流传感器上面产生相对运动。
| | 2、直流电机
直流电机接口, 具有磁编码器输出。 这里给出了6PIN接口功能定义。
给电机施加不同直流电压, 电机就会以不同的转速 运行。 这是点击后面的磁编码器的输出波形。 速度脉冲的频率可以通过万用表测量得到。
| | | 三、测量相对运动
将光流传感器放置在旋转红色隔热棉前面, 距离大约 5 个厘米。 应用 MicroPython 实验板读取光流传感器的输出。 编程显示光流传感器输出的x,y方向的移动速度。 由于转盘是圆周运动, 可以看到x,y两个方向上面的运动分量。
| |
一、测量程序和数据
通过实验检查光流传感器输出数值特性。 可以看到它的输出有最大值显示, 不超过25, 由于直流电机转速在 低速下无法精确控制, 所以输出线性关系就没有进一步验证了。
1、测量电机转速与脉冲频率
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2022-07-15
#
# Note:
#============================================================
from headm import *
from tsmodule.tsvisa import *
from tsmodule.tsstm32 import *
vdim = linspace(2, 7, 50)
fdim = []
for v in vdim:
dh1766volt(v)
time.sleep(2)
meter = meterval()
fdim.append(meter[0])
printff(v, meter)
tspsave('measure', vdim=vdim, fdim=fdim)
dh1766volt(0)
plt.plot(vdim, fdim)
plt.xlabel("Voltage(V)")
plt.ylabel("Frequency(Hz)")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
2、拟合电机与频率线性关系
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# DRAW1.PY -- by Dr. ZhuoQing 2022-07-15
#
# Note:
#============================================================
from headm import *
from scipy.optimize import curve_fit
vdim, fdim = tspload('measure', 'vdim', 'fdim')
def linefun(x, a, b):
return a*x + b
param = (1, 0)
param, conv = curve_fit(linefun, vdim, fdim, p0=param)
printf(param)
plt.plot(vdim, fdim)
plt.xlabel("Voltage(V)")
plt.ylabel("Frequency(Hz)")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : DRAW1.PY
#============================================================
3、电机电压与频率测量数据
4、Python 程序
from machine import Pin,UART
import time
uart = UART(1, baudrate=19200)
print(uart)
inbuf = bytes([0]*7)
recebuf = b''
mx = 0
my = 0
squal = 0
printcount = 0
while True:
if uart.any() > 0:
inb = uart.read(uart.any())
recebuf = recebuf + inb
buflen = len(recebuf)
delflag = 1
if buflen > 0:
id = 0
for b in recebuf:
if b == 0xfe:
if buflen >= id+9:
mx = recebuf[id+3]
mx = mx*256 + recebuf[id+2]
my = recebuf[id+5]
my = my*256 + recebuf[id+4]
squal = recebuf[id+7]
else:
recebuf = recebuf[id:]
delflag = 0
break
id += 1
if delflag > 0: recebuf = b''
time.sleep_ms(10)
printcount += 1
if printcount >= 10:
printcount = 0
print(mx, my, squal)