立即注册

micropython-microbit 中文社区

查看: 269|回复: 6

HC-SR04P microbit下使用(micropython代码)

  [复制链接]
  • TA的每日心情
    慵懒
    2019-8-28 19:58
  • 签到天数: 108 天

    [LV.6]常住居民II

    发表于 2019-5-23 23:26:48 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 wx_Rq8h88HV 于 2019-5-23 23:26 编辑

    借鉴论坛里(MicroPython 驱动 HC-SR04 超声波传感器)tick_us()的用法,在microbit下验证可以用,代码如下:
    1. from microbit import *
    2. import time
    3. display.show(Image.ARROW_W)
    4. def distance():
    5.     distance = 0
    6.     pin1.write_digital(1)
    7.     time.sleep_us(10)
    8.     pin1.write_digital(0)
    9.     while pin8.read_digital() == 0:
    10.         pass
    11.     while pin8.read_digital() == 1:
    12.         ts = time.ticks_us()
    13.         while pin8.read_digital() == 1:
    14.             pass
    15.         te = time.ticks_us()
    16.         tc = te - ts
    17.         distance = round((tc*170)/10000, 2)
    18.     return distance
    19. while True:
    20.     dist = distance()
    21.     if button_a.was_pressed():
    22.         display.scroll('%s cm' % dist)
    23.         display.show(Image.ARROW_W)
    24.     sleep(2)
    复制代码




    评分

    参与人数 1金钱 +10 收起 理由
    shaoziyang + 10 很给力!

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    发表于 2019-5-24 09:27:05 | 显示全部楼层
    代码中的这句话,比较危险:
    while pin8.read_digital() == 0:
            pass
    我之前在C51上 用过类似的写法,在某些状况下发出Trigger 之后 没有Echo回应,程序会在这步会进入死循环(Echo 通常状况下是低电平)。
    我当时加了一个超时判定,如果超过一定时间没有反应返回一次Error。

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-10-23 20:05
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2019-5-24 11:08:49 | 显示全部楼层
    超时判断非常有必要,否则在某些情况会进入死循环。

    如果将trig和echo的引脚作为函数参数,也会更加方便,避免每次都需要修改程序了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-10-23 20:05
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2019-5-24 11:11:43 | 显示全部楼层
    另外使用time.ticks_diff()函数计算时间差更好一些,避免在极端情况下,因为时间回绕造成计算错误。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-10-23 20:05
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2019-5-24 21:11:15 | 显示全部楼层
    1楼的程序的改进版本

    1. from microbit import *
    2. from time import sleep_us, ticks_diff, ticks_us

    3. def tdiff(t, dt):
    4.     return ticks_diff(ticks_us(), t) < dt

    5. def distance(tp, ep):
    6.     distance = 0
    7.     tp.write_digital(1)
    8.     sleep_us(10)
    9.     tp.write_digital(0)
    10.     ts = ticks_us()
    11.     while ep.read_digital() == 0 and tdiff(ts, 2000): pass
    12.     ts = ticks_us()
    13.     while ep.read_digital() == 1 and tdiff(ts, 2000): pass
    14.     te = ticks_us()
    15.     tc = ticks_diff(te, ts)
    16.     distance = tc * 172 // 1000
    17.     return distance

    18. while True:
    19.     dist = distance(pin1, pin2)
    20.     print(dist)
    21.     sleep(500)
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-10-23 20:05
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2019-5-24 22:10:33 | 显示全部楼层
    实际测试,在microbit上用pin直接读取电平的方法精度有点低,可能与time函数精度有关。使用SPI方法精度要好一些,不够刚发现了一个更好的方法,程序简单精度最高,明天在测试验证一下,发帖分享。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-8-28 19:58
  • 签到天数: 108 天

    [LV.6]常住居民II

     楼主| 发表于 2019-5-25 11:02:54 | 显示全部楼层
    shaoziyang 发表于 2019-5-24 11:08
    超时判断非常有必要,否则在某些情况会进入死循环。

    如果将trig和echo的引脚作为函数参数,也会更加方便, ...

    学习啦
    我现在属于“现学现卖”阶段
    回复 支持 反对

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    Archiver|手机版|小黑屋|micropython-microbit 中文社区

    GMT+8, 2019-12-16 10:53 , Processed in 0.098262 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表