基于ESP32的竞赛裁判系统功能调试-光电条检测板
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于ESP32的竞赛裁判系统功能调试-光电条检测板相关的知识,希望对你有一定的参考价值。
简 介: 通过实验验证量光电检测板在比赛系统中用于检测车模通过是的功能。前面给出了对于主控板以及光电板上的参数修改内容。
关键词
: 比赛系统,智能车竞赛,光电检测板
§01 竞赛裁判系统
在刚刚调试 基于ESP32的竞赛裁判系统功能调试-计时线圈功能 中,对于基于 ESP32的智能车竞赛裁判系统 中的电磁感应功能进行了调试。为了克服电磁感应对于磁场干扰敏感的问题,在 基于黄色LED反向电流的光电检测板 测试了基于黄色LED反向电流的光电检测板。为了能够兼容这两种检测传感器,则将黄色检测板的信号经过原线圈同样的信号调理电路进入计算系统。
1、对于电路的修改
(1)对裁判系统主控板修改
在主控板上增加两个光电板的接口。每个接口都是PIN3,分别为+5V,GND, 以及信号输出。两个光电板的信号通过C01,C02耦合到线圈输入端口。
▲ 图1.1 主控板增加光电板两个接口
(2)对于光电板电路修改
由于线圈放大电路增益很大,所以在光电板上对于电流放大倍数就需要降低了。
将原来的达林顿三极管更换成NPN三极管,使用8050替代;
将原来达林顿集电极电阻更换为100k欧姆。
▲ 图1.2 修改光电板的电流放大回路
2、测试检测性能
在面包板上建立接口电路连入ESP32比赛系统板。
▲ 图1.3 在面包板上建立接口电路连入ESP32比赛系统版
(1)测量放大后的信号
使用示波器测量放大后的信号。利用手在光电板上方通过,引起光电板上的光线强度的变化,可以看到经过电流放大之后转换成电压信号出现了很大的波动。
▲ 图1.4 使用手在光电板上方晃动,引起放大波形的变化
由于环境中存在着很多波动的光线,因此在输出波形上叠加有很多的高频噪声。其中就包含有工频的多种高次谐波成分。
▲ 图1.5 测了运放放大后的信号波形
利用在 基于ESP32的竞赛裁判系统功能调试-计时线圈功能 相同的窗口平滑滤波方法,将这种高频谐波信号进行滤除。
(2)测试检测性能
是由手在光电板上方晃动便可以影响矿光电板的输出电压。
▲ 图1.7 手遮挡光电板上的光线引起光电检测板输出信号的波动
经过测试,发现一个现象,在光电板一侧,特别是靠近输出测的光电板的灵敏度小于光电板的另外一侧。
▲ 图1.6 单个轮胎经过便可以触发光电板
※ 测试结论 ※
博文通过实验,将 基于黄色LED反向电流的光电检测板 的输出信号接入的比赛系统主板的线圈放大端口。使用与线圈检测相同的程序可以验证光电板的检测性能。
■ 相关文献链接:
● 相关图表链接:
- 图1.1 主控板增加光电板两个接口
- 图1.2 修改光电板的电流放大回路
- 图1.3 在面包板上建立接口电路连入ESP32比赛系统版
- 图1.4 使用手在光电板上方晃动,引起放大波形的变化
- 图1.5 测了运放放大后的信号波形
- 图1.7 手遮挡光电板上的光线引起光电检测板输出信号的波动
- 图1.6 单个轮胎经过便可以触发光电板
#
1、实验程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2021-06-10
#
# Note:
#============================================================
from machine import ADC,Timer,Pin,freq
import time
#------------------------------------------------------------
led = Pin(5, Pin.OUT)
freq(240000000)
#------------------------------------------------------------
speaker = Pin(21, Pin.OUT)
#------------------------------------------------------------
adc1 = ADC(Pin(36))
adc2 = ADC(Pin(39))
adc3 = ADC(Pin(34))
adc4 = ADC(Pin(35))
adc1.atten(ADC.ATTN_6DB)
adc2.atten(ADC.ATTN_6DB)
adc3.atten(ADC.ATTN_6DB)
adc4.atten(ADC.ATTN_6DB)
SAMPLE_NUM = const(500)
AVERAGE_NUM = 16
ad1dim = [0] * SAMPLE_NUM
ad2dim = [0] * SAMPLE_NUM
ad3dim = [0] * SAMPLE_NUM
ad4dim = [0] * SAMPLE_NUM
SAMPLE_AVERAGE_LENGTH = 40
ad3average = [0] * SAMPLE_AVERAGE_LENGTH
ad4average = [0] * SAMPLE_AVERAGE_LENGTH
ad34point = 0
ad3sigma = 0
ad4sigma = 0
#------------------------------------------------------------
AD34_BASE_ALPHA = 0.0005
ad3baseline = 0
ad4baseline = 0
AD34_CHECK_THRESHOLD = 300
ad3checktime = 0
ad4checktime = 0
#------------------------------------------------------------
sample_point = 0
stop_flag = 0
sample_mode = 0 # 0 : sample adc3, adc4
# 1 : sample adc1, adc2
total_count = 0
#------------------------------------------------------------
def ADC4Sample(_):
global ad1dim,ad2dim,ad3dim,ad4dim
global sample_point
global adc1,adc2,adc3, adc4
global ad3average, ad4average, ad34point, ad3sigma, ad4sigma
global ad3checktime, ad4checktime,total_count
global ad3baseline, ad4baseline
led.on()
#--------------------------------------------------------
total_count += 1
#--------------------------------------------------------
if sample_mode == 1:
ad1dim[sample_point] = adc1.read()
ad2dim[sample_point] = adc2.read()
if sample_mode == 0:
adc = adc3.read()
ad3sigma += adc
ad3sigma -= ad3average[ad34point]
ad3average[ad34point] = adc
adc = adc4.read()
ad4sigma += adc
ad4sigma -= ad4average[ad34point]
ad4average[ad34point] = adc
ad34point += 1
if ad34point >= SAMPLE_AVERAGE_LENGTH:
ad34point = 0
ad3dim[sample_point] = ad3sigma / SAMPLE_AVERAGE_LENGTH
ad4dim[sample_point] = ad4sigma / SAMPLE_AVERAGE_LENGTH
#----------------------------------------------------
value = ad3sigma / SAMPLE_AVERAGE_LENGTH
if ad3baseline == 0:
if ad34point == SAMPLE_AVERAGE_LENGTH - 1:
ad3baseline = value
else: ad3baseline = ad3baseline * (1 - AD34_BASE_ALPHA) +AD34_BASE_ALPHA * value
if abs(value - ad3baseline) > AD34_CHECK_THRESHOLD:
if ad3checktime == 0:
ad3checktime = total_count
value = ad4sigma / SAMPLE_AVERAGE_LENGTH
if ad4baseline == 0:
if ad34point == SAMPLE_AVERAGE_LENGTH - 1:
ad4baseline = value
else: ad4baseline = ad4baseline * (1 - AD34_BASE_ALPHA) + AD34_BASE_ALPHA * value
if abs(value - ad4baseline) > AD34_CHECK_THRESHOLD:
if ad4checktime == 0:
ad4checktime = total_count
#--------------------------------------------------------
sample_point += 1
if sample_point >= SAMPLE_NUM:
sample_point = 0
#--------------------------------------------------------
led.off()
#------------------------------------------------------------
SAMPLE_PERIOD = 1
time0 = Timer(0)
time0.init(period=SAMPLE_PERIOD, mode=Timer.PERIODIC, callback=ADC4Sample)
#------------------------------------------------------------
count = 0
while True:
if ad3checktime != 0:
print(ad3checktime)
ad3checktime = 0
speaker.on()
if ad4checktime != 0:
print(ad4checktime)
ad4checktime = 0
speaker.on()
time.sleep_ms(100)
speaker.off()
#------------------------------------------------------------
# END OF FILE : test1.PY
#============================================================
以上是关于基于ESP32的竞赛裁判系统功能调试-光电条检测板的主要内容,如果未能解决你的问题,请参考以下文章