HCSR04超声波传感器的python驱动

micro:bit编程、教学、展示
STEM
回复
头像
shaoziyang
帖子: 742
注册时间: 2019年 10月 21日 13:48

HCSR04超声波传感器的python驱动

#1

帖子 shaoziyang » 2019年 11月 24日 19:41

HCSR04超声波传感器在智能小车、扫地机器人、DIY上有广泛应用。在makecode中已经有它的扩展,可以直接使用,但是python的驱动比较少。以前推荐过一个microbit的HCSR04超声波传感器的python驱动,但是用在麦昆时发现程序不能运行,会在测量时卡死。

经过仔细分析发现,问题出在spi的设置上,通过修改后,hcsr04就可以正常运行了。顺便又对代码进行了优化,让代码可以更加有效的运行:
  • 调整了缓冲区大小,留出更多空间给其他功能;
  • 优化了spi初始化功能,不需要每次测量都重新初始化
  • 优化了缓冲区,不需要每次测量都重新设置缓冲区
  • 优化了SCK引脚定义,避免了设置一个多余的SCK引脚(这一点对麦昆尤其重要)
 

代码: 全选

from microbit import spi, pin1, pin2

length=200

class HCSR04:
  def __init__(self, tpin=pin1, epin=pin2):
    spi.init(baudrate=125000, sclk=tpin, mosi=tpin, miso=epin)
    self.r = bytearray(length)

  def distance(self):
    pre = 0
    post = 0
    k = -1
    self.r[0] = 255
    spi.write_readinto(self.r, self.r)
    # find first non zero value
    try:
      i, value = next((ind, v) for ind, v in enumerate(self.r) if v)
    except StopIteration:
      i = -1
    if i > 0:
      pre = bin(value).count("1")
      try:
        k, value = next((ind, v)
        for ind, v in enumerate(self.r[i:length - 2]) if self.r[i + ind + 1] == 0)
        post = bin(value).count("1") if k else 0
        k = k + i
      except StopIteration:
        i = -1
    dist= -1 if i < 0 else round(((pre + (k - i) * 8. + post) * 8 * 0.172) / 2)
    return dist
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章