前面我们讲解了MicroPython 开发ESP32应用的环境搭建,这里我们顺便提一下,我们还可以用esptool.py来烧录MicroPython for ESP32的固件到开发板,只是这种方式相对比较麻烦(但还是比ESP32 IDF的开发环境搭建简单得多),所以我们采用烧录工具flash_download_tool_3.9.7.exe 来烧录相应的固件。至于esptool.py烧录工具的安装方式,一来大家很容易在网上找到操作步骤,二来有更简单的方式,没必要采用这种相对复杂的方式,所以我们这里不作详细说明。
接下来的整个教程我们都是使用基于ESP32-C3-WROOM-02的核心模组的开发板ESP32-C3-DevKitC-02 。该开发板是乐鑫官方开源的,方便大家上手的同时,也方便大家项目开发完成后生产。
主要组件 | 介绍 |
---|---|
ESP32-C3-WROOM-02 | ESP32-C3-WROOM-02 是乐鑫推出的一款通用型 Wi-Fi 和低功耗蓝牙双模模组,功能强大。该模组采用 PCB 板载天线,配置了 4 MB SPI flash。 |
5 V to 3.3 V LDO(5 V 转 3.3 V LDO) | 电源转换器,输入 5 V,输出 3.3 V。 |
5 V Power On LED(5 V 电源指示灯) | 开发板连接 USB 电源后,该指示灯亮起。 |
Pin Headers(排针) | 所有可用 GPIO 管脚(除 Flash 的 SPI 总线)均已引出至开发板的排针。请查看 排针 获取更多信息。 |
Boot Button(Boot 键) | 下载按键。按住 Boot 键的同时按一下 Reset 键进入“固件下载”模式,通过串口下载固件。 |
Micro-USB Port(Micro-USB 接口) | USB 接口。可用作开发板的供电电源或 PC 和 ESP32-C3 芯片的通信接口。 |
Reset Button(Reset 键) | 复位按键。 |
USB-to-UART Bridge(USB 至 UART 桥接器) | 单芯片 USB 至 UART 桥接器,可提供高达 3 Mbps 的传输速率。 |
RGB LED | 可寻址 RGB 发光二极管,由 GPIO8 驱动。 |
ESP32-C3-DevKitC-02 的主要组件和连接方式如下图所示。
电源选项
以下任一供电方式均可为 ESP32-C3-DevKitC-02 供电:
-
Micro-USB 接口供电(默认)
-
5V 和 GND 排针供电
-
3V3 和 GND 排针供电
原理图及更多更详细的资料我们可以从下面的文档中找到:
sch_esp32-c3-devkitc-02_v1_1_20 (espressif.cn)
esp32-c3-wroom-02_datasheet_en.pdf (espressif.com.cn)
第一个是开发板的原理图,第二个是核心模组的规格书,从这两个文件中,我们可以知道很多我们开发过程中要用到的知识,比如核心模组带4MB FLASH及其它相关的核心参数,我们后面会陆续介绍。大家可以先下载相关文档备用。
接下来,我们讲解一个用MicroPython 语言配置及读写ESP32 的GPIO口的实例,但在此之前,我们需要介绍一些相关的硬件及软件方面的知识。
硬件:
从原理图中我们可以得到我们今天的实例中需要的硬件知识:
WS2812 RGB灯珠 的输入连接的是GPIO8
BOOT 按键连接的是GPIO9
MicroPython for ESP32的相关库介绍
1、延时
延时使用的是time模块,语法如下:
import time
time.sleep(1) # sleep for 1 second
time.sleep_ms(500) # sleep for 500 milliseconds
time.sleep_us(10) # sleep for 10 microseconds
2、GPIO
GPIO的配置及读写等控制是通过machine.Pin这个类来实现的,machine包含了几乎所有的与ESP32芯片有关的硬件控制,比如GPIO、Timer、SPI等。语法如下:
from machine import Pin
p8 = Pin(8, Pin.OUT) # 配置GPIO8为输出端口
p8.on() # GPIO8置高电平
p8.off() # GPIO8置低电平
p8.value(1) # GPIO8置高电平
p9 = Pin(9, Pin.IN) # 配置GPIO9为输入端口
print(p9.value()) # 读取GPIO9的状态,并打印出来
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # 配置GPIO4为输入端口,并使能内部上拉电阻
p5 = Pin(5, Pin.OUT, value=1) # 配置GPIO5为输出端口,并置高电平
p6 = Pin(6, Pin.OUT, drive=Pin.DRIVE_3) # 配置GPIO6为输出端口,最大输出电流40mA
ESP32根据型号的不同,GPIO口的数量是相差比较大的,大家可以根据自己选择的开发板或芯片配置相应的GPIO。
ESP32配置为输出时,驱动电流有4级:
-
Pin.DRIVE_0
: 5mA / 130 ohm -
Pin.DRIVE_1
: 10mA / 60 ohm -
Pin.DRIVE_2
: 20mA / 30 ohm (default strength if not configured) -
Pin.DRIVE_3
: 40mA / 15 ohm
3、NeoPixel
NeoPixel是用于控制 WS2812/WS2812B/SK6812 等可寻址 LED 灯带的常用库,更多介绍请参考:MicroPython 开发基于ESP32S3控制ws2812灯带的程序-CSDN博客
至此,我们软件、硬件需要了解的知识都明白了,直接上代码:
from machine import Pin
import time
from neopixel import NeoPixel
# 定义全局变量
WS2812_NUM = 1
WS2812_LED_LEVEL = 0x10
G = 0xff
R = 0
B = 0
pin = Pin(8, Pin.OUT) #配置GPIO8为输出端口,控制ws2812灯珠的DIN信号
np = NeoPixel(pin, WS2812_NUM,3,1)
def ws2812_LED_On(phase):
global G,R,B
for i in range(WS2812_NUM - 1):
np[WS2812_NUM -1 - i] = np[WS2812_NUM - 2 - i]
if phase < WS2812_LED_LEVEL:
G = int(G - (0xff / WS2812_LED_LEVEL))
R = int(R + (0xff / WS2812_LED_LEVEL))
phase += 1
if phase == WS2812_LED_LEVEL:
G = 0
R = 0xff
elif phase < (WS2812_LED_LEVEL * 2):
R = int(R - (0xff / WS2812_LED_LEVEL))
B = int(B + (0xff / WS2812_LED_LEVEL))
phase += 1
if phase == (WS2812_LED_LEVEL * 2):
R = 0
B = 0xff
elif phase < (WS2812_LED_LEVEL * 3):
B = int(B - (0xff / WS2812_LED_LEVEL))
G = int(G + (0xff / WS2812_LED_LEVEL))
phase += 1
if phase == (WS2812_LED_LEVEL * 3):
phase = 0
B = 0
G = 0xff
np[0] = (G,R,B)
return phase
if __name__ == "__main__":
# pin = Pin(36, Pin.OUT)
p9 = Pin(9, Pin.IN) #配置GPIO9为输入端口
WS2812_POWERON = 1
WS2812_POWEROFF = 0
ws2812_status = WS2812_POWEROFF
offset = 0
while True:
if (p9.value() == 0): #是否有按键?有,切换RGB灯的状态
ws2812_status ^= 1
while True:
if (p9.value() == 1): #等待按键释放
break
if ws2812_status == WS2812_POWEROFF:
np.fill((0,0,0))
np.write() #关闭RGB灯
else :
offset = ws2812_LED_On(offset)
np.write() #点亮RGB灯
time.sleep_ms(100)