Raspberry Pi Pico W上手(基于Arduino IDE及Thonny)
Beetle ESP32-C3开发应用
系统:Windows 11
Arduino:1.8.19
Arduino开发环境配置
1、添加IDE中的json链接
- 配置URL网址到Arduino IDE
- 打开Arduino IDE,点击File->Preferences,如下图所示:
在线配置1
- 在新打开的界面中,点击如下图红色圆圈中的按钮
- 将如下链接地址复制到新弹出的对话框中:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- 注意:如果您之前安装过其它的环境,那么您可以在上一个链接地址开头或末尾处直接回车并将上面链接粘贴在其上下任意一行
- 点击【OK】→更新板卡
2、下载主控的核心
- 打开Tools->Board:->Boards Manager…,如下图所示:
- Boards Manager会自动更新板卡,如下图所示:
- 更新完成后,您可以在上方输入esp32,出现如下情况时选择esp32点击安装即可(当前安装为2.0.0版本):
- 等待如下进度条结束:
- 安装完成后,列表会显示已经安装esp32主板,如下图所示:
3、选择开发板以及串口
- 点击Tools->Board:,选择ESP32C3 Dev Module(通常在列表第一个)
- 在开始前您还需要配置如下设置(当您选择 Disabled 时,串口为RX(20)、TX(21),如果您需要通过USB在Arduino监视器上打印,您需要选择Enable)
- 点击Port选择对应的串口(如果串口不停的出现,然后消失,请将引脚9连接GND,重新上电;后续程序下载成功后,需要将引脚9和GND断开,否则程序不运行)
4、 拼人品的时候到了,你可能会发现下载十分慢,且很大概率下载到一半就失败。而且甚至连开发板的json文件都获取失败,在开发板管理器中,无法搜索到esp32。那么这时候我们就需要离线下载
离线配置
1、 先下载好esp32开发板json文件。步骤和【在线配置】相同,注意将json链接换成2:https://www.arduino.cn/package_esp32_index.json
2、 然后下载各个ESP32开发板包,开发板工具包。下载完成后将json文件移动至【C:\Users\你的用户名\AppData\Local\Arduino15】;
将esp32开发板包和开发板工具包移动至【C:\Users\你的用户名\AppData\Local\Arduino15\staging\packages】,没有这一个文件夹请自行新建。
- package_esp32_index.json;esp32-版本号.zip;esptool-版本号-操作系统.文件格式三个文件在 Arduino core for the ESP32 项目地址可下载到;项目地址:https://github.com/espressif/arduino-esp32
- mkspiffs-版本号-arduino-esp32-操作系统.文件格式;xtensa-esp32-elf-操作系统-版本号.文件格式可以从package_esp32_index.json 文件中获得,注意对应的操作系统和版本号,下载最新的3;
3、 最后开始安装开发板数据包【Arduino IDE→开发板→开发板管理器→ESP32→安装】
Blink with Wi-Fi
ESP32 是一款出色且非常流行的处理器,用于许多应用上都在使用。 对于支持Wi-Fi的板,如 ESP32,Web 工作流程允许使用 Web 浏览器通过本地网络连接到运行 CircuitPython 的开发板。现在很容易使用 REPL 或使用浏览器上传/下载文件! 本文介绍了如何在Beetle ESP32-C3上启动和运行 CircuitPython Web 工作流程。
安装CircuitPython
1、 下载固件
从CircuitPython网站上查找对应的固件链接.
2、 固件安装
一般CircuitPython固件安装可以直接将.UF2文件拖到文件夹里,可以直接加载程序.bin文件(比如Raspberry Pico)。不过有些开发板没有拖放到文件夹选项。这时候Web Serial ESPTool就是个不错的工具。
3、 启动Web Serial
必须使用基于Chrome或Chromium的浏览器才能正常工作。例如,Edge 和 Opera 是 Chromium。不支持 Safari 和 Firefox 等——它们还没有实现 Web Serial功能。
启用Serial API非常简单。 在 Chrome 中访问chrome://flags。查找并启用实验性网络平台功能,重启 Chrome。
4、 在使用该工具之前,您需要将开发板置于引导加载程序模式并进行连接。
- 在 Chrome 浏览器中访问 https://nabucasa.github.io/esp-web-flasher/(https://espressif.github.io/esptool-js/)。应该会看到类似于所示图像的内容。
- 对于Beetle ESP32-C3开发板来说,将Beetle ESP32-C3的引脚9连接GND,然后通过USB线连接电脑。
- 按网络浏览器右上角的连接按钮。您将得到一个弹出窗口,要求您选择 COM 或串行端口。查找名称中带有 ESP32、JTAG Loader、SLAB 或 FTDI 的内容。
请记住,您应该移除所有其他 USB 设备,以便仅连接目标板,这样就不会混淆多个端口!
在某些系统(例如 MacOS)上,列表中可能会显示其他系统端口。
- Javascript 代码现在将尝试连接到 ROM 引导加载程序。它可能会超时一段时间,直到它成功。成功后,您将看到它已连接,并将打印出一个唯一的 MAC 地址,用于标识该板以及检测到的其他信息。
- 成功连接后,将出现命令工具栏。
5、擦除功能
- 如果您想擦除整个闪存区域以便可以从头开始,您可以使用擦除功能。如果您遇到问题,我们建议您这样做。
- 要擦除内容,请单击擦除按钮。系统将提示您是否要继续。单击“确定”继续,或者如果您改变主意,只需单击“取消”。
- 您将看到“正在擦除闪存。请稍候…”这最终将显示“已完成”。以及擦除所需的时间。
- 不要断开连接!立即继续对 ESP 微控制器进行编程。
6、 固件下载
- 单击【Choose a file…】。它只会尝试使用文件和唯一位置对按钮进行编程。然后选择 .bin 文件 - 而不是 UF2 文件!
- 确定您使用的文件位置旁边的Offset框是否为0x0。
- 选择文件后,然后选择【Program】按钮下载固件。
- 将出现一个进度条,一两分钟后,您将成功写入固件。
Wi-Fi点灯
1、 使用Thonny创建.env文件
首先需要安装Thonny软件,一款Python的轻量IDE。
2、在Thonny中,打开【工具】 ->【** 选项】对话框并选择【解释器】选项卡,根据需要将解释器设置为 **CircuitPython(通用)和** COM 端口**。
3、 新建文件并输入
1
2
3
CIRCUITPY_WIFI_SSID= 'wifissid'
CIRCUITPY_WIFI_PASSWORD= 'wifipassword'
CIRCUITPY_WEB_API_PASSWORD= 'webpassword'
- wifissid - 替换为本地 wifi 网络名称
- wifipassword - 替换为本地 wifi 网络密码
- webpassword - 通过网络浏览器连接到开发板时使用的密码,根据自己的喜好随便设置
点击保存到【CircuitPython Device】,保存文件名为【.env】。现在 .env文件显示在 CircuitPython上。
4、在网页端编辑代码
- 打开网址:http://circuitpython.local,会出现欢迎页面
输入在 .env 文件中设置的CIRCUITPY_WEB_API_PASSWORD密码,将用户名留空。
- 在【Welcome!】页面,单击serial terminal链接以访问串行输出以及用于输入命令的 REPL。可以在底部的输入字段中输入命令。 结果将显示在上方并向上滚动。
- 在【Welcome!】页面,单击file browser链接以访问文件和文件夹。
- 在将code.py的内容替换以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
import time
import board
from digitalio import DigitalInOut, Direction
led = DigitalInOut(board.D10)
led.direction = Direction.OUTPUT
while True:
led.value = True
time.sleep(1)
led.value = False
time.sleep(1)
确保没有缩进错误等。然后单击“Save”按钮。此时代码应该正在运行并且Beetle板开始闪烁啦。 在实际运行之前点击“保存”按钮后可能会有一小段延迟。(注意哦是修改code.py程序)
Measure with Encoder (MicroPython)
旋转编码器是一种特殊类型的开关,它将开关的运动(顺时针或逆时针)转换为输出信号,可用于确定旋钮旋转的方向。与仅能旋转约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较简便地编写程序[1]。
- 从 micropython.org 下载页面下载最新版本。
- 固件下载
点击下载烧录工具
运行【flash_download_tool_3.9.3.exe】,选择【ESP32-C3】主控,然后将Beetle ESP32-C3的引脚9连接GND,然后通过USB线连接电脑。
选择下载的固件,擦除flash后烧录固件
- 要访问 REPL/串行控制台,我们使用的是Thonny编辑器,它既是一个出色的 Python 编辑器。
进入软件,对解释器进行设置【Run->Configure interpreter…】
至此环境搭建完毕。
代码
首先我们导入我们需要的库machine和machine。这些都内置在MicroPython 中,不需要任何外部库文件。
接下来,我们创建要在我们的代码中驱动编码器。首先要定义已引脚并将其初始化。我使用的是引脚0、引脚1和 引脚4。
1
2
3
right = Pin(4, Pin.IN)
left = Pin(1, Pin.IN)
down = Pin(0, Pin.IN)
然后设置旋转标志位right_assist来识别旋转编码器何时移动,以及计旋转数变量count。
以及设置识别引脚电平状态下降沿的中断函数,其中4号引脚的下降沿作为旋转方向的判断标准,将旋转标志位right_assist置1,0号引脚的下降沿用来将计数count清零:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的值输出到终端里。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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)