使用.NET IoT驱动超声波测距传感器

简介: 最近买的一堆传感器到货了,先来把玩一下超声波测距传感器。超声波传感器一般用于机器人,小车的避障,物体的测距,液位检测,停车检测等领域。

HC-SR04

知识回顾

开始之前我们先复习一下高中的物理知识。

原理

通过上图的原理图,又已知声波速度,这里取 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显示屏》

接线图

上图因为没找到 TX2 的图片所以用的 Nano。树莓派,Nano 和 TX2 的物理引脚功能一样,只是 PCM 编码和 GPIO 的编号是不一样的,代码有的情况下需要调整,后续会讲到。

接好线,我们先快速用 Python 验证下原理。

import RPi.GPIO as GPIO
import time

TRIG_PIN = 38
ECHO_PIN = 40

def 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:
        pass
    pulse_s = time.time()

    #等待高电平结束,再次记录时间
    while GPIO.input(ECHO_PIN) == GPIO.HIGH:
        pass
    pulse_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. 新建项目
dotnet new console -o ultrasonic
  1. 进入项目目录
cd ultrasonic
  1. 安装依赖库
dotnet add package Iot.Device.Bindings
  1. 修改代码
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 40

using 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);
}
  1. 运行测试
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 40

using 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);
}

最终效果如下:

最终效果图

相关文章
|
传感器 物联网 数据管理
.NETCore/C#开发IOT嵌入式设备的个人见解
.NETCore/C#开发IOT嵌入式设备的个人见解
1139 0
.NETCore/C#开发IOT嵌入式设备的个人见解
|
3月前
|
架构师 开发者
【悬念揭秘】DDD:那片隐藏在软件深处的业务乐土——.NET项目如何借力领域驱动设计,让复杂业务逻辑迎刃而解?
【8月更文挑战第28天】领域驱动设计(DDD)在.NET项目中的应用聚焦于将业务领域知识与软件开发紧密结合,通过构建清晰的领域模型管理复杂业务逻辑。DDD的核心概念包括限界上下文、聚合、实体等,确保模型与实现的统一。在.NET中,通过CQRS和事件源等模式提高系统响应性和可扩展性,实现业务事件驱动的解耦与协作。DDD不仅是一种设计方法,更是要求开发者深入理解业务的文化,助力.NET项目应对复杂挑战,实现业务与技术的融合。
58 6
|
3月前
|
传感器 开发框架 物联网
揭开.NET在IoT领域的神秘面纱:如何构建智能设备,让未来生活触手可及?
【8月更文挑战第28天】随着物联网技术的发展,智能设备正深入我们的生活。.NET作为跨平台开源框架,在IoT领域应用广泛。本文介绍如何利用.NET构建智能设备,通过实例展示从环境搭建到项目创建、代码编写及运行的全过程,帮助开发者快速实现IoT解决方案,开启智能设备开发的新篇章。
43 0
|
6月前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
86 0
|
6月前
|
安全 Linux 开发者
【专栏】.NET 技术:驱动开发变革的力量
【4月更文挑战第29天】本文介绍了.NET技术的起源、核心特性和应用场景。始于2002年的.NET,旨在解决开发效率和兼容性问题,历经.NET Core和.NET 5的进化,实现了跨平台支持。其核心特性包括跨平台、面向对象、安全可靠及高效性能。广泛应用在企业级应用、互联网应用、游戏开发及科学计算等领域,持续推动软件开发创新与变革。
38 0
|
存储 传感器 NoSQL
手把手教你把IoT传感器数据存储到数据库
无需开发,手把手教你把IoT传感器采集的实时数据存储到数据库。
1578 2
|
缓存 NoSQL 大数据
4款.NET开源的Redis客户端驱动库
4款.NET开源的Redis客户端驱动库
131 0
|
存储 NoSQL 安全
【MongoDB行业案例】Bosch IoT 和应用程序驱动型分析的重要性
将运营和分析工作负载整合到一处的数据平台
|
边缘计算 人工智能 Ubuntu
使用.Net驱动Jetson Nano的OLED显示屏
最近几年,边缘计算的需求急剧爆发。人工智能、物联网和 5G 的演进给边缘计算带来了无限的可能性。
252 0
使用.Net驱动Jetson Nano的OLED显示屏
|
JSON 监控 JavaScript
.NET Core 跨平台物联网开发:连接阿里云IOT(一)
.NET Core 跨平台物联网开发:连接阿里云IOT(一)
609 0
.NET Core 跨平台物联网开发:连接阿里云IOT(一)