树莓派之超声波测距的实现
一、首先來進行對超聲波模塊進行簡單的介紹
超聲波傳感器模塊上面通常有兩個超聲波元器件,一個用于發射,一個用于接收,電路板上有4個引腳,分別是VCC(正極),Trig(觸發),Echo(回應),Gnd(接地即0V),主要的參數如下:
工作電壓與電流:5V,15mA
感測距離:2-400cm
感測角度:不大于15°
被測物的面積不要小于50cm2,并且盡量平整
具備溫度補償電路
在超聲波模塊的觸發腳位輸入10微秒以上的高電位,即可發射超聲波,發射超聲波之后,與接收到傳回的超聲波之前,”響應“腳位呈現高電位,因此,程序可以從響應腳位的高電位的脈沖的持續時間,換算出被測物的距離。
原理圖解讀:
觸發信號(Trig):我們從圖中可以看出這個引腳有一個持續10微秒的高電平,從而激發T發波
模塊內部發出的信號:這個就是Trig所發出的波的具體形狀
輸出回響信號(Echo):在Trig引腳發波的過程中,Echo一直維持高電平狀態,從而得出波在空氣中跑的時間
接線解讀:
VCC:接5V
Gnd:接0V(即接地)
Trig和Echo接樹莓派的gpio口,自定義接
二、編程相關的函數的解讀
a.struct timeval結構體
a.1 struct timeval是linux系統中關于時間的一個系統內部結構體,在頭文件“time.h”中,原型是:
| tv_usec | 微秒 |
b.函數gettimeofday
頭文件:#include <sys/time.h>
函數原型:
| struct timezone *tz | 得到當前的時區,一般設置為NULL |
c.延時函數
| delayMicroseconds(us) | 微秒級延時函數 |
時間的換算:
1s = 1000 ms
1 ms = 1000 us
1s = 1000000 us
三、直接上編程實例
#include <stdio.h> #include <wiringPi.h> #include <time.h> //結構體struct timeval的頭文件 #include <sys/time.h> //函數gettimeofday的頭文件#define Trig 7 #define Echo 0void UItraInit() {pinMode(Trig,OUTPUT);pinMode(Echo,INPUT); }float disMesure() {float distance;struct timeval start; //struct timeval 是系統自帶的測試時間的結構體struct timeval end;long time_start;long time_end;digitalWrite(Trig,LOW); //先讓超聲波Trig口的波達到平穩delayMicroseconds(2); //持續兩微秒digitalWrite(Trig,HIGH); //然后讓Trig保持十秒的高電平狀態從而輸出超聲波delayMicroseconds(10);digitalWrite(Trig,LOW); //十秒過后讓Trig恢復低電平while(digitalRead(Echo) != 1); //測試超聲波還沒發出時的時間gettimeofday(&start,NULL);while(digitalRead(Echo) != 0); //測試超聲波在已經被Echo口接收時的時間gettimeofday(&end,NULL);time_start = start.tv_sec*1000000 + start.tv_usec; //將時間轉化為微秒time_end = end.tv_sec*1000000 + end.tv_usec;distance = (float)(time_end - time_start)/1000000*34000/2; //計算出距離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; }以上是基于樹莓派的超聲波的學習筆記
學習筆記,僅供參考
總結
以上是生活随笔為你收集整理的树莓派之超声波测距的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带你爬取双色球历史开奖信息并作可视化分析
- 下一篇: eclipse中安装ant,详细