基于Pico和MicroPython点亮ws2812彩色灯带

基于Pico和MicroPython点亮ws2812彩色灯带

文章目录

  • 基于Pico和MicroPython点亮ws2812彩色灯带
    • Introduction
    • Practice
    • Conclusion

Introduction

点亮发光的LED灯是简单有趣的实验,点亮多个ws2812小灯串联起来的灯带,可对多个彩色小灯进行编程,从而实现各种有趣的显示效果。多个ws2812使用串联的方式级联在一起,微控制器以发出长短脉冲的序列控制彩色小灯显示的颜色和亮度。

此处略过控制ws2812发光的原理和控制方法,直接动手实验,讲述基于Pico电路板和MicroPython点亮ws2812彩色灯带的学习、调试和操作过程。调试过程中,使用了来自电子森林的Step-Pico电路板,同树莓派官方的RPI Pico电路板兼容,但换用了Type-C插座、新增了复位按键,以及4个ws2812彩灯级联起来的灯带,实际使用起来更加方便。

在这里插入图片描述

Step Pico上连接ws2812彩灯部分的原理图

Practice

在网上搜索到比较靠谱的关于使用MicroPython点亮ws2812彩灯的资料,大多来自于github上的micropythno-ws2812项目:

  • https://github.com/JanBednarik/micropython-ws2812

对于访问github不便的开发者,笔者在国内的gitee开源代码站点上做了个镜像(https://gitee.com/suyong_yq/micropython-ws2812),方便获取源码。如图x所示。

在这里插入图片描述

图x 在开源站点上的micropython-ws2812项目

这个项目基于早期使用STM32微控制器的pyb电路板开发,估计也能兼容Pico板子上的MicroPython,其中提供了一些有趣的用例。按照说明,开发者需要先将ws2812.py文件导入到MicroPython中,此处导入到Pico板子上的/lib目录下。如图x所示。

在这里插入图片描述

图x 导入ws2812b.py到Pico上的MicroPython

然后,运行代码仓库提供的用例:

from ws2812 import WS2812ring = WS2812(spi_bus=1, led_count=4)data = [(24, 0, 0),(0, 24, 0),(0, 0, 24),(0, 0, 0),
]ring.show(data)

试运行时,发现报错:

>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):File "<stdin>", line 6, in <module>File "/lib/ws2812.py", line 45, in __init__
AttributeError: type object 'SPI' has no attribute 'MASTER'

在Pico的REPL中查看MicroPython的SPI类属性,发现确实没有MASTER这个属性。

>>> import machine
>>> dir(machine)
['__class__', '__name__', 'ADC', 'I2C', 'I2S', 'PWM', 'PWRON_RESET', 'Pin', 'RTC', 'SPI', 'Signal', 'SoftI2C', 'SoftSPI', 'Timer', 'UART', 'USBDevice', 'WDT', 'WDT_RESET', '__dict__', 'bitstream', 'bootloader', 'deepsleep', 'dht_readinto', 'disable_irq', 'enable_irq', 'freq', 'idle', 'lightsleep', 'mem16', 'mem32', 'mem8', 'reset', 'reset_cause', 'soft_reset', 'time_pulse_us', 'unique_id']
>>> from machine import SPI
>>> dir(SPI)
['__class__', '__name__', 'read', 'readinto', 'write', 'LSB', 'MSB', '__bases__', '__dict__', 'deinit', 'init', 'write_readinto']
>>> 

ws2812.py文件在初始化spi设备时确实使用了MASTER属性。

# SPI init
self.spi = pyb.SPI(spi_bus, pyb.SPI.MASTER, baudrate=3200000, polarity=0, phase=1)

猜测,这可能是MicroPython版本更新导致的问题,也可能是MicroPython在不同芯片的跨平台设计的问题。

在寻找新的代码之前,我想先试着人工修复一下。毕竟当前的ws2812.py文件已经把控制逻辑的框架都写好了,只要结合当前的驱动重新做下适配就好。

试着移除pyb.SPI.MASTER的参数,再运行。还有报错:

>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):File "<stdin>", line 6, in <module>File "/lib/ws2812.py", line 48, in __init__File "/lib/ws2812.py", line 57, in showFile "/lib/ws2812.py", line 63, in send_buf
AttributeError: 'SPI' object has no attribute 'send'

试着将send换成write,再运行。这个时候已经不报错了。但板子上的ws2812b彩灯也没亮。

猜测,可能引脚没对上,板子上用GPIO23接入灯带,但用例中没有指定SPI_SOUT信号使用的引脚。查一下运行程序后GPIO23引脚的状态:

>>> machine.Pin(23)
Pin(GPIO23, mode=ALT, pull=PULL_DOWN, alt=31)

此处为未配置alt=31。但后续实验成功的情况下,GPIO32引脚的复用功能应为SPI:

