標題: MicroPython實例之TPYBoard v102炫彩跑馬燈WS2812B [打印本頁]

作者: bodasister    時間: 2018-6-11 15:32
標題: MicroPython實例之TPYBoard v102炫彩跑馬燈WS2812B
    一、實驗目的

    了解ws2812b的工作原理
    學習ws2812b的驅(qū)動方法

    二、實驗器材

    TPYBoard v102 1塊
    ws2812b RGB-Ring-8 1個
    micro USB數(shù)據(jù)線 1條
    杜邦線 若干

    三、WS2812B的介紹

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

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

    實物圖
   

    上圖是8個燈珠的。
    WS2812B的引腳說明:


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


    程序源碼如下:
  1. import   pyb
  2. import   math
  3.   
  4. from   ws2812 import WS2812
  5.   
  6.   
  7. ring   = WS2812(spi_bus=1, led_count=8, intensity=0.1)
  8.   
  9.   
  10. def   data_generator(led_count):
  11.     data = [(0, 0, 0) for i in   range(led_count)]
  12.     step = 0
  13.     while True:
  14.         red = int((1 + math.sin(step *   0.1324)) * 127)
  15.         green = int((1 + math.sin(step *   0.1654)) * 127)
  16.         blue = int((1 + math.sin(step * 0.1))   * 127)
  17.         data[step % led_count] = (red, green,   blue)
  18.         yield data
  19.         step += 1
  20.   
  21.   
  22. for   data in data_generator(ring.led_count):
  23.     ring.show(data)
  24.     pyb.delay(100)
復制代碼




    里面還需要引入一個ws2812.py 文件。內(nèi)容如下:
  1. import   gc
  2. import   pyb
  3.   
  4.   
  5. class   WS2812:
  6.     """
  7.     Driver for WS2812 RGB LEDs. May be used   for controlling single LED or chain
  8.     of LEDs.
  9.   
  10.     Example of use:
  11.   
  12.         chain = WS2812(spi_bus=1,   led_count=4)
  13.         data = [
  14.             (255, 0, 0),    # red
  15.             (0, 255, 0),    # green
  16.             (0, 0, 255),    # blue
  17.             (85, 85, 85),   # white
  18.         ]
  19.         chain.show(data)
  20.   
  21.     Version: 1.0
  22.     """
  23.     buf_bytes = (0x11, 0x13, 0x31, 0x33)
  24.   
  25.     def __init__(self, spi_bus=1,   led_count=1, intensity=1):
  26.         """
  27.         Params:
  28.         * spi_bus = SPI bus ID (1 or 2)
  29.         * led_count = count of LEDs
  30.         * intensity = light intensity (float   up to 1)
  31.         """
  32.         self.led_count = led_count
  33.         self.intensity = intensity
  34.   
  35.         # prepare SPI data buffer (4 bytes   for each color)
  36.         self.buf_length = self.led_count * 3   * 4
  37.         self.buf = bytearray(self.buf_length)
  38.   
  39.         # SPI init
  40.         self.spi = pyb.SPI(spi_bus,   pyb.SPI.MASTER, baudrate=3200000, polarity=0, phase=1)
  41.   
  42.         # turn LEDs off
  43.         self.show([])
  44.   
  45.     def show(self, data):
  46.         """
  47.         Show RGB data on LEDs. Expected data   = [(R, G, B), ...] where R, G and B
  48.         are intensities of colors in range   from 0 to 255. One RGB tuple for each
  49.         LED. Count of tuples may be less than   count of connected LEDs.
  50.         """
  51.         self.fill_buf(data)
  52.         self.send_buf()
  53.   
  54.     def send_buf(self):
  55.         """
  56.         Send buffer over SPI.
  57.         """
  58.         self.spi.send(self.buf)
  59.         gc.collect()
  60.   
  61.     def update_buf(self, data, start=0):
  62.         """
  63.         Fill a part of the buffer with RGB   data.
  64.   
  65.         Order of colors in buffer is changed   from RGB to GRB because WS2812 LED
  66.         has GRB order of colors. Each color   is represented by 4 bytes in buffer
  67.         (1 byte for each 2 bits).
  68.   
  69.         Returns the index of the first unfilled   LED
  70.   
  71.         Note: If you find this function ugly,   it's because speed optimisations
  72.         beated purity of code.
  73.         """
  74.   
  75.         buf = self.buf
  76.         buf_bytes = self.buf_bytes
  77.         intensity = self.intensity
  78.   
  79.         mask = 0x03
  80.         index = start * 12
  81.         for red, green, blue in data:
  82.             red = int(red * intensity)
  83.             green = int(green * intensity)
  84.             blue = int(blue * intensity)
  85.   
  86.             buf[index] = buf_bytes[green   >> 6 & mask]
  87.             buf[index+1] = buf_bytes[green   >> 4 & mask]
  88.             buf[index+2] = buf_bytes[green   >> 2 & mask]
  89.             buf[index+3] = buf_bytes[green   & mask]
  90.   
  91.             buf[index+4] = buf_bytes[red   >> 6 & mask]
  92.             buf[index+5] = buf_bytes[red   >> 4 & mask]
  93.             buf[index+6] = buf_bytes[red   >> 2 & mask]
  94.             buf[index+7] = buf_bytes[red   & mask]
  95.   
  96.             buf[index+8] = buf_bytes[blue   >> 6 & mask]
  97.             buf[index+9] = buf_bytes[blue   >> 4 & mask]
  98.             buf[index+10] = buf_bytes[blue   >> 2 & mask]
  99.             buf[index+11] = buf_bytes[blue   & mask]
  100.   
  101.             index += 12
  102.   
  103.         return index // 12
  104.   
  105.     def fill_buf(self, data):
  106.         """
  107.         Fill buffer with RGB data.
  108.   
  109.         All LEDs after the data are turned   off.
  110.         """
  111.         end = self.update_buf(data)
  112.   
  113.         # turn off the rest of the LEDs
  114.         buf = self.buf
  115.         off = self.buf_bytes[0]
  116.         for index in range(end * 12,   self.buf_length):
  117.             buf[index] = off
  118.             index += 1
復制代碼




    本次參考的github上的一個項目。項目地址:
    https://github.com/JanBednarik/micropython-ws2812
    給大家看一下效果(額 最后一個燈珠壞了 大家可以自行忽略……)
    https://v.qq.com/x/page/d05297wxo1b.html






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1