【雕爷学编程】MicroPython手册之 SAMD21 驱动Neopixel LED

在这里插入图片描述
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、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
SAMD21是一系列使用32位ARM® Cortex®-M0+处理器的低功耗微控制器,由Microchip Technology公司开发。SAMD21的技术参数如下:

1、处理器:32位ARM® Cortex®-M0+,最高工作频率为48MHz,每兆赫兹可达2.46 Coremark。
2、存储器:闪存容量从32KB到256KB不等,SRAM容量从4KB到32KB不等。
3、电源管理:支持多种低功耗模式,如空闲和待机模式,最低功耗为3.5μA/MHz。
4、外设:拥有丰富的智能和灵活的外设,如直接内存访问控制器(DMAC)、事件系统、定时器/计数器(TC/TCC)、实时时钟(RTC)、看门狗定时器(WDT)、CRC-32生成器、通用串行总线(USB)2.0接口、串行通信接口(SERCOM)、Inter-IC Sound(I2S)接口、模数转换器(ADC/DAC)、模拟比较器(AC)和外设触摸控制器(PTC)。
5、封装:支持多种封装形式,从32引脚到64引脚不等,包括TQFP、QFN、UFBGA和WLCSP。
6、标准:符合AEC-Q100 Grade 1的汽车级标准,工作温度范围为-40°C到+125°C。

在这里插入图片描述
MicroPython的SAMD21驱动Neopixel LED是指在MicroPython环境中使用SAMD21微控制器实现对Neopixel LED的控制。

主要特点:

硬件支持:SAMD21驱动Neopixel LED利用SAMD21微控制器的硬件外设来实现对Neopixel LED的控制。这意味着驱动能够直接与LED进行硬件级别的通信,提供高性能和稳定性。
灵活性:SAMD21驱动Neopixel LED提供灵活的控制接口,使得开发者可以通过MicroPython代码对Neopixel LED进行各种光效、亮度和颜色等方面的控制。这种灵活性使得驱动适用于各种LED应用场景。
高精度控制:Neopixel LED是一种数字可控LED,具有高精度的亮度和颜色控制能力。SAMD21驱动Neopixel LED通过微控制器的高精度时钟和数据传输能力,实现对Neopixel LED的精确控制。
可扩展性:SAMD21驱动Neopixel LED支持级联多个Neopixel LED,通过适当的硬件连接和软件控制,可以同时控制多个Neopixel LED,实现更大规模的照明效果。

应用场景:

照明装饰:Neopixel LED具有丰富的颜色和亮度控制能力,适用于照明装饰应用。通过SAMD21驱动Neopixel LED,可以实现各种动态和多彩的照明效果,如灯带、灯泡、光雕等,用于室内和室外的装饰照明。
LED艺术品:Neopixel LED的高精度控制特性使其成为创作LED艺术品的理想选择。SAMD21驱动Neopixel LED可以用于控制LED画作、雕塑、装置艺术等作品,实现艺术家所需的精确亮度和颜色效果。
LED显示屏:通过级联多个Neopixel LED,可以构建LED显示屏。SAMD21驱动Neopixel LED可以用于控制LED显示屏的显示内容、亮度和颜色,广泛应用于广告牌、信息展示等场景。

注意事项:

电源供应:Neopixel LED通常需要较高的电流供应。在使用SAMD21驱动Neopixel LED时,需要确保提供足够的电流,以满足LED的工作要求,并注意电源稳定性。
引脚配置:在使用SAMD21驱动Neopixel LED之前,需要正确配置相关的GPIO引脚。确保所选的引脚与Neopixel LED的连接正确,并满足引脚的电压和功能要求。
时序要求:Neopixel LED的控制需要严格的时序要求。在编写控制代码时,需要确保时序的准确性,以避免数据传输错误或LED显示异常。

综上所述,MicroPython的SAMD21驱动Neopixel LED通过SAMD21微控制器的硬件外设实现对Neopixel LED的控制,具有硬件支持、灵活性、高精度控制和可扩展性等特点。适用于照明装饰、LED艺术品和LED显示屏等应用场景。在使用SAMD21驱动Neopixel LED时,需要注意电源供应的充足性和稳定性,正确配置GPIO引脚,以及确保控制代码的时序准确性。这样才能保证Neopixel LED的正常工作和预期的光效效果。

在这里插入图片描述

案例1:点亮所有LE

from machine import Pin, PinGroup
import time

# 初始化引脚
pins = [Pin(i, Pin.OUT) for i in range(8)]
group = PinGroup(pins)

# 循环点亮和熄灭所有LED
while True:
    for pin in pins:
        pin.value(1)      # 点亮LED
        time.sleep(1)     # 延时1秒
        pin.value(0)      # 熄灭LED
        time.sleep(1)     # 延时1秒

