【雕爷学编程】MicroPython手册之 ESP32-S3 引脚和GPIO口

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述

总体来说,ESP32-S3在功耗、硬件资源和功能支持方面进行了优化,非常适合作为低功耗物联网设备的处理平台。相比ESP32,ESP32-S3在无线、安全性和稳定性等方面有所提升。

1、搭载 Xtensa® 32 位 LX7 双核处理器,主频 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。
2、支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
3、加入了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions),性能对比 ESP32 有可观的提升。
4、集成 2.4 GHz Wi-Fi (802.11 b/g/n),支持 40 MHz 带宽;其低功耗蓝牙子系统支持 Bluetooth 5 (LE) 和 Bluetooth Mesh,可通过 Coded PHY 与广播扩展实现远距离通信。它还支持 2 Mbps PHY,用于提高传输速度和数据吞吐量。
5、外设新增 LCD 接口、USB、SD/MMC 主机控制器和 TWAI TM 控制器等常用外设接口。
6、拥有完善的安全机制和保护措施,支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。

在这里插入图片描述

当涉及到MicroPython的ESP32-S3引脚和GPIO口时,以下是一些详细的解释:

ESP32-S3引脚特点:
引脚多样性:ESP32-S3芯片具有丰富的引脚资源,包括数字GPIO口、模拟输入输出、SPI、I2C、UART、PWM和定时器等功能。
多功能引脚:许多引脚具有多种功能选项,可以根据需求进行配置。例如,一个引脚可以用作数字输入、数字输出、模拟输入、PWM输出等。
内部上下拉电阻:每个引脚都具有可选的内部上拉或下拉电阻。这使得连接外部传感器或其他外设时更加方便。

GPIO口特点:
数字输入输出:GPIO(通用输入输出)口是ESP32-S3的数字引脚。它可以用于读取或控制数字信号,如开关状态、传感器数据等。
高灵活性:GPIO口可以根据需要进行配置,既可以用作输入口(读取外部信号),也可以用作输出口(控制外部设备)。
中断支持:ESP32-S3的GPIO口支持中断功能。当GPIO口状态发生变化时,可以触发中断处理程序,实现实时响应。

引脚和GPIO口的应用场景:
外部设备控制:通过配置GPIO口为输出口,可以控制各种外部设备,如LED灯、继电器、电机等。
传感器数据读取:通过配置GPIO口为输入口,可以读取各种传感器的数据,如温度传感器、湿度传感器、光照传感器等。
通信接口:引脚上集成的SPI、I2C、UART等功能可以用于与其他设备进行通信,如外部存储器、传感器模块、显示屏等。

需要注意的事项:
引脚电压:在使用引脚和GPIO口时,需要注意其工作电压范围。确保外部设备或传感器与ESP32-S3的引脚电压兼容。
IO口电流限制:每个引脚和GPIO口都有一定的电流限制。使用外部设备时,需确保其电流要求不超过引脚和GPIO口的承受能力。
引脚冲突:某些引脚具有特定功能,同时也可用作通用GPIO口。在配置引脚时,应避免引脚冲突,以免干扰其他功能的正常工作。
中断处理:使用GPIO口的中断功能时,需要编写正确的中断处理程序,并避免在中断处理程序中执行耗时操作,以免影响系统的响应性能。

综上所述,MicroPython的ESP32-S3引脚和GPIO口具有多功能性、高灵活性和中断支持等特点。它们可用于控制外部设备、读取传感器数据和实现通信接口。在使用时,需要注意引脚电压、电流限制、引脚冲突和中断处理等事项,以确保系统的稳定性和可靠性。

案例一:使用ESP32-S3的引脚控制LED灯

from machine import Pin
import time

# 定义LED引脚为GPIO2
led = Pin(2, Pin.OUT)

while True:
    # 点亮LED
    led.value(1)
    time.sleep(1)
    # 熄灭LED
    led.value(0)
    time.sleep(1)

要点解读:在这个程序中,我们使用了MicroPython的machine模块来控制ESP32-S3的引脚。首先,我们将LED灯连接到GPIO2引脚,并将其设置为输出模式。然后,我们使用一个无限循环来不断切换LED灯的状态。当LED灯亮时,我们将其值设置为1;当LED灯灭时,我们将其值设置为0。在每次切换状态之间,我们使用time.sleep()函数来暂停1秒。

