已经是会员了,怎么提出文字首字母
887
2022-05-30
简 介:
为了能够使得下一届的智能车竞赛中的节能信标组摆脱磁铁的干扰,可以进行对抗比赛。在现有的节能信标灯的基础上,增加光电反射检测单元。该电路采用了反射式光电检测管,利用单片机的定时ADC转换,可以在降低环境光线影响的基础上,提高检测的可靠性。
关键词:
光电管,ITR8307,ESP8266,智能车竞赛,节能型表
一、为什么需要反射式光电检测?
1、节能信标组
在 第十六届智能车竞赛竞速比赛 中有一组节能信标组。车模有参赛队伍自行设计制作,其中需要车模本身带有强磁铁来触发信标的切换。
如果两个信标灯进行对抗比赛的话,他们就极易由于磁铁的吸引而相互缠绕在一起。比如下面是中国计量大学赛博队之间的相互对抗比赛,可以看到最终他们的车模由于磁铁吸引在 一起了。
因此需要改变现在的信标灯使其能够通过其它的方式来检测是否车模停留在其上,或者经过信标灯。因此,一种方案就是使用反射式光电检测电路来测试是否有车模路经过信标灯的正上方。
2、反射式光电检测
为了能够与原来霍尔器件相兼容,制作的反射式光电检测电路可以独自安装在白色灯盘下面。它的体积很小,位于灯罩的正中央。当车模途径灯罩时,可以反射光电管发射的红外光,从而触发检测电路。
在前面博文 反射式红外光电管 ITR8307 对于小型反射式红外光电管ITR8307的特性进行了测量,通常情况下,这款微型光电管检测反射物体距离只有几毫米。这个距离不能够满足节能信标组内检测车模经过的需求。
在信标灯检测中,对于光电检测性能要求:
可靠的检测距离应该大于5厘米;
能够对于环境光线不敏感;
在反射式红外光电管 ITR8307中,可以看到,可以通
过一下几种方式来增加ITR8307的检测距离:
增加ITR8307发光二极管电流;
增加ITR8307光敏三极管负载电阻的阻值;
为了达到不受环境光线的影响,则需要对于ITR8307的发送与检测通过信号调制发送与解调接收。
二、利用ADC进行信号检测
1、基本原理
利用单片机的IO口控制ITR8307的发光二极管的导通与截止,然后利用单片机的ADC来检测ITR8307光电三极管集电极输出电压的变化。由于这个变化是与发送二极管的导通截止是同步的,而且可以做到高速切换,所以这可以与环境光线的缓慢变化相区分。
如果单片机IO口输出的调制频率做到50Hz的整数倍数,同样这也可以将照片灯光中50Hz及其谐波分量进行滤除。
2、利用ESP8266做实验
为了验证上面方式的可行性以及检测效果,使用 ESP-12F模块转接板模块 进行实验。在 测试三相无刷电机驱动器 XXD2212 电调 中对于ESP8266的ADC转换时间进行了测量,它需要240 μ s \mu s μs。
根据 ESP8266 MicroPython ADC 文档可以知道,它的电压转换范围是0 ~ 1.0V,ADC数值为 10bit。
下图给出了利用DH1766可编程直流电源输出直流电压到ESP8266的 ADC,它的ADC转换结果与输入电压之间的关系。
#!/usr/local/bin/python # -*- coding: gbk -*- #============================================================ # MEASURE.PY -- by Dr. ZhuoQing 2021-09-07 # # Note: #============================================================ from headm import * from tsmodule.tsvisa import * dh1766volt(0.1) def thonnycmd(cmd): tspsendwindowkey('Thonny', 's', alt=1, noreturn=1) tspsendwindowkey('Thonny', '%s '%cmd, noreturn=1) def thonnyshs(cmd='', wait=0): tspsendwindowkey('Thonny', 's', alt=1, noreturn=1) if len(cmd) > 0: tspsendwindowkey('Thonny', '%s\r'%cmd, noreturn=1) if wait > 0: time.sleep(wait) tspsendwindowkey('Thonny', 'ac', control=1, noreturn=1) tspfocuswindow('TEASOFT:1') return clipboard.paste() setv = linspace(0, 1.2, 100) adcdim = [] for v in setv: dh1766volt(v) time.sleep(1) str = int(thonnyshs('a', 0.2).split()[-1]) adcdim.append(str) tspsave('data', setv=setv, adc=adcdim) printf(v, str) plt.plot(setv, adcdim) plt.xlabel("Voltage(V)") plt.ylabel("ADC") plt.grid(True) plt.tight_layout() plt.show() #------------------------------------------------------------ # END OF FILE : MEASURE.PY #============================================================
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from machine import Pin,PWM,ADC import time led0 = Pin(13, Pin.OUT) led1 = Pin(15, Pin.OUT) adc = ADC(0) pwm0 = PWM(Pin(5)) pwm0.freq(100) pwm0.duty(100) print('Begin to read data....') count = 0; while True: count += 1 key = input() print(adc.read())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
一、测试电路
下图给出了测试电路。 其中T1用于驱动ITR8307的发光二极管; U2是将ITR8307的集电极的电压进行阻抗转换,然后又R4,R5分压后送入ESP8266的ADC。
二、测量结果
1、初步测试
使用PIn5产生100Hz的 50% 占空比的PWM波形,驱动T1(9018)。将 ITR8307 至于反射白纸上面 5 厘米。测试 ITR8307的光电管集电极的电压波形。
下面是测量ITR8307的光电管输出电压波形。
2、测试交替ADC数值
采集相继调制后的ADC数值。
from machine import Pin,PWM,ADC import time led0 = Pin(13, Pin.OUT) led1 = Pin(15, Pin.OUT) adc = ADC(0) out = Pin(5, Pin.OUT) print('Begin to read data....') count = 0; while True: v1 = adc.read() out.on() time.sleep_ms(20) v2 = adc.read() out.off() time.sleep_ms(20) count += 1 if count >= 1: count = 0 print(v1 - v2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
下面显示了光电管上面没有任何遮挡物读出的数值。
下图显示了手从光电管上方5厘米经过引起读数的波动。
从上面对比实验来看,这种方式光电管可以很灵敏检测到经过物体。
三、环境光滤波
1、环境光线干扰
下图显示了,室内电灯引起光电管的输出电压波。可以看到它是100Hz的波动。根据 电灯泡内通有交流电,为什么看不到灯泡在闪烁? 可以知道这是由于室内电灯的闪烁引起光电管的输出信号。
2、控制采样时间间隔
如果前后两次读取的ADC值时间恰好是10ms的整数倍数,这种波动反映在两次ADC数值上变化很小。在前面的实验中,前后两次读取数值时间间隔为20ms,所以电压波动比较小。
如果将前后两次ADC的转换时间改为5ms,此时对应的数值波动就会大大增加了。下图显示了这种情况下采集到的数值波动。
3、在中断中采样
在前面实验中是在程序循环中进行ADC采样。由于ADC采样也会产生一定的时间,所以循环对应的时间间隔不一定是10ms准确的倍数。
通过在定时中断中进行ADC转换,可以进一步提高两次采样时间的精度。通过对比可以看到,在定时器中断中采样ADC的确降低了环境光线对于ADC数值波动的影响。
from machine import Pin,PWM,ADC,Timer import time led0 = Pin(13, Pin.OUT) led1 = Pin(15, Pin.OUT) adc = ADC(0) out = Pin(5, Pin.OUT) print('Begin to read data....') count = 0 v1 = 0 v2 = 0 def sampleADC(n): global count,v1,v2 if count == 0: count = 1 v1 = adc.read() out.on() else: count = 0 v2 = adc.read() out.off() tim = Timer(-1) tim.init(period=100, mode=Timer.PERIODIC, callback=sampleADC) while True: time.sleep_ms(50) print(v1-v2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
四、增加灵敏度
为了使得车模经过信标灯罩更容易被检测到,可以在车模底盘粘贴白色,或者红色的纸张,这样可以进一步增加反射信号的强度,从而使得光电检测更加灵敏。
通过ESP8266的ADC读取反射式光电管的输出电压,可以比较方便进行光电信号的同步解调。只要相邻两次的ADC转换时间为10ms的整数倍数,就可以抑制由于环境光线对于光电管输出信号的影响。
下面,就需要使用普通的单片机来实现上述检测方案。制作成功能小板,可以在现有的节能灯电路上直接进行焊接,替代原来的霍尔传感器。
一、现在方案存在的问题
最后需要说明一下,实际上本文的方案在考虑的时候是没有考察发光盘本身发送的红光以及红外线的影响。相关这部分的问题以及如何应用需要进行进一步的测试与研究。
■ 相关文献链接:
第十六届全国大学智能汽车竞赛竞速比赛规则
反射式红外光电管 ITR8307
ESP-12F模块转接板测试版调试说明,下载MicroPython程序。ESP8266-12F
测试三相无刷电机驱动器 XXD2212 电调
ESP8266 MicroPython ADC
电灯泡内通有交流电,为什么看不到灯泡在闪烁?
● 相关图表链接:
图1.0 中国计量大学赛博队之间进行信标组对抗比赛
图1.1 ESP8266 ADC测试结果
图2.1 测试电路
图2.2 在面包板上搭建的实验电路
图2.3 将ITR8307置于白纸上方5厘米
图2.4 测量ITR8307的光电管输出电压波形
图2.2.2 直接对射天空读取数值
图2.2.3 手在光电管上面5厘米经过对应的波形
图2.3.1 环境光引起输出光线波动
图2.3.2 两次ADC转换时间间隔为5ms时对应的ADC波动值
图2.4.1 在中断中采样ADC的波动
图2.4.2 使用红色反射布经过光电管上方引起数值输出
单片机 硬件开发
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。