1. 程式人生 > >[Micropython]發光二極管制作炫彩跑馬燈

[Micropython]發光二極管制作炫彩跑馬燈

chang uri 1.0 table data 數字 def fin 自動

先甩鍋 做完後才發現最後一個燈壞了,就壞了一個燈也不好意思去找淘寶店家,大家視頻湊合著看把。不過並不影響實驗效果。因為這個發光二極管白天不是很明顯 晚上炫彩效果就能出來了。本次實驗用的是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 v102WS2812B的接線示意圖,如下:
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

[Micropython]發光二極管制作炫彩跑馬燈