欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: MicroPython實(shí)例之TPYBoard v102炫彩跑馬燈WS2812B [打印本頁(yè)]

作者: bodasister    時(shí)間: 2018-6-11 15:32
標(biāo)題: MicroPython實(shí)例之TPYBoard v102炫彩跑馬燈WS2812B
    一、實(shí)驗(yàn)?zāi)康?br />
    了解ws2812b的工作原理
    學(xué)習(xí)ws2812b的驅(qū)動(dòng)方法

    二、實(shí)驗(yàn)器材

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

    三、WS2812B的介紹

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

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

    實(shí)物圖
   

    上圖是8個(gè)燈珠的。
    WS2812B的引腳說(shuō)明:


    硬件連接
    將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)
復(fù)制代碼




    里面還需要引入一個(gè)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
復(fù)制代碼




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






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