基于MicroPython的距离测量仪
本帖最后由 Jason97 于 2022-9-9 06:33 编辑Measure with Encoder (MicroPython)现在打开百度地图,输入起点和终点,两地之间的距离马上显示在手机屏幕上。相比以往的地图,现在的电子地图,地理信息量更大。距离计算的更加精确。可这么大的面积,是怎么测量出来的呢?卫星、卷尺还是其他的。卫星能勘探地形、地面资源。但所测距离的精确度不高;卷尺灵活性不够,所测的距离不够长。排除以上两种还有其他测距工具吗?前段时间在马路上看见有人手持一个滚轮沿着马路边滚动,觉得很是新奇,上前询问,原来他是地图工作者,现在正在绘制路线,并测量两地之间的距离。原来他所用的就是用测距轮。这种测距工具,方便携带,灵活性高,测量精准度高。其实听起来高大上的仪器也只用到一个小小的旋转编码。
本文就介绍了如何利用Beetle ESP32-C3设计一款建议的距离测量仪。
首先,旋转编码器是一种特殊类型的开关,它将开关的运动(顺时针或逆时针)转换为输出信号,可用于确定旋钮旋转的方向。与仅能旋转约3/4 圈的电位器相比,旋转编码器能够连续旋转 !旋转编码器最适合使用位置变化而不是精确位置的情况。应用广泛,例如手动音量控制或汽车音响调节等。本文中使用机械电刷式增量旋转编码器。它有三个引脚:A、C 和 B。C 是 A 和 B 的公共地。A 和 B 是信号引脚。当您旋转旋钮时,A 和 B 会与公共接地引脚接触,具体顺序取决于您旋转旋钮的方向。当每个引脚与公共地接触时,它们会产生一个信号。当一个引脚在另一个引脚之前连接时,这些信号彼此异相(正交编码)。我们需要检测这些引脚及其脉冲方式,从而确定方向和步数。顺时针旋转时,首先连接 A 引脚,然后连接 B 引脚。逆时针旋转时,B 引脚先连接,然后 A 引脚连接。通过跟踪每个引脚何时连接和断开接地,我们可以使用信号变化来确定旋钮旋转的方向。它们更改的顺序取决于旋钮的旋转方向。从而我们将旋转编码器跟踪信号变化作为增量输入。(编码器详细介绍可以参见下面这篇文档)旋转编码器原理、选型及编码
硬件
[*]一个旋转编码器。(本文使用带有按钮开关的 24 脉冲机械增量式旋转编码器。它可以安装在面包板上,以便轻松连接到微控制器板。DF商城链接:360度编码器开关)
[*]Beetle ESP32-C3开发板。(或其他具有 MicroPython 功能的板。DF商城链接:Beetle ESP32-C3 (RISC-V芯片))
[*]USB Micro/A数据线。(需要一条已知良好的 USB 数据线,有时候电路板不工作,请尝试使用不同的线,因为有许多仅用于充电的 USB 电缆。DF商城链接:高品质 micro USB数据线)
[*]面包板和线。(需要这些来连接旋转编码器和开发板。DF商城链接:面包板)。
软件环境搭建如果是在C语言中,可以用Arduino编写代码来手动跟踪这些信号变化,并确定旋转方向和增量变化。对于本文,我们可以通过MicroPython较简便地编写程序。
[*]从 micropython.org 下载页面下载最新版本。
microPython固件
[*]固件下载
点击下载烧录工具点击下载esptool Flash烧录工具
运行【flash_download_tool_3.9.3.exe】,选择【ESP32-C3】主控,然后将Beetle ESP32-C3的引脚9连接GND,然后通过USB线连接电脑。选择下载的固件,擦除flash后烧录固件
[*]要访问 REPL/串行控制台,我们使用的是Thonny编辑器,它既是一个出色的 Python 编辑器。
进入软件,对解释器进行设置【Run->Configure interpreter...】点击下载thonny
至此环境搭建完毕。
代码
首先我们导入我们需要的库machine和machine。这些都内置在MicroPython 中,不需要任何外部库文件。接下来,我们创建要在我们的代码中驱动编码器。首先要定义已引脚并将其初始化。我使用的是引脚0、引脚1和 引脚4。right = Pin(4, Pin.IN)
left =Pin(1, Pin.IN)
down =Pin(0, Pin.IN)
然后设置旋转标志位right_assist来识别旋转编码器何时移动,以及计旋转数变量count。以及设置识别引脚电平状态下降沿的中断函数,其中4号引脚的下降沿作为旋转方向的判断标准,将旋转标志位right_assist置1,0号引脚的下降沿用来将计数count清零:def right_handler(pin):
global right_assist
right.irq(handler=None)
right_assist = 1
def down_handler(pin):
down.irq(handler=None)
count = 0
print("down",count)
down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
right.irq(trigger = Pin.IRQ_FALLING, handler=right_handler)
down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
最后进入循环中,不停判断旋转标志位right_assist的值,并将计数count的值输出到终端里。from machine import Pin,ADC
import utime
#Define pins and their initialization
right = Pin(4, Pin.IN)
left =Pin(1, Pin.IN)
down =Pin(0, Pin.IN)
right_assist = 0
count = 0 #Rotate the value of the encoder
def right_handler(pin):
global right_assist
right.irq(handler=None)
right_assist = 1
def down_handler(pin):
global count
down.irq(handler=None)
count = 0
print("down",count)
down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
right.irq(trigger = Pin.IRQ_FALLING, handler=right_handler)
down.irq(trigger = Pin.IRQ_FALLING, handler=down_handler)
while True :
if (right_assist == 1 ):
if (left.value() == 1 ):
count = count - 1
print("left",count)
elif (left.value() == 0 ):
count = count + 1
print("right",count)
while (left.value() == 0 ) | (right.value() == 0):
utime.sleep_ms(1)
right_assist = 0
right.irq(trigger= Pin.IRQ_FALLING, handler=right_handler)
实物演示
参考
[*]DFROBOT:Beetle ESP32 C3简介
[*]Arduino IDE 离线添加开发板
[*]Arduino core for the ESP32 安装失败问题处理方法
[*]CircuitPython on ESP32 Quick Start
[*]DF论坛:用小小的滚轮,丈量你周围的“天下”
[*]Adafruit:Rotary Encoder in CircuitPythonOverview
[*][活动]【免费试用】Beetle ESP32-C3试用
[*]FIREBEETLE BOARD-ESP32用户使用手册V0.1
[*]MicroPython 玩转硬件:串口小实验
[*]基于ESP32-S2模块的物联网/音频信号处理平台
[*]启明云端分享:esp32c3阿里云连接测试步骤
页:
[1]