14713浏览
查看: 14713|回复: 0

[动态] 基于MicroPython的距离测量仪

[复制链接]
本帖最后由 Jason97 于 2022-9-9 06:33 编辑

Measure with Encoder (MicroPython)
现在打开百度地图,输入起点和终点,两地之间的距离马上显示在手机屏幕上。相比以往的地图,现在的电子地图,地理信息量更大。距离计算的更加精确。可这么大的面积,是怎么测量出来的呢?卫星、卷尺还是其他的。卫星能勘探地形、地面资源。但所测距离的精确度不高;卷尺灵活性不够,所测的距离不够长。排除以上两种还有其他测距工具吗?前段时间在马路上看见有人手持一个滚轮沿着马路边滚动,觉得很是新奇,上前询问,原来他是地图工作者,现在正在绘制路线,并测量两地之间的距离。原来他所用的就是用测距轮。这种测距工具,方便携带,灵活性高,测量精准度高。其实听起来高大上的仪器也只用到一个小小的旋转编码。

本文就介绍了如何利用Beetle ESP32-C3设计一款建议的距离测量仪。

首先,旋转编码器是一种特殊类型的开关,它将开关的运动(顺时针或逆时针)转换为输出信号,可用于确定旋钮旋转的方向。与仅能旋转约3/4 圈的电位器相比,旋转编码器能够连续旋转 !
旋转编码器最适合使用位置变化而不是精确位置的情况。应用广泛,例如手动音量控制或汽车音响调节等。
本文中使用机械电刷式增量旋转编码器。它有三个引脚:AC BC AB 的公共地。AB 是信号引脚。当您旋转旋钮时,A 和 B 会与公共接地引脚接触,具体顺序取决于您旋转旋钮的方向。当每个引脚与公共地接触时,它们会产生一个信号。当一个引脚在另一个引脚之前连接时,这些信号彼此异相(正交编码)。我们需要检测这些引脚及其脉冲方式,从而确定方向和步数。
基于MicroPython的距离测量仪图1
顺时针旋转时,首先连接 A 引脚,然后连接 B 引脚。逆时针旋转时,B 引脚先连接,然后 A 引脚连接。通过跟踪每个引脚何时连接和断开接地,我们可以使用信号变化来确定旋钮旋转的方向。它们更改的顺序取决于旋钮的旋转方向。从而我们将旋转编码器跟踪信号变化作为增量输入。(编码器详细介绍可以参见下面这篇文档)


硬件
基于MicroPython的距离测量仪图2
软件环境搭建
如果是在C语言中,可以用Arduino编写代码来手动跟踪这些信号变化,并确定旋转方向和增量变化。对于本文,我们可以通过MicroPython较简便地编写程序[1]。
  • 从 micropython.org 下载页面下载最新版本。

  • 固件下载

点击下载烧录工具


运行【flash_download_tool_3.9.3.exe】,选择【ESP32-C3】主控,然后将Beetle ESP32-C3的引脚9连接GND,然后通过USB线连接电脑。

基于MicroPython的距离测量仪图3

选择下载的固件,擦除flash后烧录固件

基于MicroPython的距离测量仪图4

  • 要访问 REPL/串行控制台,我们使用的是Thonny编辑器,它既是一个出色的 Python 编辑器。

进入软件,对解释器进行设置【Run->Configure interpreter...】

点击下载thonny
基于MicroPython的距离测量仪图5
至此环境搭建完毕。

代码

首先我们导入我们需要的库machine和machine。这些都内置在MicroPython 中,不需要任何外部库文件。

接下来,我们创建要在我们的代码中驱动编码器。首先要定义已引脚并将其初始化。我使用的是引脚0、引脚1和 引脚4。

  1. right = Pin(4, Pin.IN)
  2. left =  Pin(1, Pin.IN)
  3. down =  Pin(0, Pin.IN)
复制代码

然后设置旋转标志位right_assist来识别旋转编码器何时移动,以及计旋转数变量count。

以及设置识别引脚电平状态下降沿的中断函数,其中4号引脚的下降沿作为旋转方向的判断标准,将旋转标志位right_assist置1,0号引脚的下降沿用来将计数count清零:

  1. def right_handler(pin):
  2.     global right_assist
  3.     right.irq(handler=None)
  4.     right_assist = 1
  5. def down_handler(pin):
  6.     down.irq(handler=None)
  7.     count = 0
  8.     print("down",count)
  9.     down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
  10. right.irq(trigger = Pin.IRQ_FALLING, handler=right_handler)
  11. down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
复制代码

最后进入循环中,不停判断旋转标志位right_assist的值,并将计数count的值输出到终端里。

  1. from machine import Pin,ADC
  2. import utime
  3. #Define pins and their initialization
  4. right = Pin(4, Pin.IN)
  5. left =  Pin(1, Pin.IN)
  6. down =  Pin(0, Pin.IN)
  7. right_assist = 0
  8. count = 0             #Rotate the value of the encoder
  9. def right_handler(pin):
  10.     global right_assist
  11.     right.irq(handler=None)
  12.     right_assist = 1
  13. def down_handler(pin):
  14.     global count
  15.     down.irq(handler=None)
  16.     count = 0
  17.     print("down",count)
  18.     down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
  19. right.irq(trigger = Pin.IRQ_FALLING, handler=right_handler)
  20. down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
  21. while True :
  22.     if (right_assist == 1 ):
  23.         
  24.         if (left.value() == 1 ):
  25.             count = count - 1
  26.             print("left",  count)
  27.         elif (left.value() == 0 ):
  28.             count = count + 1
  29.             print("right",  count)
  30.             
  31.         while (left.value() == 0 ) | (right.value() == 0):
  32.             utime.sleep_ms(1)
  33.             
  34.         right_assist = 0
  35.         right.irq(trigger= Pin.IRQ_FALLING, handler=right_handler)
复制代码

实物演示
基于MicroPython的距离测量仪图7
基于MicroPython的距离测量仪图6


参考




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

本版积分规则

上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail