•  找回密碼
     馬上注冊

    QQ登錄

    只需一步,快速開始

    搜索
    查看: 9090|回復: 0
    打印 上一主題 下一主題

    Adafruit NeoPixel 用戶指南之NeoMatrix

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2020-7-15 22:40:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    本文為自己整理翻譯的,原文為Adafruit官網上的指南
    Adafruit NeoPixel 用戶指南所有你一直想知道但又不敢問的關于Adafruit NeoPixels的事情


    NeoMatrix


    Adafruit_NeoMatrix庫構建在Adafruit_NeoPixel之上,使用NeoPixels創建二維圖形顯示。然后,您可以輕松地繪制形狀、文本和動畫,而不必計算每個X/Y像素的位置。小的NeoPixel材料可以之間在商店里買到。更大的顯示器可以使用 NeoPixel條帶組成(如圖所示,即為小的NeoPixel條帶所組成的)。


    除了Adafruit_NeoPixel庫(在前面的步驟中已經下載并安裝),NeoMatrix還需要兩個額外的庫:
    如果你以前使用過Adafruit LCD或OLED顯示器,你可能已經安裝了后者的庫。



    兩者的安裝類似于之前的Adafruit_NeoPixel:解壓縮后,確保文件夾名稱與其中的.cpp和.h文件匹配,然后移動到Arduino libraries文件夾并重新啟動IDE。


    如果使用較舊的(1.8.10之前的)Arduino IDE,還需要定位并安裝Adafruit_BusIO。


    Arduino sketches 需要包括所有三個頭文件,才能使用這個庫:
    • #include <Adafruit_GFX.h>
    • #include <Adafruit_NeoMatrix.h>
    • #include <Adafruit_NeoPixel.h>




    (Layouts)布局設計Adafruit_NeoMatrix使用與Adafruit_GFX庫完全相同的坐標系統、顏色函數和圖形命令。如果您是后者的新手,有一個單獨的教程解釋了它的用法。( a separate tutorial explains its use.)Adafruit_NeoMatrix庫中也包含了一些示例草圖。

    我們在這里只關注構造函數—是如何聲明 由NeoPixels構成的 二維顯示。為這個家伙供電則是另一回事,前面一頁已經介紹過了。


    該庫處理單一矩陣-所有 NeoPixels在一個統一的網格-平鋪矩陣-多個網格合并成一個更大的顯示器:

    讓我們從單個矩陣的聲明開始,因為它更容易解釋。在本例中,我們將演示Arduino的NeoPixel板——一個8x5的NeoPixels矩陣。當以可讀的方向查看這塊板子( shield,,不知道該咋翻譯)時,第一個像素#0位于左上角。每個連續的像素都在右一個位置——像素1直接在像素0的右邊,以此類推。在每一行的末尾,下一個像素位于下一行的最左端。這不是我們在代碼中決定的……而是 NeoPixels如何在包括 shield的電路板中實現硬連接/困難的連接( are hard-wired in)





    我們將這種布局稱為 row major progressive
    行主要是指像素以水平線排列(相反的,在垂直的線則成為列)。progressive意味著每一行都朝著同一個方向前進。
    (不過有些矩陣會在每一行上反轉方向,因為這樣更容易連接。我們稱之為之字形布局。)
    然而....例如,我們想去使用這個燈板in the “tall” direction,那么Arduino同時要與USB線也要放在桌子的頂端。但我們改變這個板子的方向,這個像素布局也會變化(沒看懂,強翻譯的)



    第一個像素在右上角。像素從上到下遞增——現在是以列為主。但是列的順序仍然是漸進的。 progressive
    我們這樣聲明矩陣:
    • Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(5, 8, 6,
    • NEO_MATRIX_TOP + NEO_MATRIX_RIGHT +
    • NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
    • NEO_GRB + NEO_KHZ800);
    前兩個參數—5和8—是矩陣的寬度和高度,以像素為單位。第三個參數- 6 -是新像素連接的pin號。在shield上,這是硬連線到數字pin 6,但獨立的矩陣是自由使用其他pin接口上。


    下一個參數很有趣。這表示矩陣中第一個像素的位置以及行或列的排列。
    第一個像素必須在四個角中的一個;
    在NEO_MATRIX_LEFT或NEO_MATRIX_RIGHT中添加NEO_MATRIX_TOP或NEO_MATRIX_BOTTOM表示哪個角。
    通過進一步向NEO_MATRIX_PROGRESSIVE或NEO_MATRIX_ZIGZAG添加NEO_MATRIX_COLUMNS或NEO_MATRIX_ROWS來指示行/列的排列。
    這些值都被添加以形成一個值,如上面的代碼所示。

    NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE


    最后一個參數與NeoPixel庫完全相同,表示使用的LED像素的類型。在最新的NeoPixel產品的大多數情況下,您沒有必要討論這個問題……示例代碼只是額外的描述。


    這個設置的目的是,其余的草圖不需要考慮矩陣的布局。無論第一個像素的實際位置如何,用于繪制圖形的坐標(0,0)總是在左上角。


    【  為什么不直接使用旋轉特性在Adafruit_GFX嗎?   】

    Adafruit_GFX只處理旋轉。雖然它可以處理我們上面的例子,但它沒有涵蓋特定   矩陣布局中可能發生的旋轉和鏡像的每一種排列,更不用說之字形的功能,或者下 面這個…

    Tiled Matrices一個平鋪矩陣由多個更小的NeoPixel 矩陣組成。這有時更容易裝配或分配電力。所有子矩陣的大小必須相同,并且必須以可預測的方式進行排序。然后Adafruit_NeoMatrix()的構造函數會接收到一些額外的參數:
    • Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
    • matrixWidth, matrixHeight, tilesX, tilesY, pin, matrixType, ledType);
    前兩個參數是每個平鋪子矩陣的寬度和高度(以像素為單位),而不是整個顯示器。
    接下來的兩個參數是水平方向和垂直方向的 tiles數量(子矩陣水平豎直方向的塊數)。那么整個顯示器的尺寸將總是子矩陣尺寸的倍數。


    第5個參數是pin號,與前面和NeoPixel庫相同。最后一個參數也遵循前面的行為,并且在大多數情況下可以省略。


    但倒數第二個參數……這有點復雜……


    對于單個矩陣,有一個起始角、一個主軸(行或列)和一個行序列(遞進或曲折)。現在這個值翻了一倍——每個獨立的子矩陣內的像素順序和整個顯示器需要類似的信息。在此之前,我們添加了一組符號來生成一個描述顯示格式的參數。


    NEO_MATRIX_*符號的工作方式與前面的單矩陣情況相同,現在指向整個顯示中的各個子矩陣。所有tile必須遵循相同的格式。另外一組符號的工作類似于描述tile的順序。


    第一塊子矩陣必須位于四個角中的一個。添加NEO_TILE_TOP或NEO_TILE_BOTTOM和NEO_TILE_LEFT或NEO_TILE_RIGHT以指示第一個子矩陣的位置。這與子矩陣中第一個像素的位置無關;它們可以是不同的角落。


    tile可以按水平行或垂直列排列。同樣,這與tile中的像素順序無關。添加NEO_TILE_ROWS或NEO_TILE_COLUMNS。


    最后, tiles的行或列可以按順序或之字形排列;;也就是說,每一行或每一列按照相同的順序運行,或者交替行/列切換方向。
    添加NEO_TILE_PROGRESSIVE或NEO_TILE_ZIGZAG來表示順序。
    但是…如果選擇了 NEO_TILE_ZIGZAG order(之字形順序),另外 tile的線必須旋轉180度。
    這是有意而為之的;它使矩陣與矩陣的布線更加一致和簡單。NEO_TILE_PROGRESSIVE不需要這種旋轉。

    矩陣塊不需要是方形的!以上只是一種可能的布局。在這一頁的頂部顯示的是三個10x8的矩陣塊,由NeoPixel條組裝而成。


    定義了矩陣之后,項目的其余部分類似于Adafruit_NeoPixel。
    記住在setup()函數中使用matrix.begin(),在繪制之后使用matrix.show()更新顯示。 setBrightness()函數也可用。該庫包括兩個示例,以供參考。


    Other Layouts

    對于任何其他不均勻平鋪的情況,您可以提供自己的函數來將X/Y坐標重新映射到NeoPixel strip索引。這個函數應該接受兩個無符號的16位參數(像素X, Y坐標)并返回一個無符號的16位值(對應的條帶索引)。最簡單的行主遞進函數可能是這樣的:


    • uint16_t myRemapFn(uint16_t x, uint16_t y) {
    • return WIDTH * y + x;
    • }




    這是一個粗略的例子。你的可能被設計成螺旋狀(簡單布線)的像素,或者希爾伯特曲線。


    然后使用setRemapFunction()啟用該函數:



    matrix.setRemapFunction(myRemapFn);


    RAM Again

    按像素計算,Adafruit_NeoMatrix并不比Adafruit_NeoPixel更需要內存,每個像素需要3個字節的內存。但二維顯示器的像素數量呈指數級增長……一個16x16的顯示器需要8x8顯示器的4倍內存,即大約768字節的RAM(幾乎是Arduino Uno可用空間的一半)。要將大型顯示器與需要大量內存的庫(如SD或ffft)結合起來,可能需要一些技巧,也可能是不可能的。


    Gamma Correction

    因為Adafruit_GFX庫最初是為lcd設計的(顏色保真度有限),所以它將顏色處理為16位值。(而不是NeoPixels能夠實現的24位)。這并不是看起來的巨大損失。由于人類視覺的缺陷,鮮艷的顏色不如暗淡的顏色容易辨認。Adafruit_NeoMatrix庫使用伽瑪校正(Gamma Correction
    )來選擇在視覺上(雖然不是數字上)等距的亮度等級。紅色和藍色有32個級別,綠色有64個級別。


    Color()函數執行必要的轉換;你不需要做任何數學運算。它接受8位的紅、綠、藍值,并返回經過伽瑪校正的16位顏色,然后可以將其傳遞給其他繪圖函數。

    分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
    收藏收藏 分享淘帖 支持支持 反對反對
    您需要登錄后才可以回帖 登錄 | 馬上注冊

    本版積分規則

    QQ|極客迷網 ( ICP09011854

    44030602000010

    © 2009-2016 All Rights Reserved

    GMT+8, 2021-6-10 00:02 , Processed in 0.152112 second(s), 14 queries , Gzip On, Memcache On.

    试看30秒- 视频 - 在线观看 - 影视资讯 - 理伦