要点解读:这个程序与前两个案例类似,但它控制了所有的Neopixel LED。它首先创建了一个包含8个Pin对象的列表,然后将这些Pin对象组成了一个PinGroup对象。在每次循环中,它遍历所有的LED引脚,依次点亮和熄灭它们,并延时1秒。这样就实现了所有LED的同时控制效果。

案例2:改变所有LED的颜色

from machine import Pin, PinGroup
import time

# 初始化引脚
pins = [Pin(i, Pin.OUT) for i in range(8)]
group = PinGroup(pins)

# 循环改变所有LED的颜色
for i in range(8):
    color = (i * 255 // 8, (i + 1) * 255 // 8, 0)
    for pin in pins:
        pin.value(color[0])    # 设置红色分量
        pin.value(color[1])    # 设置绿色分量
        pin.value(0)           # 设置蓝色分量为0
        time.sleep(0.5)       # 延时0.5秒

要点解读:这个程序与前两个案例类似,但它改变了所有LED的颜色。它使用了一个嵌套的for循环,外层循环遍历所有的LED,内层循环分别设置每个LED的红、绿、蓝三个分量的值。这里使用了RGB颜色模型,其中R、G、B三个分量的值范围是0~255。最后,将蓝色分量设置为0,表示关闭蓝色光。这样就实现了所有LED颜色的循环变化效果。

案例3:同时控制多个LED

from machine import Pin, PinGroup
import time

# 初始化引脚
pins = [Pin(i, Pin.OUT) for i in range(8)]
group = PinGroup(pins)

# 循环点亮和熄灭多个LED
while True:
    for pin in pins:
        pin.value(1)      # 点亮LED
        time.sleep(1)     # 延时1秒
        pin.value(0)      # 熄灭LED
        time.sleep(1)     # 延时1秒
    for pin in pins:
        pin.value(0)      # 熄灭所有LED
        time.sleep(1)     # 延时1秒

要点解读:这个程序与前两个案例类似,但它同时控制了多个LED。它首先创建了一个包含8个Pin对象的列表,然后将这些Pin对象组成了一个PinGroup对象。在每次循环中,它先遍历所有的LED引脚,依次点亮和熄灭它们,并延时1秒。然后再将所有LED全部熄灭,并延时1秒。这样就实现了多个LED的同时控制效果。

案例4:使用Neopixel驱动点亮单个LED

import machine  
import neopixel  
  
# 设置GPIO引脚为Neopixel通信引脚  
pin = machine.Pin(1, machine.Pin.OUT)  
np = neopixel.NeoPixel(pin, 1)  
  
# 点亮第一个LED,设置颜色为红色  
np.write_pixel(0, (255, 0, 0))  
np.show()

要点解读:
首先导入所需的模块,包括machine和neopixel。
然后将GPIO引脚1设置为Neopixel通信引脚,并创建一个NeoPixel对象。这里设置了LED的数量为1。
使用np.write_pixel()方法设置第一个LED的颜色,这里设置为红色。np.show()方法将设置应用到LED上,点亮LED。

案例5:使用Neopixel驱动循环点亮多个LED

import machine  
import neopixel  
import time  
  
# 设置GPIO引脚为Neopixel通信引脚  
pin = machine.Pin(1, machine.Pin.OUT)  
np = neopixel.NeoPixel(pin, 6)  
  
# 循环点亮多个LED,每个LED颜色不同  
for i in range(6):  
    np.write_pixel(i, (i*40, 0, 0))  
np.show()  
time.sleep(1)  
for i in range(6):  
    np.write_pixel(i, (0, i*40, 0))  
np.show()  
time.sleep(1)  
for i in range(6):  
    np.write_pixel(i, (0, 0, i*40))  
np.show()

要点解读:
首先导入所需的模块,包括machine、neopixel和time。
然后将GPIO引脚1设置为Neopixel通信引脚,并创建一个NeoPixel对象。这里设置了LED的数量为6。
使用for循环遍历LED的索引,设置每个LED的颜色。这里分别设置了红、绿、蓝三种颜色,每种颜色渐变。每次设置完颜色后,使用np.show()方法将设置应用到LED上。使用time.sleep()方法暂停程序,以便观察LED的变化。

案例6:使用Neopixel驱动实现流水灯效果

import machine  
import neopixel  
import time  
  
# 设置GPIO引脚为Neopixel通信引脚  
pin = machine.Pin(1, machine.Pin.OUT)  
np = neopixel.NeoPixel(pin, 6)  
  
# 实现流水灯效果,LED依次点亮  
for i in range(6):  
    np.write_pixel(i, (255, 255, 255))  
    np.show()  
    time.sleep(0.2)  
    np.write_pixel(i, (0, 0, 0))  
np.show()

要点解读:
首先导入所需的模块,包括machine、neopixel和time。
然后将GPIO引脚1设置为Neopixel通信引脚,并创建一个NeoPixel对象。这里设置了LED的数量为6。
使用for循环实现流水灯效果。每次循环将一个LED点亮,然后延时0.2秒后熄灭该LED,接着点亮下一个LED。使用np.write_pixel()方法设置LED的颜色,这里设置为白色。使用np.show()方法将设置应用到LED上。

案例7:使用Neopixel LED制作彩虹灯效

import time
import machine
import neopixel

# 创建一个Pin对象,连接到数据线上
dat = machine.Pin(12)

# 创建一个Neopixel对象,传入数据线的Pin对象,以及LED的数量
strip = neopixel.NeoPixel(dat, 60)

# 定义一个函数,根据偏移量和亮度生成一个颜色元组
def wheel(offset, brightness):
    # 颜色是从红到绿到蓝再回到红的过渡
    offset = 255 - offset
    if offset < 85:
        return (255 - offset * 3, 0, offset * 3)
    if offset < 170:
        offset -= 85
        return (0, offset * 3, 255 - offset * 3)
    offset -= 170
    return (offset * 3, 255 - offset * 3, 0)

# 循环显示彩虹灯效
while True:
    # 遍历所有的LED
    for i in range(strip.n):
        # 根据LED的位置和当前时间计算颜色偏移量
        offset = (i * 256 // strip.n + time.ticks_ms() // 10) % 255
        # 设置LED的颜色,亮度为最大值255
        strip[i] = wheel(offset, 255)
    # 将颜色数据发送到LED上
    strip.write()

案例8:使用Neopixel LED制作呼吸灯效

import time
import machine
import neopixel

# 创建一个Pin对象,连接到数据线上
dat = machine.Pin(12)

# 创建一个Neopixel对象,传入数据线的Pin对象,以及LED的数量
strip = neopixel.NeoPixel(dat, 60)

# 定义一个函数,根据亮度生成一个颜色元组(白色)
def breathe(brightness):
    return (brightness, brightness, brightness)

# 循环显示呼吸灯效
while True:
    # 遍历所有可能的亮度值(0-255)
    for b in range(256):
        # 设置所有LED的颜色和亮度
        strip.fill(breathe(b))
        # 将颜色数据发送到LED上
        strip.write()
        # 等待一段时间(根据亮度调整)
        time.sleep_ms(10 + b * b // 16)
    # 反向遍历所有可能的亮度值(255-0)
    for b in range(255, -1, -1):
        # 设置所有LED的颜色和亮度
        strip.fill(breathe(b))
        # 将颜色数据发送到LED上
        strip.write()
        # 等待一段时间(根据亮度调整)
        time.sleep_ms(10 + b * b // 16)

案例9:使用Neopixel LED制作跑马灯效

import time
import machine
import neopixel

# 创建一个Pin对象,连接到数据线上
dat = machine.Pin(12)

# 创建一个Neopixel对象,传入数据线的Pin对象,以及LED的数量
strip = neopixel.NeoPixel(dat, 60)

# 定义一个函数,根据位置和方向生成一个颜色元组(红色)
def chase(i, direction):
    if direction == 'right':
        return (255, 0, 0) if i % 4 == 0 else (0, 0, 0)
    else:
        return (255, 0, 0) if i % 4 == 3 else (0, 0, 0)

# 循环显示跑马灯效
while True:
    # 设置方向为右
    direction = 'right'
    # 遍历所有的LED
    for i in range(strip.n):
        # 设置LED的颜色
        strip[i] = chase(i, direction)
    # 将颜色数据发送到LED上
    strip.write()
    # 等待一段时间
    time.sleep_ms(100)
    # 设置方向为左
    direction = 'left'
    # 反向遍历所有的LED
    for i in range(strip.n - 1, -1, -1):
        # 设置LED的颜色
        strip[i] = chase(i, direction)
    # 将颜色数据发送到LED上
    strip.write()
    # 等待一段时间
    time.sleep_ms(100)

这些程序的要点解读如下:
首先,导入需要的模块,包括time、machine、neopixel。
然后,创建一个Pin对象,连接到数据线上。这里假设数据线连接到12号引脚。
接着,创建一个Neopixel对象,传入数据线的Pin对象,以及LED的数量。这个对象封装了Neopixel LED的特定操作,如设置颜色、发送数据等。
然后,定义一些辅助函数,用于根据不同的参数生成不同的颜色元组。每个颜色元组包含三个元素,分别表示红色、绿色和蓝色,取值范围都是0-255。
接着,进入一个循环,显示不同的灯效。
在循环中,根据不同的案例,使用不同的算法来设置每个LED的颜色。可以使用strip[i] = color_tuple来设置第i个LED的颜色,也可以使用strip.fill(color_tuple)来设置所有LED的颜色。
然后,调用strip.write()方法,将颜色数据发送到LED上,让它们亮起来。
接着,使用time模块的sleep或sleep_ms方法,暂停一段时间,让灯效持续一段时间。

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133450922