3. 闪烁灯
3.1 LED 灯结构组成
LED 灯(发光二极管)是一种半导体光源,主要结构包括以下部分:
- 外壳:通常由塑料或玻璃制成,用于保护内部元件。
- 发光材料:LED 最核心的部分,由特殊半导体材料制成,例如:常见的 InGaN(氮化铟镓)或 AlInGaP(铝铟镓磷)。
- 芯片:用于产生光的发光二极管芯片。
- 引线:提供电连接的金属引线。
- 焊点:将LED 芯片与引线连接在一起的焊接点。
- 电极:负责连接半导体材料与外部电路,通常由金属制成。
- 反射腔:用于增强发光效果的一个结构,将发出的光反射到正面。
3.2 LED 灯发光原理
LED(发光二极管)发光原理基于半导体特性。在半导体中,存在着两类载流子:电子(n型半导体)和空穴(p型半导体)。当n型与p型半导体材料接触时,会在交界处形成一个层结。当施加适当的电压时,层结中空穴和电子可重组并释放能量。这个能量以光子的形式释放出来,产生光。
3.3 LED 灯驱动原理
LED 驱动指的是通过稳定的电源为 LED 提供合适的电流和电压,使其正常工作点亮。LED 驱动方式主要有恒流和恒压两种。限定电流的恒流驱动是最常见的方式,因为 LED 灯对电流敏感,电流大于其额定值可能导致损坏。恒流驱动保证了稳定的电流,从而确保了 LED 安全。 LED 灯的驱动比较简单,只需要给将对应的正负极接到单片机的正负极即可驱动。LED的接法也分有两种,灌入电流和输出电流。
- 灌入电流指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU;风险是当外部电源出现变化时,会导致MCU的引脚烧坏。
- 输出电流指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED。
- 需要注意的 是 LED 灯的颜色不同,对应的电压也不同。电流不可过大,通常需要接入220欧姆到10K欧姆左右的限流电阻,限流电阻的阻值越大,LED的亮度越暗。
3.4 LED灯原理图
在开发板的原理图中,使用的是灌入电流接法,将LED的正极接入电源3.3V,负极接入限流电阻再到GPIO48。通过LED灯的驱动原理可以知道,我们只要控制开发板的GPIO48引脚输出低电平,即可点亮LED;
3.5 LED 灯驱动流程
3.5.1 导入接口类
在MicroPython中,"machine"是一个用于处理底层硬件操作的模块。它提供了访问和控制硬件资源(如GPIO引脚、串口、I2C、SPI等)的功能,使得在MicroPython环境下编写嵌入式系统程序变得更加便捷。通过"machine"模块,我们可以进行诸如控制GPIO的输入输出、操作和管理串口通信、配置和操作I2C和SPI总线以及控制定时器等功能。该模块为嵌入式设备的硬件编程提供了一系列的接口和工具。
import machine
#机器硬件的接口类
2
3.5.2 初始化引脚
classmachine.Pin(id, mode=- 1, pull=- 1, *, value, drive, alt)
该函数用于初始化引脚。其中,任何未指定的,没有写出来的设置,将保持其先前状态。
参数说明:
- id 是强制性的,可以是任意对象。可能的值类型包括:int(内部 Pin 标识符)、str(Pin 名称)和元组([port, pin] 对)。
- mode 指定引脚模式,可以是以下之一:
- Pin.IN - 引脚配置为输入。如果将其视为输出,则该引脚处于高阻抗状态。
- Pin.OUT - 引脚配置为(正常)输出。
- Pin.OPEN_DRAIN - 引脚配置为开漏输出。开漏输出的工作方式如下:如果输出值设置为0,则该引脚处于低电平有效;如果输出值为 1,则引脚处于高阻抗状态。并非所有端口都实现此模式,或者某些端口可能仅在某些引脚上。
- Pin.ALT - 引脚配置为执行特定于端口的替代功能。对于以这种方式配置的引脚,任何其他引脚方法(除了 Pin.init())都不适用(调用它们将导致未定义或特定于硬件的结果)。并非所有端口都实现此模式
- Pin.ALT_OPEN_DRAIN - 与 相同 Pin.ALT,但引脚配置为开漏。并非所有端口都实现此模式。
- pull指定引脚是否要连接(弱)上下拉电阻。可以是以下之一:
- None - 没有上拉或下拉电阻。
- Pin.PULL_UP - 上拉电阻使能。
- Pin.PULL_DOWN - 下拉电阻启用。
- value仅对 Pin.OUT 和 Pin.OPEN_DRAIN 模式有效,如果给定,则指定初始输出引脚值,否则引脚外设的状态保持不变。
- drive 指定引脚的输出功率,可以是以下之一: Pin.LOW_POWER, Pin.MED_POWER 或Pin.HIGH_POWER。实际的当前驱动能力取决于端口。并非所有端口都实现此参数。
- alt为引脚指定一个备用功能,它可以采用的值取决于端口。此参数仅对Pin.ALT和 Pin.ALT_OPEN_DRAIN 模式有效。当一个引脚支持多个备用功能时,可以使用它。如果仅支持一个引脚备用功能,则不需要此参数。并非所有端口都实现此参数。 示例:
led_gpio = 48
#初始化 led_gpio 引脚为输出模式,开启上拉电阻,
led_pin = machine.Pin(led_gpio, machine.Pin.OUT, machine.Pin.PULL_UP)
2
3
3.5.3 设置引脚高低电平
Pin.on()
将引脚设置为“1”输出电平。
Pin.off()
将引脚设置为“0”输出电平。
示例:
led_gpio = 48
#初始化 led_gpio 引脚为输出模式,开启上拉电阻,默认输出低电平(0)
led_pin = machine.Pin(led_gpio, machine.Pin.OUT, machine.Pin.PULL_UP)
#设置引脚输出低电平
led.off()
2
3
4
5
关于其他设置引脚的方式可以参考官方MricoPython文档的GPIO类:
http://www.86x.org/en/latet/esp32/quickref.html#pins-and-gpio
3.6 闪烁灯验证
在Thonny中新建一个文件。
命名保存为 01_led.py 。
在01_led.py中编写如下代码:
import machine #机器硬件的接口类
import time #导入时间类
led_gpio = 48 #定义一个变量【LED控制引脚】为48
#初始化 led_gpio 引脚为输出模式,开启上拉电阻,默认输出低电平(0)
led_pin = machine.Pin(led_gpio, machine.Pin.OUT, machine.Pin.PULL_UP)
while True:
#将引脚设置为“1”输出电平
led_pin.on()
#延时500ms
time.sleep(0.5)
#将引脚设置为“0”输出电平
led_pin.off()
#延时500ms
time.sleep(0.5)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在案例中,有使用到了时间类延时,说明如下:
utime.sleep(seconds)
- 睡眠给定的秒数seconds。ESP32S3可以接受秒作为浮点数以休眠几秒钟。 还有其他相关的延时函数请参考官方MricoPython文档的time类:
http://www.86x.org/en/latet/library/time.html
3.7 闪烁灯效果
开发板上标记着G48的LED灯,下载代码后将一会亮一会灭,持续循环。