日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树莓派之超声波测距的实现

發(fā)布時(shí)間:2023/12/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派之超声波测距的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、首先來進(jìn)行對(duì)超聲波模塊進(jìn)行簡單的介紹
超聲波傳感器模塊上面通常有兩個(gè)超聲波元器件,一個(gè)用于發(fā)射,一個(gè)用于接收,電路板上有4個(gè)引腳,分別是VCC(正極),Trig(觸發(fā)),Echo(回應(yīng)),Gnd(接地即0V),主要的參數(shù)如下:
工作電壓與電流:5V,15mA
感測(cè)距離:2-400cm
感測(cè)角度:不大于15°
被測(cè)物的面積不要小于50cm2,并且盡量平整
具備溫度補(bǔ)償電路
在超聲波模塊的觸發(fā)腳位輸入10微秒以上的高電位,即可發(fā)射超聲波,發(fā)射超聲波之后,與接收到傳回的超聲波之前,”響應(yīng)“腳位呈現(xiàn)高電位,因此,程序可以從響應(yīng)腳位的高電位的脈沖的持續(xù)時(shí)間,換算出被測(cè)物的距離。

原理圖解讀:

觸發(fā)信號(hào)(Trig):我們從圖中可以看出這個(gè)引腳有一個(gè)持續(xù)10微秒的高電平,從而激發(fā)T發(fā)波
模塊內(nèi)部發(fā)出的信號(hào):這個(gè)就是Trig所發(fā)出的波的具體形狀
輸出回響信號(hào)(Echo):在Trig引腳發(fā)波的過程中,Echo一直維持高電平狀態(tài),從而得出波在空氣中跑的時(shí)間

接線解讀:
VCC:接5V
Gnd:接0V(即接地)
Trig和Echo接樹莓派的gpio口,自定義接

二、編程相關(guān)的函數(shù)的解讀
a.struct timeval結(jié)構(gòu)體
a.1 struct timeval是linux系統(tǒng)中關(guān)于時(shí)間的一個(gè)系統(tǒng)內(nèi)部結(jié)構(gòu)體,在頭文件“time.h”中,原型是:

struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds.*/ }; tv_sec秒
tv_usec微秒

b.函數(shù)gettimeofday
頭文件:#include <sys/time.h>
函數(shù)原型:

int gettimeofday(struct timeval *tv, struct timezone *tz); struct time *tv存放的是上面時(shí)間結(jié)構(gòu)體的地址
struct timezone *tz得到當(dāng)前的時(shí)區(qū),一般設(shè)置為NULL

c.延時(shí)函數(shù)

delay(ms)毫秒級(jí)延時(shí)函數(shù)
delayMicroseconds(us)微秒級(jí)延時(shí)函數(shù)

時(shí)間的換算:
1s = 1000 ms
1 ms = 1000 us
1s = 1000000 us

三、直接上編程實(shí)例

#include <stdio.h> #include <wiringPi.h> #include <time.h> //結(jié)構(gòu)體struct timeval的頭文件 #include <sys/time.h> //函數(shù)gettimeofday的頭文件#define Trig 7 #define Echo 0void UItraInit() {pinMode(Trig,OUTPUT);pinMode(Echo,INPUT); }float disMesure() {float distance;struct timeval start; //struct timeval 是系統(tǒng)自帶的測(cè)試時(shí)間的結(jié)構(gòu)體struct timeval end;long time_start;long time_end;digitalWrite(Trig,LOW); //先讓超聲波Trig口的波達(dá)到平穩(wěn)delayMicroseconds(2); //持續(xù)兩微秒digitalWrite(Trig,HIGH); //然后讓Trig保持十秒的高電平狀態(tài)從而輸出超聲波delayMicroseconds(10);digitalWrite(Trig,LOW); //十秒過后讓Trig恢復(fù)低電平while(digitalRead(Echo) != 1); //測(cè)試超聲波還沒發(fā)出時(shí)的時(shí)間gettimeofday(&start,NULL);while(digitalRead(Echo) != 0); //測(cè)試超聲波在已經(jīng)被Echo口接收時(shí)的時(shí)間gettimeofday(&end,NULL);time_start = start.tv_sec*1000000 + start.tv_usec; //將時(shí)間轉(zhuǎn)化為微秒time_end = end.tv_sec*1000000 + end.tv_usec;distance = (float)(time_end - time_start)/1000000*34000/2; //計(jì)算出距離return distance; }int main() {float distances;if(wiringPiSetup() == -1){printf("fail to Set up the wiringPi\n");return -1;}UItraInit();while(1){distances = disMesure();printf("distance is:%0.2fcm\n",distances);delay(1000);}return 0; }

以上是基于樹莓派的超聲波的學(xué)習(xí)筆記

學(xué)習(xí)筆記,僅供參考

總結(jié)

以上是生活随笔為你收集整理的树莓派之超声波测距的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。