找回密码
 马上注册

QQ登录

只需一步,快速开始

搜索
查看: 4046|回复: 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, 2020-10-27 03:05 , Processed in 0.079351 second(s), 14 queries , Gzip On, Memcache On.