Cubo RGB LED 4x4x4 para visualização de música

Neste artigo, falaremos sobre a experiência de montar um cubo 4x4x4 em LEDs RGB, bem como o desenvolvimento de software necessário para usar o cubo como visualizador de som. O microcontrolador Arduino Uno é usado.

imagem


Preparação


Cubo

Ao pesquisar esses projetos, uma implementação chamada “Charliecube” foi descoberta por Asher Glick e Kevin Baker. Essa opção é digna de nota, pois, diferentemente de outras implementações, ela não fornece a presença de contadores, registradores de turnos ou quaisquer outros componentes para a construção do cubo com a finalidade de sua programação subseqüente e usa apenas 16 saídas do microcontrolador (enquanto permite endereçar 64 LEDs). No centro desta implementação está o design do display LED chamado Charliplexing.

Charliplexing

As saídas digitais dos microcontroladores têm uma lógica de três dígitos: conectadas à energia, conectadas ao “terra” e não conectadas a nada. Se precisarmos acender o LED, é necessário aplicar “+” a X e “-” a “Y”, apenas neste caso acenderá. Se nada for alimentado para Y, o LED não acenderá. Mais detalhes sobre o método podem ser encontrados no artigo da Wikipedia com o mesmo nome , a descrição do trabalho especificamente em nosso caso é fornecida abaixo.

imagem

Layout da coluna do LED

Suponha que queremos acender o LED1 em verde. Se seguirmos a linha azul, fica claro que é necessário aplicar “+” na entrada 1. Depois de seguir a linha vermelha, entendemos que precisamos aplicar “-” na entrada 3. Nada é alimentado nas outras entradas.

Visualização

Foi decidido que todas as análises musicais seriam feitas em um PC conectado ao cubo. A idéia principal: o PC analisa o canal de gravação de som, converte o som em informações de frequência e transfere os dados do ritmo da música para o Arduino.Além disso, o microcontrolador com base nessas informações destaca alguns LEDs.

Como os autores do projeto têm uma vasta experiência com Ruby, eu gostaria de recorrer a essa linguagem de programação dentro da estrutura do projeto. Um artigo de David Guttman foi descoberto descrevendo a visualização do som no JRuby usando a gema de processamento de rubi e a biblioteca java Minim. O artigo encontrado foi tomado como base para escrever um visualizador.

Assembléia


Colete a coluna

imagem


Antes de conectar os LEDs à coluna, em cada um dos quatro LEDs é necessário dobrar as pernas para que cada perna fique 90 ° adjacente.

imagemimagem

Em seguida, cada um dos LEDs precisa ser girado 90 ° alternadamente (cada um subsequente deve ser girado 90 ° no sentido horário em relação ao anterior). Anteriormente, uma das pernas pode ser marcada (temos marcado com verniz verde) para não confundir.

imagemimagem

Conectamos nossos LEDs em uma coluna. Depois de conectar os LEDs, cortamos as extremidades salientes das pernas.

imagemimagemimagem

imagem imagem

Colocamos as colunas

As 15 colunas restantes são coletadas da mesma maneira.

imagem


As colunas são colocadas na placa à mesma distância uma da outra, formando um cubo com um lado igual a 4 LEDs. Todos os postes devem ser girados na mesma direção (a marcação preliminar da perna “de apoio” é muito útil aqui).

imagem imagem

imagem imagem

Nós conectamos as colunas

Vire a estrutura e comece a conectar os fios. Existem 16 fios no total, a conexão foi realizada em 4 etapas.

imagemimagem

imagemimagem

imagemimagem

imagemimagem

imagem


Resta conectar-se ao Arduino - e você pode começar a programar.

Conectar ao Arduino

Os autores do Charlikub forneceram a biblioteca cubeplex para uma programação conveniente de cubos com o Arduino. Para que esta biblioteca seja usada sem modificações, é necessário conectar nossos fios na seguinte ordem (a numeração corresponde aos fios nas imagens da seção anterior):

imagem imagem

Programação Arduino


Funcionalidade básica

Como mencionado acima, os autores usaram a biblioteca charlieplex, que fornece uma função drawLed () que aceita a cor e a posição do LED nas coordenadas XYZ.
Destaque o cubo inteiro em vermelho
#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);
      }
    }
  }
}


Mensagens no PC

O sistema de mensagens é implementado por meio de E / S serial na porta pela qual o controlador se conecta à máquina. O trabalho com esses eventos é implementado no Arduino através do SerialEvent .
Destaque de cubo personalizado com entrada do usuário
#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');
}


Programação para música leve

Supõe-se que o cubo irá piscar ao ritmo da música. Consequentemente, o formato da mensagem pode ser simplificado para um dígito. O algoritmo é o seguinte: assim que o analisador de música "pegar" a batida, o cubo deve acender completamente. Depois disso, o cubo sairá lentamente (camada por camada). Assim que o analisador captura a próxima medida, o cubo acende novamente completamente. Ou seja, basta transferir uma figura para o cubo: quantas camadas precisam ser destacadas no momento. Além disso, a cada iteração, determinaremos aleatoriamente uma nova cor.
Destacar um determinado número de camadas
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);
      }
    }
  }
}


Análise de Som no JRuby


O conjunto de bibliotecas Minim inclui a classe BeatDetect , que fornece ferramentas para determinar o ritmo da música. Em geral, usando esta biblioteca é extremamente simples conectar-se ao canal de recebimento de som e realizar sua análise de frequência. Para nossos propósitos, surgiu o método de frequência para determinar o ritmo.
O código foi testado no Ubuntu 15.10; A versão do JRuby usada pelos autores é o jruby 9.0.5.0. Para executar o script, você deve instalar o Processing e conectar a biblioteca Minim .
Análise de ritmo
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



Demonstração de trabalho




Por meio do PulseAudio, o visualizador recebeu uma saída de áudio como entrada de áudio, ou seja, temos uma visualização de todo o som que sai dos alto-falantes. Após a gravação, o som foi sobreposto ao vídeo, que foi reproduzido no momento em que o filme foi criado.

Posfácio


Conseguimos obter um visualizador de som em conjunto com um PC. No futuro, você poderá aprimorar o algoritmo para determinar o ritmo (as ferramentas padrão para determinar o ritmo da biblioteca Minim estão longe do ideal), e as informações sobre frequências também podem ser enviadas para o cubo. Como você pode ver, um cubo é simples de construir e programar; Além disso, ele usa um mínimo de componentes.

Referências:


Autores
Makoed Victor e Eugene Kunitsa, alunos do 3º ano das Forças Navais da BSUiR

Source: https://habr.com/ru/post/pt395475/


All Articles