案例二:使用ESP32-S3的引脚读取按键输入

from machine import Pin
import time

# 定义按键引脚为GPIO0
button = Pin(0, Pin.IN, Pin.PULL_UP)

while True:
    # 检测按键是否按下
    if button.value() == 0:
        print("按键被按下")
        time.sleep(0.5)

要点解读:在这个程序中,我们同样使用了MicroPython的machine模块来控制ESP32-S3的引脚。我们将按键连接到GPIO0引脚,并将其设置为输入模式,同时启用内部上拉电阻。然后,我们使用一个无限循环来不断检测按键的状态。当按键被按下时(即引脚值为0),我们打印出“按键被按下”并暂停0.5秒。

案例三:使用ESP32-S3的引脚控制舵机

from machine import Pin, PWM
import time

# 定义舵机引脚为GPIO16
servo = PWM(Pin(16), freq=50)

def set_angle(angle):
    duty = angle / 18 + 2
    servo.duty(duty)
    time.sleep(1)
    servo.duty(0)

while True:
    for angle in range(0, 181, 10):
        set_angle(angle)
    for angle in range(180, -1, -10):
        set_angle(angle)

要点解读:在这个程序中,我们使用了MicroPython的machine模块来控制ESP32-S3的引脚。我们将舵机连接到GPIO16引脚,并将其设置为PWM输出模式。然后,我们定义了一个名为set_angle的函数,该函数接受一个角度值作为参数,并根据该角度值设置舵机的占空比。在主循环中,我们通过调用set_angle函数来控制舵机的角度。首先,我们让舵机从0度到180度旋转,然后再从180度回到0度。

案例四:点亮LED灯程序
在这个程序中,我们将使用ESP32-S3的GPIO口控制LED灯的亮度。具体来说,我们将使用machine.Pin()函数将GPIO口2设置为输出模式,并将其连接到一个LED灯上。然后,我们使用pin.value()函数控制GPIO口的输出状态,从而控制LED灯的亮度。

import machine  
import time  
  
# 设置GPIO口2为输出模式,并连接到LED灯上  
pin = machine.Pin(2, machine.Pin.OUT)  
led = machine.Pin(5, machine.Pin.OUT) # 假设LED灯连接在GPIO口5上  
  
while True:  
    # 点亮LED灯,并设置亮度为100%  
    led.value(1)  
    pin.value(1)  
    time.sleep(1) # 等待1秒钟  
    # 熄灭LED灯,并设置亮度为0%  
    led.value(0)  
    pin.value(0)  
    time.sleep(1) # 等待1秒钟

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用machine.Pin()函数将GPIO口2设置为输出模式,并将其连接到LED灯上。假设LED灯连接在GPIO口5上,我们使用machine.Pin()函数将GPIO口5也设置为输出模式。接下来,我们使用一个无限循环来控制LED灯的亮度。在每次循环中,我们先将LED灯和GPIO口2设置为高电平状态,从而点亮LED灯。然后,我们使用time.sleep()函数等待1秒钟。接着,我们将LED灯和GPIO口2设置为低电平状态,从而熄灭LED灯。最后,我们再次使用time.sleep()函数等待1秒钟。这样,程序将会不断地循环执行点亮和熄灭LED灯的操作。

案例五:控制电机程序
在这个程序中,我们将使用ESP32-S3的GPIO口控制电机的转速。具体来说,我们将使用machine.Pin()函数将GPIO口17设置为输出模式,并将其连接到电机的控制线上。然后,我们使用pin.value()函数控制GPIO口的输出状态,从而控制电机的转速。为了实现电机的反转,我们还需要使用pin.swap()函数交换GPIO口的输入输出状态。

import machine  
import time  
  
# 设置GPIO口17为输出模式,并连接到电机控制线上  
pin = machine.Pin(17, machine.Pin.OUT)  
  
# 控制电机正转  
pin.value(1)  
time.sleep(2) # 等待2秒钟  
pin.value(0)  
time.sleep(2) # 等待2秒钟  
  
