[Micropython]发光二极管制作炫彩跑马灯

先甩锅 做完后才发现最后一个灯坏了,就坏了一个灯也不好意思去找淘宝店家,大家视频凑合着看把。不过并不影响实验效果。因为这个发光二极管白天不是很明显 晚上炫彩效果就能出来了。本次实验用的是8个灯珠,大家可以尝试更多用更多灯珠的,或者买灯带,那样呈现的效果会更酷、更炫!视频文章最后面。

实验器材(来自某宝,可惜没有实体店不然省很多麻烦)

TPYBoard v102 1块

ws2812b RGB-Ring-8 1个

micro USB数据线 1条

杜邦线 若干

WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。 其外型与一个5050LED灯珠相同, 每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路, 还包含有高精度的内部振荡器和可编程定电流控制部分, 有效保证了像素点光的颜色高度一致。

数据协议采用单线归零码的通讯方式, 像素点在上电复位以后, DIN端接受从控制器传输过来的数据, 首先送过来的24bit数据被第一个像素点提取后, 送到像素点内部的数据锁存器, 剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点, 每经过一个像素点的传输, 信号减少24bit。像素点采用自动整形转发技术, 使得该像素点的级联个数不受信号传送的限制, 仅仅受限信号传输速度要求。

实物图

上图是8个灯珠的。

WS2812B的引脚说明

管脚名

功能描述

5V

供电引脚,输入5V

GND

电源接地

DOUT(DO)

数据信号输出

DIN(DI)

数据信号输入

硬件连接

将TPYBoard v102与WS2812B的接线示意图,如下:

TPYBoard v102

WS2812B

VIN

5V

GND

GND

X7(MISO SPI1)

DO

X8(MOSI SPI1)

DI

程序源码如下:


import pyb

import math

from ws2812 import WS2812

ring = WS2812(spi_bus=1, led_count=8, intensity=0.1)

def data_generator(led_count):

data = [(0, 0, 0) for i in range(led_count)]

step = 0

while True:

red = int((1 + math.sin(step * 0.1324)) * 127)

green = int((1 + math.sin(step * 0.1654)) * 127)

blue = int((1 + math.sin(step * 0.1)) * 127)

data[step % led_count] = (red, green, blue)

yield data

step += 1

for data in data_generator(ring.led_count):

ring.show(data)

pyb.delay(100)

里面还需要引入一个ws2812.py 文件。内容如下:


import gc

import pyb

class WS2812:

"""

Driver for WS2812 RGB LEDs. May be used for controlling single LED or chain

of LEDs.

Example of use:

chain = WS2812(spi_bus=1, led_count=4)

data = [

(255, 0, 0),    # red

(0, 255, 0),    # green

(0, 0, 255),    # blue

(85, 85, 85),   # white

chain.show(data)

Version: 1.0

"""

buf_bytes = (0x11, 0x13, 0x31, 0x33)

def __init__(self, spi_bus=1, led_count=1, intensity=1):

"""

Params:

* spi_bus = SPI bus ID (1 or 2)

* 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, pyb.SPI.MASTER, baudrate=3200000, polarity=0, phase=1)

# turn LEDs off

self.show([])

def show(self, data):

"""

Show RGB data on LEDs. Expected data = [(R, G, B), ...] where R, G and B

are intensities of colors in range from 0 to 255. One RGB tuple for each

LED. Count of tuples may be less than count of connected LEDs.

"""

self.fill_buf(data)

self.send_buf()

def send_buf(self):

"""

Send buffer over SPI.

"""

self.spi.send(self.buf)

gc.collect()

def update_buf(self, data, start=0):

"""

Fill a part of the buffer with RGB data.

Order of colors in buffer is changed from RGB to GRB because WS2812 LED

has GRB order of colors. Each color is represented by 4 bytes in buffer

(1 byte for each 2 bits).

Returns the index of the first unfilled LED

Note: If you find this function ugly, it‘s because speed optimisations

beated purity of code.

"""

buf = self.buf

buf_bytes = self.buf_bytes

intensity = self.intensity

mask = 0x03

index = start * 12

for red, green, blue in data:

red = int(red * intensity)

green = int(green * intensity)

blue = int(blue * intensity)

buf[index] = buf_bytes[green >> 6 & mask]

buf[index+1] = buf_bytes[green >> 4 & mask]

buf[index+2] = buf_bytes[green >> 2 & mask]

buf[index+3] = buf_bytes[green & mask]

buf[index+4] = buf_bytes[red >> 6 & mask]

buf[index+5] = buf_bytes[red >> 4 & mask]

buf[index+6] = buf_bytes[red >> 2 & mask]

buf[index+7] = buf_bytes[red & mask]

buf[index+8] = buf_bytes[blue >> 6 & mask]

buf[index+9] = buf_bytes[blue >> 4 & mask]

buf[index+10] = buf_bytes[blue >> 2 & mask]

buf[index+11] = buf_bytes[blue & mask]

index += 12

return index // 12

def fill_buf(self, data):

"""

