Cubo 4x4x4 LED RGB para visualización de música

En este artículo, hablaremos sobre la experiencia de ensamblar un cubo 4x4x4 en LED RGB, así como el desarrollo del software necesario para usar el cubo como visualizador de sonido. Se utiliza el microcontrolador Arduino Uno.

imagen


Preparación


Cubo

Al investigar tales proyectos, Asher Glick y Kevin Baker descubrieron una implementación llamada "Charliecube" . Esta opción es notable porque, a diferencia de otras implementaciones, no proporciona la presencia de contadores, registros de desplazamiento o cualquier otro componente para construir el cubo con el propósito de su programación posterior y usa solo 16 salidas del microcontrolador (al tiempo que permite direccionar 64 LED). En el corazón de esta implementación está el diseño de la pantalla LED llamada Charliplexing.

Charliplexing

Las salidas digitales de los microcontroladores tienen una lógica de tres dígitos: conectado a la alimentación, conectado a la "tierra" y no conectado a nada. Si necesitamos encender el LED, es necesario aplicar “+” a X y “-” a “Y”, solo en este caso se iluminará. Si nada se alimenta a Y, el LED no se enciende. Se pueden encontrar más detalles sobre el método en el artículo de Wikipedia del mismo nombre , la descripción del trabajo específicamente en nuestro caso se da a continuación.

imagen

Diseño de columna LED

Supongamos que queremos iluminar el LED1 en verde. Si seguimos a lo largo de la línea azul, está claro que es necesario aplicar "+" a la entrada 1. Habiendo seguido la línea roja, entendemos que debemos aplicar "-" a la entrada 3. Nada se alimenta a las otras entradas.

Visualización

Se decidió que todo el análisis de música se realizaría en una PC conectada al cubo. La idea principal: la PC analiza el canal de grabación de sonido, convierte el sonido en información de frecuencia y transfiere los datos del ritmo de la música al Arduino. Además, el microcontrolador basado en esta información resalta ciertos LED.

Como los autores del proyecto tienen una amplia experiencia con Ruby, me gustaría recurrir a este lenguaje de programación en el marco del proyecto. Se descubrió un artículo de David Guttman que describe la visualización del sonido en JRuby utilizando la gema de procesamiento de rubíes y la biblioteca Minim Java. El artículo encontrado fue tomado como base para escribir un visualizador.

Asamblea


Recoge la columna

imagen


Antes de conectar los LED a la columna, es necesario doblar las patas en cada uno de los cuatro LED para que cada pata quede 90 ° adyacente.

imagenimagen

Luego, cada uno de los LED debe rotarse 90 ° a su vez (cada uno de ellos debe rotarse 90 ° en sentido horario con respecto al anterior). Anteriormente, una de las patas se puede marcar (la tenemos marcada con barniz verde) para no confundirnos.

imagenimagen

Conectamos nuestros LED en una columna. Después de conectar los LED, recortamos los extremos sobresalientes de las patas.

imagenimagenimagen

imagen imagen

Colocamos las columnas

Las 15 columnas restantes se recopilan de la misma manera.

imagen


Las columnas se colocan en el tablero a la misma distancia entre sí, formando así un cubo con un lado igual a 4 LED. Todos los postes deben girarse en la misma dirección (aquí es muy útil el marcado preliminar de la pata de "apoyo").

imagen imagen

imagen imagen

Conectamos las columnas juntas

Dé la vuelta a la estructura y comience a conectar los cables. Hay 16 cables en total, la conexión se realizó en 4 etapas.

imagenimagen

imagenimagen

imagenimagen

imagenimagen

imagen


Queda por conectarse al Arduino, y puede comenzar a programar.

Conectar a Arduino

Los autores de Charlikub han proporcionado la biblioteca cubeplex para una conveniente programación de cubos con Arduino. Para que esta biblioteca se use sin modificaciones, es necesario conectar nuestros cables en el siguiente orden (la numeración corresponde a los cables en las imágenes de la sección anterior):

imagen imagen

Programando Arduino


Funcionalidad básica

Como se mencionó anteriormente, los autores utilizaron la biblioteca charlieplex, que proporciona una función drawLed () que acepta el color y la posición del LED en coordenadas XYZ.
Resalta todo el cubo en rojo
#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);
      }
    }
  }
}


Mensajes de PC

La mensajería se implementa a través de E / S serie al puerto a través del cual el controlador se conecta a la máquina. El trabajo con tales eventos se implementa en Arduino a través de SerialEvent .
Resaltado de cubos personalizado con entrada del usuario
#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');
}


Programación para música ligera.

Se supone que el cubo parpadeará al ritmo de la música. En consecuencia, el formato del mensaje se puede simplificar a un dígito. El algoritmo es el siguiente: tan pronto como el analizador de música "capte" el ritmo, el cubo se iluminará por completo. Después de eso, el cubo saldrá lentamente (capa por capa). Tan pronto como el analizador alcanza la siguiente medida, el cubo se enciende nuevamente por completo. Es decir, es suficiente transferir una figura al cubo: cuántas capas se deben resaltar en este momento. Además, en cada iteración, determinaremos aleatoriamente un nuevo color.
Resalta un número dado de capas
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álisis de sonido en JRuby


El conjunto de la biblioteca Minim incluye la clase BeatDetect , que proporciona herramientas para determinar el ritmo de la música. En general, el uso de esta biblioteca es extremadamente simple para conectarse al canal receptor de sonido y realizar su análisis de frecuencia. Para nuestros propósitos, surgió el método de frecuencia para determinar el ritmo.
El código fue probado en Ubuntu 15.10; La versión de JRuby utilizada por los autores es jruby 9.0.5.0. Para ejecutar el script, debe instalar Processing y conectar la biblioteca Minim .
Análisis 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



Demostración de trabajo




Por medio de PulseAudio, al visualizador se le asignó una salida de audio como entrada de audio, es decir. Obtenemos una visualización de todo el sonido que proviene de los altavoces. Después de la grabación, el sonido se superpuso en el video, que se reprodujo en el momento en que se creó la película.

Epílogo


Logramos obtener un visualizador de sonido junto con una PC. En el futuro, puede mejorar el algoritmo para determinar el ritmo (las herramientas estándar para determinar el ritmo de la biblioteca Minim están lejos de ser ideales), y la información sobre las frecuencias también se puede enviar al cubo. Como puede ver, un cubo es fácil de construir y programar; Además, utiliza un mínimo de componentes.

Referencias


Autores
Makoed Victor y Eugene Kunitsa, estudiantes de tercer año de las Fuerzas Navales BSUiR

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


All Articles