• (6)ESP32+Python 做一个超声波探测器


    我们经常在智能小车上都能看到一个长这么样得一个东西。
    image

    这个东西就是一个超声波测距模块,一共有4个引脚VCC,Trig,Echo,Gnd。
    VCC:接VCC电源,一般都是5V,但是现在市面上也有支持3.3V的
    Trig: 给这个引脚输入一个10us的高电平,就可以触发测距。
    Echo: 在测距结束时,这个引脚会输出一个高电平。电平的宽度经过计算的后,就是测距的距离
    GND:接地
    这里有一个计算公式:
    测距距离 = (高电平的时间 * 音速【340M/S】/2)
    简单的来讲实现原理是当我们需要测试距离时,

    1. 把Trig输入10us的高电平,然后拉低。测距开始。
    2. 当Echo收到发出的信号后,会把引脚的电平拉高。
    3. 计算第一步和第二步的时间差。
    4. 套入公式,计算距离(音速的时间是340米每秒,第一步和第二步的时间是US,所以计算时要用10000计算回来)
      注意,超声波是一种波,并不是百分之百的和下面的图一样,发送的是直线。
      image

    在了解好原理后,把传感器和硬件进行连接,然后开始写代码吧。
    第一个实现,我们还是采用原生的写法。

    
    from machine import Pin
    import utime
    
    class ORGHCSR04:
    
        trig = None
        echo = None
    
        def __init__(self): 
            global trig, echo
            trig = Pin(25, Pin.OUT)
            echo = Pin(26, Pin.IN)
            trig.off()
            echo.off()
    
        def start_scan(self): 
            while True:
                self.start_hc() 
                utime.sleep_ms(800) # 这里根据需要设定SLEEP时间
                print('>_<')
    
        def start_hc(self):
            global trig, echo
            trig.on()
            utime.sleep_us(10)
            trig.off()
    
            while echo.value() == 0 : 
                pass
    
            start_us = utime.ticks_us()
            
            while echo.value() == 1 : 
                pass
    
            end_us = utime.ticks_us()
            
            rang_us = utime.ticks_diff(end_us,start_us)/10000
    
            dist = rang_us*340/2
            print("dist is: %0.2f CM" % dist)
    

    完成后烧录到开发板进行测试
    image

    如果要用HAAS进行,首先需要在board.json当中进行定义

    {
        "name": "haasedu",
        "version": "1.0.0",
        "io": {
            "hc_triger":{ 
              "type": "GPIO",
              "port": 25,
              "dir": "output",
              "pull": "pulldown"
            },
            "hc_echo":{ 
              "type": "GPIO",
              "port": 26,
              "dir": "input",
              "pull": "pulldown"
            } 
        },
        "debugLevel": "ERROR",
        "repl": "disable"
      }
    

    Haas 实现代码如下

    import utime
    from driver import GPIO
    class HAASHCSR04:
        triger_gpio = None
        echo_gpio = None
        def __init__(self): 
            global triger_gpio, echo_gpio  
            triger_gpio = GPIO()
            triger_gpio.open('hc_triger')
            triger_gpio.write(0)
            echo_gpio = GPIO()
            echo_gpio.open('hc_echo')
            echo_gpio.write(0)
            
        def start_scan(self):  
            while True:
                self.start_hc() 
                utime.sleep_ms(800) # 这里根据需要设定SLEEP时间
              
        def start_hc(self):
            global triger_gpio, echo_gpio  
            triger_gpio.write(1)
            utime.sleep_us(10)
            triger_gpio.write(0)
            while(echo_gpio.read()==0):  
                pass
            start_us = utime.ticks_us()  
            
            while(echo_gpio.read()==1):  
                pass
            end_us = utime.ticks_us()
            
            rang_us = utime.ticks_diff(end_us,start_us)/10000
            dist = rang_us*340/2
            print("dist is: %0.2f CM" % dist)
    

    但是,上面代码的输出都是通过print输出的,不太灵性。之前我们有做过连接OLED,这里我们可以把OLED也用起来。
    效果如下,我们还可以把之前的红绿灯也插上去。红灯停,绿灯行。哈哈。

    image

  • 相关阅读:
    初始值设定元素不是常量(全局变量初始化问题)
    vim配置成c++IDE
    Linux 命令总结
    gdb用法
    Elasticsearch mysql 增量同步
    Spring MVC4 纯注解配置教程
    Xposed Module开发教程1
    Glide 下载Gif文件
    Android开发艺术探索读书笔记——01 Activity的生命周期
    仿微信朋友圈图片查看-glide加载网络图片,photoview 实现缩放
  • 原文地址:https://www.cnblogs.com/voidxy/p/15828681.html
Copyright © 2020-2023  润新知