# 控制电机反转  
pin.swap() # 交换GPIO口的输入输出状态  
pin.value(1)  
time.sleep(2) # 等待2秒钟  
pin.value(0)  
time.sleep(2) # 等待2秒钟

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用machine.Pin()函数将GPIO口17设置为输出模式,并将其连接到电机的控制线上。接下来,我们使用pin.value()函数控制GPIO口的输出状态,从而控制电机的转速。具体来说,我们将GPIO口17的值设置为1,从而让电机正转。然后,我们使用time.sleep()函数等待2秒钟,让电机转动一段时间。接着,我们将GPIO口17的值设置为0,从而让电机停止转动。最后,我们再次使用time.sleep()函数等待2秒钟,让电机停止转动一段时间。这样,程序将会重复执行控制电机正转和反转的操作。

案例六:控制蜂鸣器程序
在这个程序中,我们将使用ESP32-S3的GPIO口控制蜂鸣器的响铃时间。具体来说,我们将使用machine.Pin()函数将GPIO口26设置为输出模式,并将其连接到蜂鸣器上。然后,我们使用pin.value()函数控制GPIO口的输出状态,从而控制蜂鸣器的响铃时间。为了让蜂鸣器连续响铃,我们将使用一个无限循环来控制蜂鸣器的响铃时间。

import machine  
import time  
  
# 设置GPIO口26为输出模式,并连接到蜂鸣器上  
pin = machine.Pin(26, machine.Pin.OUT)  
  
while True:  
    # 蜂鸣器响铃1秒钟  
    pin.value(1)  
    time.sleep(1)  
    # 蜂鸣器停止响铃0.5秒钟  
    pin.value(0)  
    time.sleep(0.5)

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用machine.Pin()函数将GPIO口26设置为输出模式,并将其连接到蜂鸣器上。接下来,我们使用一个无限循环来控制蜂鸣器的响铃时间。在每次循环中,我们先将GPIO口26的值设置为1,从而让蜂鸣器响铃1秒钟。然后,我们使用time.sleep()函数等待1秒钟。接着,我们将GPIO口26的值设置为0,从而让蜂鸣器停止响铃0.5秒钟。最后,我们再次使用time.sleep()函数等待0.5秒钟。这样,程序将会不断地循环执行蜂鸣器的响铃和停止响铃操作。

案例七:控制LED灯:

import machine

led_pin = machine.Pin(2, machine.Pin.OUT)

def toggle_led():
    led_pin.value(not led_pin.value())

while True:
    toggle_led()
    machine.delay(1000)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上控制LED灯。
使用machine.Pin()函数创建一个引脚对象,指定引脚编号和工作模式。
在这个示例中,引脚2被配置为输出模式,用于连接LED灯。
toggle_led()函数用于切换LED灯的状态,通过反转引脚的值来实现。
在一个无限循环中,通过调用toggle_led()函数来周期性地切换LED灯的状态。

案例八:读取按钮状态:

import machine

button_pin = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_UP)

def check_button_state():
    if button_pin.value() == 0:
        print("Button pressed")
    else:
        print("Button released")

while True:
    check_button_state()
    machine.delay(100)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上读取按钮的状态。
使用machine.Pin()函数创建一个引脚对象,指定引脚编号、工作模式和输入电平上拉。
在这个示例中,引脚4被配置为输入模式,并启用上拉电阻,用于连接按钮。
check_button_state()函数用于检查按钮的状态,通过读取引脚的值来判断按钮是按下还是释放。
在一个无限循环中,通过调用check_button_state()函数来周期性地检查按钮的状态。

案例九:PWM控制舵机:

import machine

servo_pin = machine.Pin(5)
pwm = machine.PWM(servo_pin)
pwm.freq(50)

def set_servo_angle(angle):
    duty = int(40 + angle / 18)
    pwm.duty(duty)

while True:
    set_servo_angle(0)
    machine.delay(1000)
    set_servo_angle(90)
    machine.delay(1000)
    set_servo_angle(180)
    machine.delay(1000)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过PWM信号控制舵机。
使用machine.Pin()函数创建一个引脚对象,指定引脚编号。
使用machine.PWM()函数创建一个PWM对象,并将其与引脚连接。
在这个示例中,引脚5被配置为PWM输出,用于连接舵机。
set_servo_angle()函数用于设置舵机的角度,通过调整PWM的占空比来实现。
在一个无限循环中,通过调用set_servo_angle()函数来控制舵机转动到不同的角度。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值