<strike id="um4h1"></strike>
<legend id="um4h1"><pre id="um4h1"><dl id="um4h1"></dl></pre></legend>
<th id="um4h1"><track id="um4h1"></track></th>
  • <dd id="um4h1"></dd><nav id="um4h1"><sub id="um4h1"></sub></nav>
    <rp id="um4h1"></rp>

    <dd id="um4h1"></dd>
    1. <th id="um4h1"></th>
       找回密碼
       馬上注冊

      QQ登錄

      只需一步,快速開始

      搜索
      查看: 13191|回復: 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庫相同。最后一個參數也遵循前面的行為,并且在大多數情況下可以省略。


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


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


      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, 2022-4-15 03:40 , Processed in 0.072521 second(s), 14 queries , Gzip On, Memcache On.