前言
有沒(méi)有想過(guò)停車(chē)傳感器是如何工作的,您的車(chē)怎么知道離撞墻有多遠(yuǎn)?肯定見(jiàn)過(guò)機(jī)器人避開(kāi)障礙物吧,想知道它們是如何發(fā)現(xiàn)障礙物的嗎?這些問(wèn)題的答案都涉及到短程測(cè)距。在這個(gè)項(xiàng)目中,我們將使用Arduino UNO結(jié)合ROHM測(cè)距傳感器,測(cè)量15cm以?xún)?nèi)的木制目標(biāo)的距離。
雖然這個(gè)項(xiàng)目看起來(lái)很簡(jiǎn)單,但是傳感器并不能直接給出與目標(biāo)之間的距離。這時(shí),我們要用到光電晶體管,它根據(jù)與目標(biāo)之間的距離輸出一定的電壓,需要將這個(gè)電壓轉(zhuǎn)換成距離。由于光電晶體管產(chǎn)生的電壓變化與距離不呈線性關(guān)系,這個(gè)方法的復(fù)雜程度增加了。這涉及一種稱(chēng)為曲線擬合的方法,以從實(shí)驗(yàn)數(shù)據(jù)中獲得盡可能最接近的方程。通過(guò)本項(xiàng)目可學(xué)習(xí)以下知識(shí):
如何正確給LED供電:
- 如何從光電晶體管讀取傳感器輸入
- 如何收集校準(zhǔn)數(shù)據(jù)
- 如何使用MATLAB進(jìn)行曲線擬合
- 如何對(duì)基于Arduino的校準(zhǔn)進(jìn)行編程
- 使用Arduino UNO測(cè)量距離
概述
在這個(gè)DIY項(xiàng)目中,我們將開(kāi)發(fā)一個(gè)電路,使用Arduino的數(shù)字引腳為測(cè)距傳感器的LED供電。LED發(fā)出的光將從木制目標(biāo)反射,并被光電晶體管接收,光電晶體管將產(chǎn)生電壓信號(hào),由Arduino中的模擬引腳讀取。由于電壓變化相對(duì)于距離變化不呈線性關(guān)系,在與目標(biāo)不同距離處收集的數(shù)據(jù)將用于使用MATLAB生成控制方程。然后,將通過(guò)Arduino在代碼中使用該方程來(lái)測(cè)量距離。將按照以下順序介紹這個(gè)項(xiàng)目:
所需元器件:
- 電路原理圖
- 設(shè)置Arduino IDE
- 校準(zhǔn)編程
- 使用MATLAB進(jìn)行曲線擬合
- 最終編程
- 測(cè)試
所需元器件
元器件 | 鏈接/圖片 |
ROHM測(cè)距傳感器 RPR-220PC30N |
https://www.digikey.com/products/en?keywords=RPR-220PC30N |
請(qǐng)注意,我在本文中使用的是發(fā)射紅光的RPR-220UC30N,而鏈接中是發(fā)射藍(lán)光的替代件RPR-220PC30N,功能是相同的,后者目前更容易買(mǎi)到 |
![]() |
Arduino UNO R3 |
https://www.aliexpress.com/item/32981776049.html![]() |
USB B數(shù)據(jù)線 (通常隨Arduino UNO R3一起提供) |
![]() |
56kΩ和220Ω的電阻器 |
![]() |
400孔無(wú)焊面包板 |
https://www.aliexpress.com/item/32711841420.html ![]() |
10根跳線 |
https://www.aliexpress.com/item/32951945552.html ![]() |
電路原理圖
所有元器件都采購(gòu)齊全后,第一步是把所有東西都連接起來(lái)。這個(gè)項(xiàng)目不需要很多元器件;只需要通過(guò)正確的電阻器將Arduino與ROHM RPR-220傳感器正確連接即可。實(shí)際上,為了使其成為便攜式系統(tǒng),我們使用雙面膠帶將Arduino貼在面包板的背面,將ROHM傳感器貼在面包板的正面。ROHM傳感器引腳的定義如下所示:
連接示意圖如下所示:
實(shí)際接線如下所示:
設(shè)置Arduino IDE
Arduino編程需要設(shè)置Arduino IDE。Arduino IDE可在Linux和Windows上使用。對(duì)于這個(gè)DIY項(xiàng)目,我們將使用Windows桌面應(yīng)用程序。訪問(wèn)以下鏈接下載并安裝Arduino IDE:
Windows Installer,適用于Windows XP及更高版本
成功安裝后,打開(kāi)Arduino IDE并使用USB B數(shù)據(jù)線連接Arduino UNO R3:在Arduino IDE中,從“工具”>“端口”>“COM 3 (Arduino Genuino / UNO)”中選擇適當(dāng)?shù)腃OM端口。這時(shí),您已經(jīng)完成設(shè)置,可以開(kāi)始編程了。
校準(zhǔn)編程
首先,開(kāi)發(fā)程序,以獲取目標(biāo)放在不同距離時(shí)的傳感器值。包含注釋的代碼如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#define IR_LED_PIN 8 //Pin to light LED
void setup()
{
Serial.begin(9600);
pinMode(IR_INPUT_PIN, INPUT);
pinMode(IR_LED_PIN, OUTPUT);
}
void loop(){
int ambient = 0;
int lit = 0;
int value = 0;
digitalWrite(IR_LED_PIN, LOW); //Turning off LED to measure ambient light
digitalWrite(IR_LED_PIN, HIGH); //Turning on LED
delay(5);
lit = analogRead(IR_INPUT_PIN);//Measuring total reflected light on sensor
value = lit – ambient; //Removing ambient light value to calculate the net value of LED
Serial.print(“value = “);
Serial.println(value); //Printing final sensor value on serial monitor
delay(1000);
}
|
完成上述代碼后,編譯并將其上傳到Arduino。如果所有接線正確,LED將會(huì)點(diǎn)亮。如下所示設(shè)置用于校準(zhǔn)的儀器(將一個(gè)目標(biāo)放在15cm的距離處,標(biāo)尺放在下面):
現(xiàn)在,在Arduino IDE中,打開(kāi)“工具”>“串口監(jiān)視器”。執(zhí)行以下操作:
- 當(dāng)目標(biāo)放在15cm處時(shí),檢查傳感器值。
- 當(dāng)目標(biāo)放在10cm處時(shí),檢查傳感器值。
- 當(dāng)目標(biāo)放在5cm處時(shí),檢查傳感器值。
- 當(dāng)目標(biāo)放在2cm處時(shí),檢查傳感器值。
如上所述,由于目標(biāo)的顏色、環(huán)境光和環(huán)境不同,這些值可能會(huì)有所不同。在本例中,距離為15、10、5和2cm處對(duì)應(yīng)的值分別為15、30、97和487。
很明顯,這種關(guān)系不是線性的,我們需要一個(gè)方程來(lái)計(jì)算距離。這個(gè)方程將使用下面介紹的曲線擬合方法獲得。
使用MATLAB進(jìn)行曲線擬合
打開(kāi)MATLAB,如下所示寫(xiě)入x和y坐標(biāo)數(shù)據(jù):
現(xiàn)在轉(zhuǎn)到應(yīng)用程序中的曲線擬合。
擬合類(lèi)型選擇冪函數(shù)。
記下方程和常數(shù)a和b的值。
最終編程
最終編程時(shí),修改代碼以包括從曲線擬合獲得的方程,并刪除打印命令,但最終距離除外,這是必需的。由于已經(jīng)使用曲線擬合找到了傳感器值與距離之間的關(guān)系,因此將聲明一個(gè)附加變量來(lái)存儲(chǔ)距離的大小。
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
|
#define IR_INPUT_PIN A0 //Pin to read values from phototransistor
#define IR_LED_PIN 8 //Pin to light LED
double b= –0.585;
double dist;
void setup()
{
Serial.begin(9600);
pinMode(IR_INPUT_PIN, INPUT);
pinMode(IR_LED_PIN, OUTPUT);
}
void loop()
{
int ambient = 0;
int lit = 0;
int value = 0;
digitalWrite(IR_LED_PIN, LOW); //Turning off LED to measure ambient light
delay(5);//To give ADC and LED transition time
ambient = analogRead(IR_INPUT_PIN); //Saving value for ambient light
digitalWrite(IR_LED_PIN, HIGH); //Turning on LED
delay(5);
lit = analogRead(IR_INPUT_PIN);//Measuring total reflected light on sensor
value = lit – ambient; //Removing ambient light value to calculate the net value of LED
//Using power function and formulating equation generated by MATLAB
dist = pow(value,b);
dist = a*dist;
//Displaying the calculated distance
Serial.print(dist);
Serial.println(“ cm”);
}
|
測(cè)試
測(cè)試時(shí),使用相同的校準(zhǔn)設(shè)置。
將最終代碼上傳到Arduino后,打開(kāi)串口監(jiān)視器。您將看到以厘米為單位的距離值。為了驗(yàn)證測(cè)試,將屏幕上的值與地面上的標(biāo)尺進(jìn)行匹配。如果數(shù)值接近正確,您就成功應(yīng)用曲線擬合方法進(jìn)行了逼近。現(xiàn)在,您的系統(tǒng)可以可靠地計(jì)算不同場(chǎng)景中相似障礙物的距離。
評(píng)論