人、設(shè)備或車輛或移動物體的路徑中物體的距離測量被用于機(jī)器人運(yùn)動控制、車輛控制、盲人手杖、醫(yī)療設(shè)備等大量應(yīng)用中。有很多可用于距離測量的方法,但使用超聲波傳感器進(jìn)行測量是其他選項(xiàng)中最便宜的方法之一。在這個項(xiàng)目中,我們將使用HC-SR04 超聲波傳感器與 ATtiny85 微控制器 IC 和 OLED 顯示模塊來構(gòu)建數(shù)字超聲波尺。
超聲波尺所需組件
閣樓85 IC
HC-SR04 超聲波傳感器
I 2 C OLED顯示模塊
AMS1117 5V 穩(wěn)壓器
3×10KΩ電阻
1× 10 μf 電容器
9V電池
超聲波數(shù)字尺電路圖
使用 ATtiny85的超聲波尺原理圖如下:
上圖顯示了超聲波傳感器和 OLED 顯示器與 Attiny85 IC 接口的電路圖。OLED Display 和 ATtiny85 之間的接口必須使用 I2C 協(xié)議來實(shí)現(xiàn)。因此,ATtiny85 的 SCL 引腳 (PB2) 連接到 OLED 顯示器的 SCL 引腳。同樣,ATtiny85 的 SDA 引腳 (PB0) 連接到 OLED 顯示器的 SDA 引腳。超聲波傳感器的 Echo 和 Trig 引腳分別連接到 ATtiny85 的 PB3 和 PB4 引腳。最后,為所有組件供電,我們使用了 9V 電池。然后使用 AMS117-5V 穩(wěn)壓器將此 9V 轉(zhuǎn)換為 5V。
注意:按照我們之前的教程使用 Digispark Bootloader 直接通過 USB 編程 ATtiny85 IC 或使用 Arduino 編程 ATtiny85對 ATtiny85 IC 進(jìn)行編程。
超聲波尺PCB制作
現(xiàn)在我們有了原理圖,我們可以繼續(xù)使用 ATtiny85 為超聲波測距儀布置 PCB 。您可以使用您選擇的任何 PCB 軟件來設(shè)計 PCB。
下面是超聲波標(biāo)尺PCB頂層和底層的3D模型視圖:
組裝 Attiny85 超聲波標(biāo)尺 PCB
幾天后,我們收到了整齊包裝的 PCB,PCB 質(zhì)量一如既往地好。板子的頂層和底層如下圖所示:
在確保軌道和腳印是正確的之后。我繼續(xù)組裝PCB。完全焊接的板如下所示:
ATtiny85超聲波尺碼說明
文檔末尾給出了完整的 Arduino 計步器代碼。在這里,我們將解釋代碼的一些重要部分。
該代碼使用TinyWireM.h和TinyOzOLED.h庫。TinyWireM 庫可以從 Arduino IDE 中的庫管理器下載并從那里安裝。為此,打開 Arduino IDE 并轉(zhuǎn)到Sketch 《 Include Library 《 Manage Libraries?,F(xiàn)在搜索TinyWireM.h并安裝 Adafruit 的TinyWireM庫。
而TinyOzOLED.h庫可以從給定的鏈接下載。
將庫安裝到 Arduino IDE 后,通過包含所需的庫文件來啟動代碼。
?
#include "TinyWireM.h" #include "TinyOzOLED.h"
?
在接下來的幾行中,定義超聲波傳感器引腳。我們已經(jīng)定義了超聲波傳感器的觸發(fā)和回波引腳,如下所示。
?
常量 int trigPin = 4; //P4 int echoPin = 3; //P3
?
然后是setup()函數(shù)。這是我們將 ATtiny85 引腳定義為輸入/輸出并開始 ATtiny85 和 OLED 之間的通信的地方。
?
無效設(shè)置(){ TinyWireM.begin(); ozOled.init(); OzOled.clearDisplay(); OzOled.setNormalDisplay(); OzOled.sendCommand(0xA1); OzOled.sendCommand(0xC8); pinMode(trigPin,輸出); }
?
現(xiàn)在在loop()函數(shù)中,我們首先使用超聲波傳感器測量距離,然后將其顯示在 OLED 顯示屏上。要使用超聲波傳感器測量距離,首先,您必須將觸發(fā)引腳設(shè)置為LOW 狀態(tài) 2 μs 以確保清晰?,F(xiàn)在要生成超聲波,將trigPin設(shè)置為高電平 10 μs。之后,使用pulseIn()函數(shù)讀取行程時間并將讀數(shù)存儲到名為“duration”的變量中。pulseIn()函數(shù)有2個參數(shù),第一個是echo pin的名字,第二個是echo pin的狀態(tài)。然后在獲得距離后,我們將其顯示在 OLED 顯示屏上。
?
數(shù)字寫入(trigPin,低); 延遲微秒(2); digitalWrite(trigPin, HIGH); 延遲微秒(10); 數(shù)字寫入(trigPin,低); pinMode(echoPin,輸入); 持續(xù)時間=脈沖輸入(回聲針,高); cm = 微秒到厘米(持續(xù)時間); OzOled.printString("距離:", 3, 4); OzOled.printNumber(cm, 0, 12, 4);
?
測試我們的超聲波標(biāo)尺
組裝好 PCB 并編程 ATtiny85 進(jìn)行距離測量后,我們現(xiàn)在可以測試超聲波尺了。為此,使用 9V 為電路板供電并等待測量的距離顯示在 OLED 顯示屏上。您可以使用刻度尺或卷尺檢查測量的距離是否正確。
#include “TinyWireM.h”
#include “TinyOzOLED.h”
const int trigPin = 4; //P4
int echoPin = 3; //P3
int 持續(xù)時間,cm;
void setup() {
TinyWireM.begin();
ozOled.init();
OzOled.clearDisplay();
OzOled.setNormalDisplay();
OzOled.sendCommand(0xA1); // 設(shè)置方向
OzOled.sendCommand(0xC8);
pinMode(trigPin,輸出);
}
void loop()
{
//OzOled.clearDisplay();
數(shù)字寫入(trigPin,低);
延遲微秒(2);
digitalWrite(trigPin, HIGH);
延遲微秒(10);
數(shù)字寫入(trigPin,低);
//設(shè)置輸入引腳,并在uS
pinMode(echoPin,INPUT)中接收持續(xù)時間;
持續(xù)時間=脈沖輸入(回聲針,高);
// 將脈沖傳播時間轉(zhuǎn)換為距離
cm = microsecondsToCentimeters(duration);
顯示OLED();
延遲(1000);
OzOled.clearDisplay();
}
void displayOLED() {
OzOled.printString(“距離:”, 3, 3);
OzOled.printNumber(cm, 0, 12, 3);
OzOled.printString(“(在 CM 中)”, 5, 5);
}
long microsecondsToCentimeters(long microseconds)
{
// 聲速為 340 m/s (29 us/cm)
return microseconds / 29 / 2;
}
評論
查看更多