一、實驗目的
了解ws2812b的工作原理
學習ws2812b的驅動方法
二、實驗器材
TPYBoard v102 1塊
ws2812b RGB-Ring-8 1個
micro USB數據線 1條
杜邦線 若干
三、WS2812B的介紹
WS2812B是一個集控制電路與發光電路于一體的智能外控LED光源。 其外型與一個5050LED燈珠相同, 每個元件即為一個像素點。像素點內部包含了智能數字接口數據鎖存信號整形放大驅動電路, 還包含有高精度的內部振蕩器和可編程定電流控制部分, 有效保證了像素點光的顏色高度一致。
數據協議采用單線歸零碼的通訊方式, 像素點在上電復位以后, DIN端接受從控制器傳輸過來的數據, 首先送過來的24bit數據被第一個像素點提取后, 送到像素點內部的數據鎖存器, 剩余的數據經過內部整形處理電路整形放大后通過DO端口開始轉發輸出給下一個級聯的像素點, 每經過一個像素點的傳輸, 信號減少24bit。像素點采用自動整形轉發技術, 使得該像素點的級聯個數不受信號傳送的限制, 僅僅受限信號傳輸速度要求。
實物圖
11.jpg (5.89 KB, 下載次數: 36)
下載附件
2018-6-11 15:31 上傳
上圖是8個燈珠的。
WS2812B的引腳說明:
1.png (5.79 KB, 下載次數: 48)
下載附件
2018-6-11 15:31 上傳
硬件連接
將TPYBoard v102與WS2812B的接線示意圖,如下:
2.png (5.76 KB, 下載次數: 30)
下載附件
2018-6-11 15:31 上傳
程序源碼如下:
- 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
|