Fill buffer with RGB data.

All LEDs after the data are turned off.

"""

end = self.update_buf(data)

# turn off the rest of the LEDs

buf = self.buf

off = self.buf_bytes[0]

for index in range(end * 12, self.buf_length):

buf[index] = off

index += 1

本次参考的github上的一个项目。项目地址:

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

给大家看一下效果

https://v.qq.com/x/page/d05297wxo1b.html

原文地址:https://www.cnblogs.com/xxosu/p/8213432.html

时间: 2024-10-10 22:11:09

[Micropython]发光二极管制作炫彩跑马灯的相关文章

vue制作滚动条幅-跑马灯效果实例代码

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body>

Cocos2d-x 3.2:通过ClippingNode实现一个功能完善的跑马灯公告(1)

Cocos2d-x 3.2:通过ClippingNode实现一个功能完善的跑马灯公告(1) 本文转载至深入理解Cocos2d-x 3.x:一步一步通过ClippingNode实现一个功能完善的跑马灯公告(1) 这篇文章主要是通过一步一步实现一个功能完善的跑马灯公告来展示ClippingNode的用法并且最终深入ClippingNode的源码,了解其实现原理. 首先,先介绍一下ClippingNode,ClippingNode也叫裁剪节点,能将一些内容通过使用模板裁剪出来显示在界面上,可以实现一些

【深入了解cocos2d-x 3.x】一步一步通过ClippingNode实现一个功能完善的跑马灯公告(1)

这篇文章主要是通过一步一步实现一个功能完善的跑马灯公告来展示ClippingNode的用法并且最终深入ClippingNode的源码,了解其实现原理. 首先,先介绍一下ClippingNode,ClippingNode也叫裁剪节点,能将一些内容通过使用模板裁剪出来显示在界面上,可以实现一些很炫酷的效果.来看看今天要实现的效果 1.ClippingNode类分析 先来看看ClippingNode的声明文件 看看其中的public方法 class CC_DLL ClippingNode : publ

【雕爷学编程】Arduino动手做(56)---8路LED跑马灯模块

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉. [Arduino]108种传感器模块系列实验(资料+代码+图形+仿真) 实验五十六: 8路LED流水的灯跑马灯模块SUNLEPHANT 发光二极管简称为LED.由含镓(Ga).砷(As).磷(P)

CSS3——3D旋转图(跑马灯效果图)

CSS3新增了很多新的属性,可以用很少的代码实现炫酷的动画效果,但由于兼容性各浏览器的能力存在不足,有特别需求的网站就呵呵啦.H5C3已是大势所趋了,之前看过一个新闻,Chrome将在年底全面转向H5,抛弃了Flash.. 本案例主要使用了CSS3中的变换transform和动画animation属性,实现了跑马灯效果,详细的解释在代码中的注释中. 做好布局之后的效果图 添加了animation样式,实现自动旋转,并且鼠标移入,停止动画.(鼠标移入,绕Z轴旋转90度) 代码: 1 <!DOCTY

Web前端制作炫酷特效和动态icon

1.box-shadow属性除了常用于阴影效果.卡片等基础使用外,还可以用于实现比较炫酷的特效: 类似这样的想过都是可以通过box-shadow属性制作的:资料来源于CSDN:很小白的小白 附上他的代码, <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content=&q

关于跑马灯的体会

1. android:singleLine="true"虽然被不建议使用,但是跑马灯必须是它.如果改为android:maxLines="1",不能实现跑马灯效果. 2. android:marqueeRepeatLimit="marquee_forever" 是否使用,没关系. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android仿京东首页轮播文字(又名垂直跑马灯)

Android仿京东首页轮播文字(又名垂直跑马灯) 京东客户端的轮播文字效果: 本次要实现的只是后面滚动的文字(前面的用ImageView或者TextView实现即可),看一下实现的效果 实现思路 上图只是一个大概的思路,要实现还需要完善更多的细节,下面会一步步的来实现这个效果: 1.封装数据源:从图上可以看到,轮播的文字是分为两个部分的,暂且把它们分别叫做前缀和内容,而且实际的使用过程中点击轮播图肯定是需要跳转页面的,而且大部分应该是WebView,不妨我们就设置点击时候需要获取的内容就是一个

js简单跑马灯案例

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>跑马灯</title> <style type="text/css"> *{ margin: 0; padding: 0; } #bian{ width: 300px; height: 300px; margin:0 auto