资讯详情

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

背景

最近买了一堆传感器,先玩超声波测距传感器。超声波传感器一般用于机器人、汽车避障、物体测距、液位检测、停车检测等领域。

在这里插入图片描述

知识回顾

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

通过上图的原理图,已知声波速度,在这里取 340 m/s (1个标准大气压和15个空气中的音速℃340左右m/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);
}

最终效果如下:

标签: cd61传感器up6传感器10015cd传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台