>>> machine.Pin(23)
Pin(GPIO23, mode=ALT, alt=SPI)

同时,经过比对原理图发现,当前板子上接入灯带使用的GPIO23引脚未接入扩展引脚,也就意味着这肯定也不是默认的SPI输出引脚(默认的引脚一定是外接到板子的扩展插针上方便开发者接线)。此时,有两个思路:

  • 在当前软件框架下,试着设定使用GPIO23作为某个硬件SPI模块的输出脚
  • 再找找别的ws2812的库,可以指定控制引脚信号的

在试第一条路的阶段,竟然直接走通了。

在实例化WS2812对象的实例化函数的参数列表里,加入一个指定输出控制引脚的参数。然后在实例化函数内部实例化SPI模块实例的时候,指定mosi参数为传入引脚。为此,有改动如下:

ws2812.py文件中,有:

    def __init__(self, spi_bus=1, pin=23, led_count=1, intensity=1):"""Params:* spi_bus = SPI bus ID (0, 1 or 2)* pin = output pin to ws2812, mosi of spi* led_count = count of LEDs* intensity = light intensity (float up to 1)"""self.led_count = led_countself.intensity = intensity# prepare SPI data buffer (4 bytes for each color)self.buf_length = self.led_count * 3 * 4self.buf = bytearray(self.buf_length)# SPI initself.spi = pyb.SPI(spi_bus, baudrate=3200000, polarity=0, phase=1, mosi=pyb.Pin(pin, pyb.Pin.OUT))

此处指定默认使用GPIO23引脚连接灯带,并在实例化SPI对象时,设定mosi的引脚为输出Pin.OUT

然后,main.py文件中实例化WS2812对象时,传入GPIO23引脚的参数:

ring = WS2812(spi_bus=1, pin=23, led_count=4)

运行,有报错信息:

>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):File "<stdin>", line 6, in <module>File "/lib/ws2812.py", line 46, in __init__
ValueError: bad MOSI pin

猜测,可能硬件spi_bus=1可能没有映射到GPIO23的信号。换用spi_bus=0,再试试看:

ring = WS2812(spi_bus=0, pin=23, led_count=4)

运行竟然成功了。没有报错,板子上的ws2812小灯也都亮起来了。Bingo !!!

在这里插入图片描述

图x 点亮ws2812灯带实验

Conclusion

在github上开源的micropython-ws2812项目的基础上,新增了指定SPI_SOUT引脚的实例化参数,实现了基于Pico电路板和MicroPython点亮ws2812b彩色灯带的效果。调试过程在Step Pico电路板上验证成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

夏季城市内涝防治:视频汇聚系统智能AI技术助力城市自然灾害应急管理

据新闻报道&#xff0c;6月19日至20日&#xff0c;受强降雨影响&#xff0c;广西桂林城区及周边等地出现今年入汛以来持续时间最长、累计降水量最大、影响范围最广、致灾风险最高的暴雨天气过程&#xff0c;导致桂林市区多处发生洪水内涝&#xff0c;房屋被淹、道路受阻、人员被…

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…

【pytorch04】创建Tensor

numpy中的数据创建tensor 数据已经在numpy中了&#xff0c;将numpy中的数据转到tensor中来&#xff0c;因为我们将使用tensor在GPU上进行加速运算 从NUMPY导入的FLOAT其实是DOUBLE类型 list中的数据创建tensor FloatTensor()和大写的Tensor()接收的是shape&#xff08;即数据的…

Python-算法编程100例-前缀和双指针(入门级)-最长的指定瑕疵度的元音子串

题目描述&#xff1a; 元音字符为“aeiouAEIOU” 给定一个字符串&#xff0c;求字符串中满足指定瑕疵度的最长元音子串的长度。元音子串为字符串中开头和结尾都是元音字符的字符串&#xff0c;瑕疵度为子串中非元音字符的个数。 题目分析&#xff1a; 1、直接使用双指针&am…

JAVA学习过程中遇到的问题

前言 记录学习过程中遇见的各种问题。希望对你有帮助。 目录 前言 1、新建maven项目时&#xff0c;archetype项目骨架加载慢 2、maven的pop.xml添加依赖项无法检测到 3、java: 无效的目标发行版: 20 4、idea添加maven依赖太慢 5、CTRLCV复制粘贴太慢 6、Swagger写接口文…

5. 最长回文子串(leetcode)

5. 最长回文子串&#xff08;leetcode&#xff09; 题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串 示例1 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示例2 输入&#xff1a;s “cbbd” 输出&a…

SD卡无法读取?数据恢复全攻略!

SD卡无法读取问题描述 在日常使用电子设备时&#xff0c;我们有时会遇到SD卡无法读取的情况。当插入SD卡后&#xff0c;设备可能无法识别或访问其中的数据&#xff0c;这给我们带来了诸多不便。SD卡无法读取&#xff0c;意味着存储在卡中的重要文件、照片和视频等资料可能面临…

