寻找不需要数组的酷LED图形例程

时间:2013-04-04 12:29:11

标签: graphics arduino

我使用Arduino,移位寄存器和TLC5940s制作了一个24 x 15 LED矩阵。

Arduino Uno有一个32 KB的内存,因此图形不会预先存储到数组中。相反,我使用数学方程式编写算法来生成艺术动画。

彩虹正弦波的示例代码是:

for (int iterations = 0; iterations < times; iterations++)
{
    val += PI/500;

    for (int col = 0; col < NUM_COLS; col++)
    {
        digitalWrite(layerLatchPin, LOW);
        shiftOut(layerDataPin, layerClockPin, MSBFIRST, colMasks[col] >> 16 );
        shiftOut(layerDataPin, layerClockPin, MSBFIRST, colMasks[col] >> 8 );
        shiftOut(layerDataPin, layerClockPin, MSBFIRST, colMasks[col] );
        digitalWrite(layerLatchPin, HIGH);

        Tlc.clear();
        int rainbow1 = 7 + 7*sin(2*PI*col/NUM_COLS_TOTAL + val);
        setRainbowSinkValue(rainbow1, k);
        Tlc.update();
    }
}

setRainbowSinkValue将LEDS中的一个从1到15设置为某种颜色,val每次迭代都将波移动到右侧。

所以我正在寻找这样的简单图形例程,以便获得很酷的动画,而不必将所有内容存储在数组中,因为15 x 24 x RGB快速耗尽所有32 KB的RAM。

我会尝试获得一个Arduino Mega,但让我们假设这不是现在的选择。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

如果你开始覆盖像sin或cos这样的简单函数,你可以获得很多效果。 This guy创造了“等离子”效应,我认为这种效果总是值得关注:)

另一种方法是使用噪声函数来计算像素的颜色。如果你谷歌搜索“Arduino Perlin噪音”你会得到很多例子(取决于你的Arduino模型,你可能无法获得高帧率,因为Perlin噪音需要一些CPU功率)。

答案 1 :(得分:2)

我一直在与Arduino一起从事类似的图形样式项目,并考虑过各种策略来处理有限的事情。我个人认为算法动画相当平庸和通用,除非它们与其他东西结合或以某种方式指导。

无论如何,我一直致力于这两种方法:

  • 定义自定义格式以将数据打包为位然后使用位移来解压缩

  • 在PROGMEM中存储简单的SVG图形,然后使用精灵技术在屏幕上移动它们(屏幕环绕等)。通过使用布尔运算将多个图形合并在一起,可以获得动画图层效果并增加复杂性/多样性。

我只使用单色LED,因此在概念和数据方面都更简单。

答案 2 :(得分:1)

一个很好的问题,但由于平台的性质,你可能不会找到任何东西。

你有一般想法使用算法来产生效果,所以你应该继续编写更多疯狂的函数。

您可以打包功能并将其提供给所有人。

此外,如果您允许,请使用串行端口与拥有更多资源的主机进行通信,并提供无穷无尽的模式流。

使用发射器和接收器也可用于连接另一台计算机。

答案 3 :(得分:1)

我会回答相关问题,但不完全是您提出的问题,因为我不是图形专家....

首先,不要忘记PROGMEM,它允许您将数据存储在闪存中。闪存比SRAM多得多,事实上通常要做的是将额外的数据存储在闪存中。

其次,有一些可用的压缩技术可以减少你的内存消耗。而这些“压缩”技术对于你正在进行的任务来说是很自然的,所以“压缩”这个词有点误导。

首先,我们观察到,因为人类对光强度的感知是指数级的(在这个主题上与我自己answer的无耻链接),取决于你如何使用LED驱动器,你不需要存储精确的强度。看起来你在TLC5940上只使用8位强度,而不是满12.对于8位LED驱动强度,你只有8或9个不同的强度值(因为你告诉LED驱动使用的强度是{{ 1}})。 8个不同的值只能存储在3位中。以字节为单位存储三位块可能会有点麻烦,但您仍然可以将数组中的每个“像素”视为2^perceptible_intensity,但存储整个颜色信息。因此,您将内存消耗降低到原来的2/3。此外,您可以只调整图像:每个像素都是一个字节(uint16_t),并为调色板中的一个位置编制索引,如果您愿意,可以是三个字节。调色板不需要很大,事实上,您根本不需要调色板,这意味着在代码中有一个调色板:您的代码知道如何将字节转换为一组强度。然后,在将它们移出之前,生成TLC5940所需的实际强度值。