利用ESP8266測量模塊來設計遠距離反射式光電檢測 : ITR8307
簡 介:
為了能夠使得下一屆的智能車競賽中的節能信標組擺脫磁鐵的干擾,可以進行對抗比賽。在現有的節能信標燈的基礎上,增加光電反射檢測單元。該電路采用了反射式光電檢測管,利用單片機的定時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小時內刪除侵權內容。