硬件清單
一、超聲波測(cè)距原理
二、HCSR04超聲波傳感器的使用
三、LCD1602液晶顯示屏的使用
1.Arduino上的I2C通信協(xié)議
2.使用LCD1602液晶顯示屏顯示“Hello World!”字符
四、完成超聲波測(cè)距
五、總結(jié)
硬件清單
一、超聲波測(cè)距原理
我們所使用的超聲波傳感器型號(hào)為HCSR04,可觀察到他有兩個(gè)“眼睛”狀的部件,兩個(gè)部件的作用一樣,均可發(fā)射和接收超聲波,并且按照上述原理圖進(jìn)行工作。
首先傳感器發(fā)射超聲波,并計(jì)時(shí),當(dāng)超聲波接觸到障礙物會(huì)被反射,當(dāng)傳感器接收到反射波,計(jì)時(shí)結(jié)束,然后利用距離、速度、時(shí)間公示進(jìn)行計(jì)算,得到傳感器到障礙物間的距離。
其具體工作原理簡(jiǎn)單了解即可,并不影響后述對(duì)超聲波傳感器的使用。
因此HCSR04超聲波傳感器的四個(gè)引腳的作用就比較明顯了,除了VCC接正極、GND接負(fù)極外,還有兩個(gè)引腳“Trig”及“Echo”,其中“Trig”用于控制發(fā)射超聲波,“Echo”用于接收反射波,所以“Trig”所接引腳應(yīng)為輸出,“Echo”所接引腳應(yīng)為輸入,因此在后續(xù)接線時(shí)可以把兩個(gè)引腳分別接到兩個(gè)數(shù)字端口,在端口初始化時(shí)分別設(shè)置輸入和輸出即可。
二、HCSR04超聲波傳感器的使用
接下來(lái)將HCSR04超聲波傳感器與Arduino進(jìn)行連接,除了VCC及GND分別接正負(fù)極外,這里“Trig”與數(shù)字端口D5連接,“Echo”與數(shù)字端口D4連接,如下圖所示:
并且確定安裝的庫(kù)文件是否一致,不同的開(kāi)發(fā)者貢獻(xiàn)的庫(kù)文件不同,調(diào)用方法的名稱也就不同,因此如果與本文按裝的庫(kù)文件不同的話,大概率會(huì)報(bào)錯(cuò),建議安裝與下圖一致的庫(kù)文件。
將超聲波傳感器與Arduino板連接之后,繼續(xù)完成以下程序:
//此程序功能為將SR04超聲波傳感器測(cè)的的距離數(shù)值,通過(guò)串口進(jìn)行輸出 #include<HCSR04.h> //導(dǎo)入超聲波SR04庫(kù) HCSR04 ultrasonic(5,4); //聲明一個(gè)對(duì)象,其名為ultrasonic(自定義的名稱) //4號(hào)為“Echo”,5號(hào)為“Trig” void setup() { pinMode(4, INPUT); //設(shè)置“Echo”接入的引腳為輸入 pinMode(5, OUTPUT); //設(shè)置“Trig”接入的引腳為輸出 Serial.begin(9600); //串口監(jiān)視器初始化 } int distance; //定義一個(gè)名為“distance”的變量,用于存放檢測(cè)的距離數(shù)值 void loop() { distance = ultrasonic.dist(); //調(diào)用了超聲波庫(kù)里的“dist()”方法,獲得檢測(cè)距離數(shù)值 Serial.print(distance); //輸出distance數(shù)值,且不換行 Serial.println(" cm"); //緊接著輸出單位,且換行 }
將程序上傳之前先對(duì)以上程序的部分代碼塊進(jìn)行解釋:
1.“HCSR04 ultrasonic(4, 5)”我們稱之為對(duì)象的實(shí)例化,即HCSR04為超聲波庫(kù)的名稱,在其后自定義一個(gè)名稱“ultrasonic”(即超聲波的英文,可自定義任意名稱),并且不同的實(shí)例化過(guò)程有不同的參數(shù)要輸入,比如HCSR04后需要加入“Trig”和“Echo”所接引腳的端口號(hào),從而在后述程序中,如果要調(diào)用HCSR04庫(kù)內(nèi)的方法的話,僅需使用“ultrasonic.方法名()”,即可。
2.“distance = ultrasonic.dist()”這一代碼塊是調(diào)用了超聲波傳感器中獲取距離的方法“dist()”,與前面int定義的distance截然不同,int定義的變量可取任意名稱,僅為變量名,但“Distance()”為超聲波傳感器固定的方法。
接下來(lái)將上述程序上傳至Arduino板,并且打開(kāi)串口監(jiān)視器,觀測(cè)所測(cè)的數(shù)值是否準(zhǔn)確。
另外HCSR04型號(hào)的超聲波傳感器的測(cè)量范圍官方聲稱為2cm ~ 450cm,因此超出這個(gè)范圍的數(shù)值會(huì)不準(zhǔn)確。
三、LCD1602液晶顯示屏的使用
首先觀察LCD1602顯示屏的正反面(其中反面為實(shí)物圖),當(dāng)前LCD顯示屏的驅(qū)動(dòng)板(即黑色的電路板)上共6個(gè)引腳,左側(cè)兩個(gè)相鄰的引腳直接連接即可,連接后便打開(kāi)了背光;右側(cè)的引腳“GND接負(fù)極”“VCC接正極”已經(jīng)比較熟悉了,對(duì)于“SDA”及“SCL”引腳,我們先對(duì)此進(jìn)行詳細(xì)介紹。
1.Arduino上的I2C通信協(xié)議
I2C總線是由Philips公司開(kāi)發(fā)的一種簡(jiǎn)單、雙向二線制同步串行總線。它只需要兩根線即可在連接于總線上的器件之間傳送信息。
每種不同的硬件都有不同的I2C地址,因此對(duì)于I2C通信的工作原理我們可以理解為:SCL(時(shí)鐘線)用于規(guī)定當(dāng)前時(shí)刻是否要傳輸數(shù)據(jù),就如同紅綠信號(hào)燈的作用,防止數(shù)據(jù)傳輸混亂;SDA(數(shù)據(jù)線)用于在給定時(shí)間內(nèi)給不同地址的硬件傳輸數(shù)據(jù),并且雙向傳輸。當(dāng)前我們僅需了解不同硬件的I2C地址即可輕松使用I2C通信。
2.使用LCD1602液晶顯示屏顯示“Hello World!”字符
在Arduino拓展板的復(fù)位鍵旁邊設(shè)有專門(mén)的I2C引腳,可直接對(duì)應(yīng)連接,當(dāng)然也可以“SDA - A4”“SCL - A5”的線序連接。
連接好之后觀察屏幕,在未寫(xiě)入程序之前,LCD顯示屏的第一行應(yīng)該是可以顯示16個(gè)小方塊的,如果未顯示,則使用十字螺絲刀來(lái)擰動(dòng)顯示屏背板藍(lán)色的旋鈕,直到小方塊清晰可見(jiàn)。這也就是為什么LCD1602顯示屏標(biāo)有“1602”——此顯示屏可顯示16列2行字符(英文)。
本章使用的LCD顯示屏為I2C通信,因此使用的庫(kù)文件也需要對(duì)應(yīng),可看下圖使用的庫(kù)文件:
接下來(lái)完成下列程序:
//此程序功能為使用LCD1602輸出“Hello World!”字符 #include <Wire.h> //導(dǎo)入I2C通信庫(kù) #include <LiquidCrystal_I2C.h> //導(dǎo)入LCD顯示屏庫(kù) LiquidCrystal_I2C lcd(0x27,16,2); //實(shí)例化一個(gè)名為“l(fā)cd”的對(duì)象,并且內(nèi)部有三個(gè)參數(shù) //分別為(I2C通信地址,顯示列數(shù),顯示行數(shù)) void setup() { lcd.init(); //顯示屏初始化 lcd.backlight(); //開(kāi)啟顯示屏背光 lcd.setCursor(0,0); //設(shè)置顯示光標(biāo)位置(列,行) lcd.print("Hello, world!"); //顯示字符 lcd.setCursor(0,1); //在第一列,第二行開(kāi)始顯示 lcd.print("Successful!"); //顯示字符 } void loop() { }
將以上程序上傳,并觀察是否顯示了兩行字符,分別是“Hello, world!”及“Successful!”;接下來(lái)對(duì)部分代碼塊進(jìn)行解釋:
1.“#include <Wire.h>”為導(dǎo)入I2C通信庫(kù)。
2.“#include <LiquidCrystal_I2C.h>”為導(dǎo)入本程序使用的基于I2C通信協(xié)議的LCD顯示屏庫(kù)。
3.“LiquidCrystal_I2C lcd(0x27,16,2)”為實(shí)例化了一個(gè)名為“l(fā)cd”的對(duì)象,并規(guī)定了LCD的I2C地址“0x27”,以及顯示屏顯示的列行數(shù)。
其他的代碼作用均已在程序中進(jìn)行了注釋解釋,則不再贅述。
四、完成超聲波測(cè)距
按照上圖將“SR04超聲波傳感器”及“LCD1602顯示屏”與Arduino板進(jìn)行連接;“Trig”與數(shù)字端口D5連接,“Echo”與數(shù)字端口D4連接,LCD顯示屏的引腳連接到IIC區(qū)域;然后完成以下程序:
//此程序功能為將超聲波傳感器測(cè)得的數(shù)值使用LCD進(jìn)行顯示 //并且在2cm-450cm內(nèi)正常顯示,超出范圍則輸出錯(cuò)誤提示 #include<HCSR04.h> //導(dǎo)入超聲波SR04庫(kù) #include<Wire.h> //導(dǎo)入I2C通信庫(kù) #include<LiquidCrystal_I2C.h> //導(dǎo)入LCD顯示屏庫(kù) LiquidCrystal_I2C lcd(0x27,16,2); //聲明使用LCD庫(kù)的對(duì)象 HCSR04 ultrasonic(5,4); //聲明一個(gè)對(duì)象,其名為ultrasonic(自定義的名稱) //4號(hào)為“Echo”,5號(hào)為“Trig” void setup() { lcd.init(); //顯示屏初始化 lcd.backlight(); //開(kāi)啟LCD顯示屏背光 pinMode(4,INPUT); //Echo引腳 pinMode(5,OUTPUT); //Trig引腳 } int distance; //定義一個(gè)變量用于存儲(chǔ)超聲波測(cè)量的數(shù)值 void loop() { distance = ultrasonic.dist(); //將超聲波測(cè)得的數(shù)值賦值給變量 if(distance >= 2 && distance <= 450) //判斷測(cè)得數(shù)值是否在測(cè)量范圍內(nèi) { lcd.setCursor(0,0); //設(shè)置LCD顯示光標(biāo)位置 lcd.print(distance); //使用LCD顯示屏顯示distance的數(shù)值 lcd.print(" cm"); //顯示單位“cm” delay(200); //延時(shí)200毫秒 lcd.clear(); //LCD顯示屏清屏,用于顯示下一個(gè)數(shù)值 } else //如果超出范圍 { lcd.print("Wrong!"); //輸出“Wrong!” delay(200); lcd.clear(); } }
上述程序是對(duì)超聲波傳感器及LCD顯示屏的綜合應(yīng)用,并且使用了“if判斷”,其代碼塊的作用均已標(biāo)柱到代碼區(qū)域,不再詳細(xì)解釋。
將上述代碼進(jìn)行上傳,并測(cè)試是否可實(shí)現(xiàn)超聲波測(cè)距功能。
五、總結(jié)
本章使用SR04超聲波傳感器結(jié)合LCD液晶顯示屏來(lái)實(shí)現(xiàn)了超聲波測(cè)距的功能;并且對(duì)于超聲波傳感器及顯示屏都需要調(diào)用相應(yīng)的庫(kù)文件進(jìn)行控制,這里需要注意的是一定要使用正確的庫(kù)文件,因?yàn)楦黝愑布膸?kù)文件均來(lái)自于不同的開(kāi)發(fā)者,不同的開(kāi)發(fā)者貢獻(xiàn)的庫(kù)會(huì)存在庫(kù)文件名稱及方法名不同的情況,當(dāng)然理論上不同的庫(kù)文件都能實(shí)現(xiàn)對(duì)硬件的控制,所以最好使用與本文相同的庫(kù)文件。完成本章的超聲波測(cè)距功能之后,不妨聯(lián)想汽車(chē)的倒車(chē)?yán)走_(dá)原理,其功能也是可以通過(guò)Arduino平臺(tái)來(lái)實(shí)現(xiàn)的,后續(xù)還會(huì)帶來(lái)更多硬件的使用方法及組合成完整功能的教學(xué)。