NLP基础知识——文本处理、张量表示、文本数据分析

文本分词 jieba分词 繁体、简体都可以 #精确模式分词 import jieba content我来工作爱生活爱拉芳爱学习喜欢跳舞 jieba.lcut(content,cut_allFalse) #全模式分词 jieba.lcut(content,cut_allTrue) #搜索引擎模式 jieba.lcut_for_search(content) #自定义字典dict jieba.load_…

Java中的编译时与运行时注解

Java中的编译时与运行时注解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 注解&#xff08;Annotation&#xff09;是Java语言的一项重要特性&#xff0c;广…

数学建模---包汤圆问题引发的思考

1.前言 &#xff08;1&#xff09;虽然我学习这个数学建模已经很长一段时间了&#xff0c;但是我认为自己始终是一个门外汉&#xff0c;只是学习了一下这个基本的建模软件使用方法&#xff0c;以及一些相关的知识&#xff0c;虽然参加了一次这个电工杯的比赛&#xff0c;但是这…

1.Triangle

一、你好&#xff0c;三角形 在OpenGL中&#xff0c;任何事物都在3D空间中&#xff0c;而屏幕和窗口却是2D像素数组&#xff0c;这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。 3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线&#xff08;Graphi…

Linux 下判断一个字符串ip是否合法

Linux 下判断一个字符串ip是否合法 C regexQt C ip是否合法参考 C regex #include <iostream> #include <regex> #include <string>bool is_valid_ip(std::string ip_str) {// 定义IPv4地址正则表达式//std::regex ipv4_regex("^([01]?[0-9]?[0-9]|2…

SQL中的DISTINCT用法总结

SQL中的DISTINCT用法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. DISTINCT的基本概念 在SQL中&#xff0c;DISTINCT是一种用于去除查询结果中重复行…

稳态与敏态业务阶段

稳态业务就是比如你登录学校的图书馆教务处这些业务系统 用户数量和数据基本上不会发生太大的变化 业务系统的更新也不是很频繁&#xff0c;比较方便资源的采购 敏态业务就是比如我开发一个应用上线了&#xff0c;我不知道有多少用户和数量&#xff0c;无法预估 这就没办法…

2小时极速入门 TypeScript-慕课网 笔记

TS文档&#xff1a;https://www.tslang.cn/docs/handbook/modules.html 一&#xff0c;什么是TS 注:Typescript无法在浏览器中运行 ,所以需要编译器,将TS转变为JS 问&#xff1a;TS运行这么麻烦&#xff0c;为什么还要有TS&#xff1f; 答&#xff1a;TS强类型 1&#xff0c;规…

腾讯云OpenCloudOS系统上安装MySQL

在腾讯云OpenCloudOS系统上安装MySQL&#xff0c;可以通过以下步骤进行&#xff1a; 更新软件包列表&#xff1a; sudo yum update -y 安装MySQL服务器&#xff1a; sudo yum install mysql-server -y 启动MySQL服务&#xff1a; sudo systemctl start mysqld 设置MySQL…

LDO VS buck的优缺点对比:LDO(效率低但稳压);DCDC(降压buck,效率高但噪声大)

LDO&#xff1a; Low Dropout Regulator&#xff0c;低压差稳压器 低压差&#xff1a;输入电压与输出电压的差值低&#xff1b; 稳压&#xff1a;当输入电压VIN在正常范围内时&#xff0c;输出电压VOUT都稳定在一个我们需要的固定电压值&#xff1b; 举个栗子&#xff0c;输…

Selenium WebDriverWait和expected_conditions来定位实时更新的元素

WebDriverWait 是 Selenium WebDriver 的一个等待机制&#xff0c;用于等待一个特定条件成立直到一个最大的时间阈值。这种等待方式是显式等待&#xff0c;与隐式等待相对。显式等待提供了一种更灵活的方式来等待页面上的元素或条件&#xff0c;因为它允许你指定等待条件和时间…

Opencv学习项目4——pyzbar

Pyzbar介绍 Pyzbar 是一个用于解码条形码和二维码的 Python 库。它是基于 ZBar 条形码扫描器库的 Python 绑定&#xff0c;支持多种条形码格式&#xff0c;包括 QR 码、EAN-13、UPC-A、Code 128 等。 Pyzbar 的主要功能 解码多种类型的条形码和二维码&#xff1a;支持包括 QR 码…

前端构建工具其配置过程

前端构建工具&#xff08;如Webpack、Rollup等&#xff09;其配置过程。 前端构建工具&#xff0c;如Webpack和Rollup&#xff0c;是用于管理和优化前端项目模块化结构的工具。它们的主要任务是打包代码&#xff0c;压缩资源&#xff0c;处理依赖&#xff0c;以及实现模块化的…