日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

micropython web ws2812_MicroPython实例之TPYBoard v102炫彩跑马灯WS2812B

發布時間:2023/12/20 python 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 micropython web ws2812_MicroPython实例之TPYBoard v102炫彩跑马灯WS2812B 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實驗目的

了解ws2812b的工作原理

學習ws2812b的驅動方法

二、實驗器材

TPYBoard v102 1塊

ws2812b RGB-Ring-8 1個

micro USB數據線 1條

杜邦線 若干

三、WS2812B的介紹

WS2812B是一個集控制電路與發光電路于一體的智能外控LED光源。 其外型與一個5050LED燈珠相同, 每個元件即為一個像素點。像素點內部包含了智能數字接口數據鎖存信號整形放大驅動電路, 還包含有高精度的內部振蕩器和可編程定電流控制部分, 有效保證了像素點光的顏色高度一致。

數據協議采用單線歸零碼的通訊方式, 像素點在上電復位以后, DIN端接受從控制器傳輸過來的數據, 首先送過來的24bit數據被第一個像素點提取后, 送到像素點內部的數據鎖存器, 剩余的數據經過內部整形處理電路整形放大后通過DO端口開始轉發輸出給下一個級聯的像素點, 每經過一個像素點的傳輸, 信號減少24bit。像素點采用自動整形轉發技術, 使得該像素點的級聯個數不受信號傳送的限制, 僅僅受限信號傳輸速度要求。

實物圖

上圖是8個燈珠的。

WS2812B的引腳說明:

硬件連接

將TPYBoard v102與WS2812B的接線示意圖,如下:

程序源碼如下:

importpybimportmathfrom ws2812 importWS2812

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

data= [(0, 0, 0) for i inrange(led_count)]

step=0whileTrue:

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)yielddata

step+= 1

for data indata_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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的micropython web ws2812_MicroPython实例之TPYBoard v102炫彩跑马灯WS2812B的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。