使用.NET IoT驅動超聲波測距傳感器

背景

最近買的一堆傳感器到貨了,先來把玩一下超聲波測距傳感器。超聲波傳感器一般用于機器人,小車的避障,物體的測距,液位檢測,停車檢測等領域。

188d4f39f9b76b9bfe81c4688da1770a.png

HC-SR04

知識回顧

開始之前我們先復習一下高中的物理知識。

a8d42a490603539793a2f8d5a6bafb95.png

原理

通過上圖的原理圖,又已知聲波速度,這里取 340 m/s (空氣中的音速在1個標準大氣壓和15℃的條件下約為340m/s)。

那么,我們通過記錄發射時間和接收時間,計算出間隔,然后距離根據(聲波速度 * 時間間隔)/ 2 就可以得到。

模塊介紹

我使用這個模塊是寬壓的 3.3v -5 v,探測距離:2cm-450cm,有2cm的超近盲區。精度0.3cm。

使用的方式也很簡單,一個控制口發出一個10US以上的高電平,就可以在接收口等待高電平輸出。一有輸出就記錄一個開始時間,當此口變為低電平時再記錄一個結束時間,他們的間隔時間就為此次測距的時間,根據公式便可算出距離。

接線測試

在這里我用的 Jetson TX2 開發版套件測試,針腳使用的 38,和40。

38腳連 Trig ,設為輸出模式;40 腳連 Echo,設為輸入模式。

其上還連接了 I2C 設備,一個SSD1306 OLED 顯示屏,作為后續的距離展示,更詳細的介紹可以看我之前的文章《使用.Net驅動Jetson Nano的OLED顯示屏》。

1610bad15ef949cccbddd5298e3d6cc2.png

接線圖

上圖因為沒找到 TX2 的圖片所以用的 Nano。樹莓派,Nano 和 TX2 的物理引腳功能一樣,只是 PCM 編碼和 GPIO 的編號是不一樣的,代碼有的情況下需要調整,后續會講到。

接好線,我們先快速用 Python 驗證下原理。

import RPi.GPIO as GPIO
import timeTRIG_PIN = 38
ECHO_PIN = 40def main():GPIO.setmode(GPIO.BOARD)GPIO.setup(TRIG_PIN, GPIO.OUT)GPIO.setup(ECHO_PIN, GPIO.IN)print("Demo running. Press CTRL+C to exit.")try:while True:time.sleep(1)distance = StartModule()print("Distance: {}cm".format(distance))finally:GPIO.cleanup()def StartModule():# 發送 trig 信號,持續 10us 的方波脈沖GPIO.output(TRIG_PIN,GPIO.HIGH)# 單位為 s ,10us 需轉換time.sleep(0.00001)GPIO.output(TRIG_PIN,GPIO.LOW)#等待低電平結束,記錄時間while GPIO.input(ECHO_PIN) == GPIO.LOW:passpulse_s = time.time()#等待高電平結束,再次記錄時間while GPIO.input(ECHO_PIN) == GPIO.HIGH:passpulse_e = time.time()# 測得距離(單位:m)  =  (pulse_end - pulse_start) * 聲波速度 / 2 return round((pulse_e - pulse_s) * 17000,2)if __name__ == '__main__':main()

.NET 實現

.NET IoT 庫由兩個 NuGet 包組成:

?System.Device.Gpio?Iot.Device.Bindings

System.Device.Gpio?支持使用各種協議來與低級別硬件引腳交互,以控制設備。我編寫的?Sang.IoT.SSD1306?就使用了這個庫。

Iot.Device.Bindings?提供了各種常用的設備綁定,當然里面其實也是有 SSD13xx 的,如果不是想了解原理,可以不用重復造輪子,先前往支持的設備文檔[1]里面查詢。

1.新建項目

dotnet new console -o ultrasonic

2.進入項目目錄

cd ultrasonic

3.安裝依賴庫

dotnet add package Iot.Device.Bindings

4.修改代碼

using System;
using System.Device.Gpio;
using System.Threading;
using Iot.Device.Hcsr04;
Console.WriteLine("Test sensor. Press Ctrl+C to end.");
// 此處注意 使用的是TX2設備,其他設備需查閱轉換
int TRIG_GPIO = 394; //Pin 38
int ECHO_GPIO = 393; //Pin 40using var controller = new GpioController();
using var sensor = new Hcsr04(controller,TRIG_GPIO,ECHO_GPIO);while (true)
{if(sensor.TryGetDistance(out _)){Console.WriteLine($"Distance: {sensor.Distance}");}Thread.Sleep(1000);
}

