MicroPython 开发ESP32应用教程 之 开发板硬件介绍及ESP32 的GPIO操作讲解

前面我们讲解了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)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的元子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值