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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【树莓派】raspberry pi控制超声波测距

發(fā)布時間:2023/12/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【树莓派】raspberry pi控制超声波测距 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、超聲波
    • 1、模塊介紹
    • 2、工作原理
  • 二、gettimeofday函數
  • 三、樹莓派控制超聲波測距

一、超聲波

1、模塊介紹

簡介:
??超聲波傳感器模塊上面通常有兩個超聲波元器件,一個用于發(fā)射,一個用于接收。

硬件:
電路板上有4個引腳:
VCC(正級)
Trig(觸發(fā))
Echo(回應)
GND(接地-負極)

主要參數:

  • 工作電壓與電流:5V、15mA
  • 感測距離:2~400cm
  • 感測角度:不大于15°
  • 被測物體的面積:不要小于50cm2,且盡量平整
  • 具備溫度補償電路

??在超聲波模塊的觸發(fā)腳位輸入10微秒以上的高電位,即可發(fā)射超聲波,發(fā)射超聲波之后,與接收到傳回的超聲波之前,“響應”腳位呈現高電位。因此,程序可以從“響應”腳位的高位脈沖持續(xù)時間,換算出被測物的距離。

2、工作原理


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

白話來說:
T(發(fā)波),R(接受)
先給 Trig 引腳發(fā)送一個 10us(微秒)的 TTL(高電平)
T就可以發(fā)波了,發(fā)出的是循環(huán) 8 個 40KHz 的脈沖
波發(fā)出去后,Echo 引腳就會一直維持高電平,也就是說波在空中傳播的過程是一直維持高電平
那么就可以根據Echo 引腳的高電平維持時間,超聲波在空氣中的物理性質的傳輸速度,就可以算出障礙物跟發(fā)波點的距離
即超聲波能在空氣中1秒能跑多遠,那么就可以通過Echo 引腳的高電平維持時間,換算距離了

二、gettimeofday函數

作用:
??把得到從1970年1月1日0時0分0秒到現在的秒數返回到第一個參數指向的結構體中,第二個參數是關于時區(qū),如果不用,填入NULL,簡單的說就是獲取時間。

函數原型:

#include <sys/time.h> int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv, const struct timezone *tz);

參數介紹:
函數的參數為兩個結構體指針
tv:是保存獲取時間結果的結構體
tz:用于保存時區(qū)結果

  • timeval結構體:
struct timeval {time_t tv_sec; /* seconds */suseconds_t tv_usec; /* microseconds */ };
  • timezone結構體:
struct timezone {int tz_minuteswest; /* minutes west of Greenwich */int tz_dsttime; /* type of DST correction */ };

如果不用timezone結構體,若不使用,tz則傳入NULL即可。

返回值:
若成功,返回0
若出錯,返回-1,錯誤代碼存于errno

三、樹莓派控制超聲波測距

代碼:

#include <wiringPi.h> #include <stdio.h> #include <sys/time.h> #define Trig 4 #define Echo 5void ultraInit(void) {pinMode(Echo, INPUT); //設置端口為輸入pinMode(Trig, OUTPUT); //設置端口為輸出 }float disMeasure(void)* {struct timeval tv2;long start, stop;float dis;digitalWrite(Trig, LOW);delayMicroseconds(2);digitalWrite(Trig, HIGH);delayMicroseconds(10); //發(fā)出超聲波脈沖digitalWrite(Trig, LOW);while(!(digitalRead(Echo) == 1));gettimeofday(&tv1, NULL); //獲取當前時間 開始接收到返回信號的時候while(!(digitalRead(Echo) == 0));gettimeofday(&tv2, NULL); //獲取當前時間 最后接收到返回信號的時候/** int gettimeofday(struct timeval *tv, struct timezone *tz);* */start = tv1.tv_sec * 1000000 + tv1.tv_usec; //微秒級的時間stop = tv2.tv_sec * 1000000 + tv2.tv_usec;dis = (float)(stop - start) / 1000000 * 34000 / 2; //計算時間差求出距離return dis; }int main(void) {float dis;if(wiringPiSetup() == -1){ //如果初始化失敗,就輸出錯誤信息 程序初始化時務必進行printf("setup wiringPi failed !");return -1;}ultraInit();while(1){dis = disMeasure();printf("distance = %0.2f cm\n",dis);delay(1000);}return 0; }

分析:
1、delayMicroseconds (unsigned int howLong)
??將線程暫停指定的微秒數(1000微妙=1毫秒=0.001s),Linux是多線程的,所以實際暫停的秒數可能比設置的更多一些。

2、根據返回的秒數計算出微秒數
startTime = tv1.tv_sec * 1000000 + tv1.tv_usec;
stopTime = tv2.tv_sec * 1000000 + tv2.tv_usec;

??前面說到timeval結構體中含有兩個成員,tv_sec表示的是秒數,1秒=1 000 000微妙,第二個參數tv_usec表示的就是微秒數,所以通過這兩個式子我們就可以求出開始和結束時的微秒數,然后做差即可得到超聲波傳遞所使用的時間。

tv1.tv_sec單位是秒,乘1 000 000表示微秒,再加上后面的微秒數就是超聲波的時間。

3、根據時間計算距離
(stopTime - startTime) / 1000000 * 34000 / 2;
??因為stopTime和startTime原本表示的微妙,所以做差之后除1 000 000是將單位換算為秒。因為聲音是在空氣中傳播,所以取聲音的速度為340m/s=340 00cm/s,因為超聲波測距的誤差較小的范圍為200-300cm,所以這里用cm表示。

結果:

參考:
1、超聲波模塊筆記
2、gettimeofday函數及超聲波測距

最后謝謝閱讀,筆者乃小白,如有錯誤之處還請指正。

總結

以上是生活随笔為你收集整理的【树莓派】raspberry pi控制超声波测距的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。