5.運行測試

dotnet run

以上便是 .NET 中的實現,如果你想驗證下驅動原理,可以自行嘗試用 .NET 編碼實現。

這里需要注意的是,傳入的 triggerPin 和 echoPin 是所用設備的 GPIO 編號,不是物理的針腳號,需要查閱資料獲取。

針對本案例,使用的 38 和 40針腳,在樹莓派中 GPIO 編號分別是 20和21,在 Jetson Nano 中分別是 77和78 ,在 Jetson TX2 中分別是 394和393。

接入顯示屏

基于以上代碼,我們引入包Sang.IoT.SSD1306

dotnet add package Sang.IoT.SSD1306

修改代碼

using System;
using System.Device.Gpio;
using System.Threading;
using Iot.Device.Hcsr04;using Sang.IoT.SSD1306;
using SkiaSharp;Console.WriteLine("Test sensor. Press Ctrl+C to end.");// 此處注意 使用的是TX2設備,其他設備需查閱轉換 
int TRIG_GPIO = 394; //Pin 38
int ECHO_GPIO = 393; //Pin 40using var controller = new GpioController();
using var sensor = new Hcsr04(controller,TRIG_GPIO,ECHO_GPIO);// 顯示準備
using var oled = new SSD1306_128_64(1);SKPaint paint = new SKPaint() { Color = new SKColor(255, 255, 255),StrokeWidth = 1,TextSize = 13,Style = SKPaintStyle.Fill,
};oled.Begin();
oled.Clear();while (true)
{if(sensor.TryGetDistance(out _)){Console.WriteLine($"Distance: {sensor.Distance}");// OLED 顯示using(var bitmap = new SKBitmap(128, 64, true)){SKCanvas canvas = new SKCanvas(bitmap);paint.TextSize = 13;canvas.DrawText(DateTime.Now.ToString(), 0, 13, paint);paint.TextSize = 30;canvas.DrawText(sensor.Distance.ToString(), 0, 50, paint);oled.Image(bitmap.Encode(SKEncodedImageFormat.Png, 100).ToArray());}oled.Display();}Thread.Sleep(1000);
}

最終效果如下:

2b38aad0bf67b05a4f4bf1fc01e7954c.png

最終效果圖

References

[1]?支持的設備文檔:?https://github.com/dotnet/iot/blob/main/src/devices/README.md

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285059.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2019-nCoV 全國新型肺炎疫情每日動態趨勢可視圖

傳染源: 野生動物,可能為中華菊頭蝠 病毒: 新型冠狀病毒 2019-nCoV 傳播途徑: 經呼吸道飛沫傳播,亦可通過接觸傳播 易感人群: 人群普遍易感。老年人及有基礎疾病者感染后病情較重,兒童及嬰幼兒也有發病 潛伏期: 一般為 3~7 天,最長…

C語言試題173之實現插入排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:實現排序…

【ArcGIS遇上Python】ArcGIS Python將多個文件夾內的分幅數據整合到同一個文件夾內——以Globeland30數據為例

文章目錄 WinRAR解壓縮ArcGIS Python批處理從Glabeland30官網下載的全球地覆蓋數據包括3年(2000、2010、2020),每一年都是按圖幅存儲的tif格式柵格數據。以2000的數據為例,全球共812個圖幅,每一個圖幅對應一個壓縮包,如下圖所示。 WinRAR解壓縮 在進行數據預處理時,必須…

Delphi中字符串比較大小 VS Oracle-SQL中字符串比較大小

重點注意Delphi和Oracle-SQL中比較字符串時空字符串的根本性的不同Delphi中的字符串比較 Delphi中字符串比較大小的規則:對應位置的字符按照字符編碼值逐個對比,直到遇到可以確定大小關系的就結束比較參考《Delphi的Ord函數和ASCII碼對照表》 常見的一些…

STM8S和STM8L調試串口中斷的注意點

源:STM8S和STM8L調試串口中斷的注意點

C語言試題174之實現快速排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:實現快速…

解決slideDown()、slideUp()執行結束后才執行下一次,導致鼠標離開后很久動畫依然在執行的問題...

問題描述: 給一個容器設置了mouseenter時,一個隱藏的box通過slideDown()顯示出來;mouseleave時,通過slideUp()隱藏。 當鼠標不斷在容器上滑過時,會導致鼠標離開很久后,動畫也在不斷執行 解決方法&#xff…

Docker Compose 安裝 Superset

前言動手學 dockerSuperset 是一個強大的在線 SQL 查詢編輯工具,同時也是一個輕量級的 BI 工具,今天我們就來動手學一下用 docker compose 安裝 Superset。安裝動手學 docker安裝 git 并克隆項目:yum install git -ygit clone https://github…

[轉]再見 NoSQL!

為解決大規模數據集合多重數據種類帶來的挑戰,NoSQL 應運而生,但現在卻也遇到了諸多問題,本文作者 Rick Negrin,曾在微軟工作 12 年,并在 SQL Server 團隊度過大部分光陰,他提出,是時候「和 NoS…

【ArcGIS Pro微課1000例】0008:ArcGIS Pro加載不同來源的在線底圖數據

ArcGIS Pro可以很方便的選擇不同來源的在線底圖數據,如中國地圖彩色版、各種形式的天地圖等。 打開ArcGIS Pro,點擊左下角的【設置】。 點擊【選項】。 ArcGIS Pro提供了三種形式的底圖:組織的默認底圖、自定義底圖<

ORA-16198: LGWR received timedout error from KSR

ORA-16198: LGWR received timedout error from KSRORA-16198 意味著主庫上的LOG_ARCHIVE_DEST_2的NET_TIMEOUT設置的太小&#xff0c;導致LNS不能在設置的時間內將日志傳輸到備庫。解決方法是提高NET_TIMEOUT的值到15-20 秒&#xff0c;SQL>ALTER SYSTEM SET LOG_ARCHIVE_D…

php+mysql實現數據分批插入

上周需要將云端的數據有條件的錄入到mysql中&#xff0c;最開始是使用遍歷數據然后一條條的插入的笨方法&#xff0c;結果速度慢的要死&#xff0c;所以又隨便寫了個笨方法2.0&#xff0c;記錄一下自己菜鳥的成長歷程。同時這也是在博客園的第一篇文章&#xff0c;目的僅僅是單…

RIL接聽電話沒有聲音的問題 [ RIL_Answer | RIL_SetAudioDevices ]

沒有什么好說明的&#xff0c;直接上代碼&#xff1a; RIL_Answer(m_hRil); RILAUDIODEVICEINFO audioDeviceInfo; audioDeviceInfo.cbSize sizeof(audioDeviceInfo); audioDeviceInfo.dwParams RIL_PARAM_ADI_ALL; audioDeviceInfo.dwRxDevic…

[轉]敏捷開發之Scrum掃盲,及敏捷開發中XP與SCRUM的區別

敏捷開發之Scrum掃盲篇 現在敏捷開發是越來越火了&#xff0c;人人都在談敏捷&#xff0c;人人都在學習Scrum和XP… 為了不落后他人&#xff0c;于是我也開始學習Scrum&#xff0c;今天主要是對我最近閱讀的相關資料&#xff0c;根據自己的理解&#xff0c;用自己的話來講述S…

C語言試題175之實現選擇排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:實現選擇…

最流行的 .NET 反編譯工具合集

編譯和反編譯 .NET 中的編譯是把開發人員寫的 C# 代碼轉化為計算機可理解的代碼的過程&#xff0c;也就是中間語言代碼&#xff08;IL代碼&#xff09;。在這個過程中&#xff0c;C# 源代碼被轉換為可執行文件&#xff08;exe或者dll 文件&#xff09;。反編譯則和編譯相反&am…

【ArcGIS Pro微課1000例】0009:ArcGIS Pro地理配準完整教程(建議收藏)

掃描得到的地圖數據通常不包含空間參考信息,航片和衛片的位置精度也往往較低,這就需要通過具有較高位置精度的控制點將這些數據匹配到用戶指定的地理坐標系中,這個過程稱為地理配準。 地理配準即就是通過建立數學函數將柵格數據集(掃描后的圖像)中各點的位置與標準空間參…

Intent跳轉傳list集合

先把List<>改為ArrayList<> ArrayList<Good> listnew ArrayList<Good>(); Intent intent new Intent(MainActivity.this,InfoActivity.class); intent.putExtra("list", list); startActivity(intent); Intent intent get…

Linux中的selinux

#1.selinux內核級加強型防火墻1&#xff09;針對文件&#xff0c;會對系統中每個文件添加安全上下文&#xff08;context&#xff09;2)針對進程&#xff0c;會對系統中的每個進程添加安全上下文&#xff08;context&#xff09;3&#xff09;會在系統服務上設定sebool開關4&am…

C語言試題176之實現歸并排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:實現歸并…