4x4x4 LED RGB立方体,用于音乐可视化

在本文中,我们将讨论在RGB LED上组装4x4x4立方体的经验,以及将立方体用作声音可视化器所必需的软件开发。使用微控制器Arduino Uno。

图片


准备工作


立方体

在研究此类项目时,发现了由Asher Glick和Kevin Baker编写的名为“ Charliecube”实现值得注意的是,此选项与其他实现不同,它不提供用于构建多维数据集的计数器,移位寄存器或任何其他组件,以用于其后续编程,并且仅使用微控制器的16个输出(同时允许寻址64个LED)。此实现的核心是称为Charliplexing的LED显示器的设计。

Charliplexing

微控制器的数字输出具有三位逻辑:连接到电源,连接到“地”且未连接任何东西。如果需要点亮LED,则必须在X上加上“ +”,在“ Y”上加上“-”,仅在这种情况下,它会点亮。如果没有任何东西馈送至Y,则LED不会点亮。您可以在同名的Wikipedia文章中阅读有关该方法的更多信息,下面将具体说明本例中的工作。

图片

LED列布局

假设我们要以绿色点亮LED1。如果我们沿着蓝线,很明显,有必要在输入1上加上“ +”。在红线之后,我们知道我们需要对输入3加上“-”。没有其他输入。

可视化

决定所有音乐分析将在连接到多维数据集的PC上进行。主要思想是:PC分析录音通道,将声音转换为频率信息,并将音乐节奏数据传输到Arduino,此外,基于此信息的微控制器会突出显示某些LED。

由于该项目的作者在Ruby方面具有丰富的经验,因此我想在该项目的框架内使用这种编程语言。大卫·古特曼 David Guttman )发现一篇文章,其中描述了使用红宝石处理的宝石和Minim Java库在JRuby上进行声音可视化。找到的文章被用作编写可视化工具的基础。

组装方式


收集专栏

图片


在将LED连接到列之前,必须在四个LED中的每一个中弯曲腿,以使每个腿与90°相邻。

图片图片

然后,每个LED需要交替旋转90°(每个后续LED都应相对于前一个顺时针旋转90°)。以前,可以标记一条腿(我们用绿色清漆标记),以免引起混淆。

图片图片

我们将LED连接在一列中。连接LED后,我们修整支脚的突出端。

图片图片图片

图片 图片

我们放置列

其余15列以相同方式收集。

图片


这些列以彼此相同的距离放置在板上,从而形成一个侧面等于4个LED的立方体。所有立柱均应朝同一方向旋转(此处“支撑”腿的初步标记非常有用)。

图片 图片

图片 图片

我们将各列连接在一起

翻转结构并开始连接电线。共有16根电线,连接分4个阶段进行。

图片图片

图片图片

图片图片

图片图片

图片


它仍然可以连接到Arduino-您可以开始编程。

连接到Arduino

Charlikub的作者提供了cubeplex库,以便使用Arduino方便地进行多维数据集编程。为了不经修改即可使用该库,必须按以下顺序连接我们的电线(编号与上一节中图像中的电线相对应):

图片 图片

编程Arduino


基本功能

如上所述,作者使用charlieplex库,该库提供了drawLed()函数,该函数接受XYZ坐标中LED的颜色和位置。
用红色突出显示整个多维数据集
#include "cubeplex.h"

const int cubeSides = 4;

void setup() {
  initCube();
}

void loop() { 
  for (int xpos = 0; xpos < cubeSides; xpos++) {
    for (int ypos = 0; ypos < cubeSides; ypos++) {
      for (int zpos = 0; zpos < cubeSides; zpos++) {
          drawLed(red, xpos, ypos, zpos);
      }
    }
  }
}


PC通讯

消息传递是通过串行I / O到控制器连接到计算机的端口来实现的。在Arduino中通过SerialEvent实现此类事件的处理
使用用户输入自定义多维数据集突出显示
#include "cubeplex.h"

String inputString = "";         
boolean stringComplete = false;

//        SerialEvent,       inputString.
//     Enter,    inputComplete      loop().

int color = red;

void setup() {
  Serial.begin(9600);
  inputString.reserve(200);
  initCube();
}

void loop() {
  if (stringComplete) {
      Serial.println(inputString);
      drawString(inputString);
      resetBuffer();
      inputString = "";
      stringComplete = false;
    }
  }
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

//   ;       .
void resetBuffer() {
  flushBuffer();
  clearBuffer();
}

//      .
//   -     ,    .
//    "000001002003"     { x: 0, y: 0 }.

void drawString(String inputString) {
  int xpos = -1;
  int ypos = -1;
  int zpos = -1;

  for (int i = 0; inputString[i + 3]; i += 3) {
    xpos = charToInt(inputString[i]);
    ypos = charToInt(inputString[i + 1]);
    zpos = charToInt(inputString[i + 2]);

    drawLed(color, xpos, ypos, zpos);
  }
}

void charToInt(char value) {
  return (value - '0');
}


轻音乐编程

假定立方体将闪烁到音乐的节拍。因此,消息格式可以简化为一位。算法是这样的:音乐分析器“捕捉”到节拍后,多维数据集应完全点亮。之后,多维数据集将慢慢消失(逐层)。一旦分析仪捕获到下一小节,多维数据集将再次完全点亮。也就是说,将一个图形转移到多维数据集就足够了:此时需要突出显示几层。同样,在每次迭代中,我们将随机确定一种新颜色。
突出显示给定数量的层
void drawBeat(String inputString) {
  int height = charToInt(inputString[0]);
  int color = random(red, white);

  for (int xpos = 0; xpos < cubeSides; xpos++) {
    for (int ypos = 0; ypos < cubeSides; ypos++) {
      for (int zpos = 0; zpos < height; zpos++) {
          drawLed(color, xpos, ypos, zpos);
      }
    }
  }
}


JRuby的声音分析


Minim库集包括BeatDetect该类提供用于确定音乐节奏的工具。通常,使用此库可以非常简单地连接到声音接收通道并执行其频率分析。为了我们的目的,提出了确定节奏的频率方法。
该代码已在Ubuntu 15.10上进行了测试;作者使用JRuby版本是jruby 9.0.5.0。要运行脚本,必须安装Processing并连接Minim
节奏分析
require 'ruby-processing'

require_relative 'translator'
require_relative 'serial_writer'

class SoundProcessor < Processing::App
  load_library "minim"
  import "ddf.minim"
  import "ddf.minim.analysis"

  def setup
    @minim = Minim.new self
    @input = @minim.get_line_in
    @beat = BeatDetect.new @input.mix.size, 44100
    @beat_value = 0.001
    @beat.set_sensitivity 300
  end

  def draw
    process_beat
    SerialWriter.instance.write(Translator.instance.translate(@beat_value))
  end

  private

  def process_beat
    @beat.detect @input.mix
    @beat_value = @beat.is_kick ? 1 : @beat_value * 0.95
  end
end

SoundProcessor.new



工作示范




通过PulseAudio,为可视化器分配了音频输出作为音频输入,即 我们可以看到扬声器发出的所有声音。录制后,声音会叠加在视频上,并在创建电影时进行复制。

后记


我们设法将声音可视化程序与PC结合使用。将来,您可以改进确定节奏的算法(用于确定Minim库节奏的标准工具远非理想),并且有关频率的信息也可以输出到多维数据集。如您所见,多维数据集易于构建和编程。此外,它使用最少的组件。

参考文献:


作者
Makoed维克多和尤金貂,第三年学生BSUIR VMSiS

Source: https://habr.com/ru/post/zh-CN395475/


All Articles