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

news2025/2/2 5:46:42

基于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 WS2812

ring = 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 show
  File "/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_count
        self.intensity = intensity

        # prepare SPI data buffer (4 bytes for each color)
        self.buf_length = self.led_count * 3 * 4
        self.buf = bytearray(self.buf_length)

        # SPI init
        self.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.coloradmin.cn/o/1852638.html

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

相关文章

react笔记-03react-router篇

本文章是react的路由笔记 一、react路由&#xff08;v5版本&#xff09; 1. 什么是路由&#xff08;前端&#xff09;&#xff1f; 一个路由就算一个映射关系&#xff08;key: value)key为路径&#xff0c;value为组件 2. 前端路由的工作原理 根据浏览器历史记录&#xff…

Java | Leetcode Java题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; class Solution {public int[] twoSum(int[] numbers, int target) {int low 0, high numbers.length - 1;while (low < high) {int sum numbers[low] numbers[high];if (sum target) {return new int[]{low 1, high 1};} else i…

C++ (week9):Git

文章目录 1.git介绍2.git安装3.git配置4.获取自己的SSH公钥5.新建仓库6.邀请开发者7.克隆远程仓库到本地8.在本地进行开发9.本地项目推送到远程仓库10.git的工作原理11.分支管理(1)合作开发的方式(2)分支管理(3)分支合并的原理、冲突管理 12.git 与 svn 的区别13.设置alias别名…

Ubuntu iso 镜像下载 步骤截图说明

Ubuntu镜像下载&#xff0c;在这个网址&#xff1a; Enterprise Open Source and Linux | Ubuntu 步骤如下图所示&#xff1a; 1、登入网址 2、点击Get Ubuntu 3、点击Download Ubuntu Desktop 后续点击Downloadload 24.04 LTS直接下载就行 如果需要下载其它版本&#xf…

0 知识的补充

目录 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 矢量混合积 坐标系 直角坐标系 柱坐标系 球坐标系 ​​​​​​​ 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 ​​​​​​​ 矢量混合积 坐标系 直角坐标系 柱坐标系 ​​​​​​​ 球坐标系

MATLAB-SSA-CNN-SVM,基于SSA麻雀优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

MATLAB-SSA-CNN-SVM,基于SSA麻雀优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1.数据均为Excel数据&#xff0c;直接替换数据就可以运行程序。 2.所有程序都经过验证&#xff0c;保证程序可以运行。 3.具有良好的编程习惯&#xff0c;程序均包含…

【密码学】分组密码

文章目录 分组密码的模式分组密码与流密码模式明文分组与密文分组 ECB模式ECB定义ECB特点对ECB模式的攻击改变分组顺序攻击 CBC模式CBC定义初始化向量IVCBC特点对CBC模式的攻击对初始向量进行反转攻击填充提示攻击 CFB模式CFB定义对CFB模式的攻击重放攻击 OFB模式OFB定义CFB模式…

模板初阶【C++】

模板的作用 模板的主要作用是实现泛型编程&#xff0c;泛型编程即编写与类型无关的通用代码&#xff0c;是代码复用的一种手段 模板就是泛型编程的基础。 例 我们经常使用的交换函数就可以使用泛型编程来进行编写&#xff0c;这样可以大大减少重复的代码 一般编写方式 可以…

MyBatis拦截器(Interceptor)的理解与实践

文章目录 1. 什么是MyBatis拦截器&#xff1f;2. 拦截器的基本原理3. 编写自定义拦截器3.1 示例&#xff1a;实现SQL执行时间统计拦截器3.2 配置拦截器 4. 实战应用场景5. 总结 &#x1f389;欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博…

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础&#xff0c;想要拥有一个基本美观的大屏&#xff0c;就得考虑页面整体模块的宽高自适应&#xff0c;我们自然就会想到具有强大灵活性flex布局&#xff0c;再借助百分比布局来辅助。至此&#xff0c;大屏页面布局问题即可得到解决。 可视化大屏开发系…

三大交易所全面恢复 IPO 申请

6月21日晚间&#xff0c;北交所受理了3家企业的IPO申请&#xff0c;这是北交所时隔3个月之后恢复IPO受理。6月20日晚间&#xff0c;沪深交易所各受理了1家IPO申请&#xff0c;这是沪深交易所时隔半年后再次受理IPO。这也意味着&#xff0c;三大交易所IPO受理全部恢复。 6月21日…

Ubuntu-基础工具配置

基础工具配置 点击左下角 在弹出界面中点击 以下命令都是在上面这个界面执行&#xff08;请大家注意空格&#xff09; 命令输入完后&#xff0c;回车键就是执行,系统会提示输入密码&#xff08;就是你登录的密码&#xff09; 1.安装net工具 &#xff1a;&#xff08;ifconfi…

代码-功能-python-爬取博客网标题作者发布时间

环境&#xff1a; python 3.8 代码&#xff1a; # 爬取博客园内容 # https://www.cnblogs.com/import re from lxml import etree import requests import json import threading from queue import Queue import pymysql import timeclass HeiMa:def __init__(self):# 请…

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;规…

【大疆pocket3】到手后5个必改初始设置关键点(上)

【大疆pocket3】到手后5个必改初始设置关键点&#xff08;上&#xff09; 一&#xff0c;简介二&#xff0c;必改关键点2.1 视频拍摄格式2.2 竖拍选择2.3 开拍后息屏设置2.4 摇杆转速设置2.5 提示音设置为静音 一&#xff0c;简介 本文记录大疆pocket3上手后5个必改关键点&…

独立看门狗窗口开门狗

独立看门狗 接线图&#xff1a;按键用于阻塞喂狗。独立看门狗&窗口开门狗接线一样。 第一步&#xff0c;是开启时钟了&#xff0c;只有这个LSI时钟开启了独立看门狗才能运行&#xff0c;所以初始化独立看门狗之前&#xff0c;LSI必须得开启&#xff0c;但是这个开启LSI的…

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败 解决方法&#xff1a; 首先%oracle_home%/network/admin下的sqlnet.ora文件&#xff0c;把SQLNET.AUTHENTICATION_SERVICES (NTS)加个 # 注释掉就好了

稳态与敏态业务阶段

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

计算机专业:昔日万金油,明日科技潮头的弄潮儿

高考后的十字路口&#xff1a;计算机专业&#xff0c;依旧闪耀吗&#xff1f; 随着2024年高考的尘埃落定&#xff0c;数百万青春洋溢的脸庞再次凝视着未来的迷雾&#xff0c;试图在繁星点点的专业宇宙中找到那颗最亮的星——计算机科学与技术。长久以来&#xff0c;计算机专业…

自动驾驶辅助功能测试用例表格(续2)

自动驾驶辅助功能测试用例表格&#xff08;续&#xff09; 用例编号测试类型测试项目测试描述车辆准备车辆状态车辆场景车辆执行可变因素具体信号状态通过标准预期标准通过/失败TJA-001功能测试交通拥堵辅助 (TJA)测试TJA系统在交通拥堵情况下的自动跟车和保持车道功能TJA系统已…