4x4x4 LED RGB Würfel zur Musikvisualisierung

In diesem Artikel werden wir über die Erfahrungen beim Zusammenbau eines 4x4x4-Würfels auf RGB-LEDs sowie über die Entwicklung von Software sprechen, die erforderlich ist, um den Würfel als Visualisierer für Klang zu verwenden. Der Mikrocontroller Arduino Uno wird verwendet.

Bild


Vorbereitung


Würfel

Bei der Untersuchung solcher Projekte wurde eine Implementierung namens „Charliecube“ entdeckt, die von Asher Glick und Kevin Baker verfasst wurde. Diese Option ist insofern bemerkenswert, als sie im Gegensatz zu anderen Implementierungen keine Zähler, Schieberegister oder andere Komponenten zum Aufbau des Würfels zum Zweck seiner nachfolgenden Programmierung vorsieht und nur 16 Ausgänge des Mikrocontrollers verwendet (wobei 64 LEDs adressiert werden können). Im Zentrum dieser Implementierung steht das Design der LED-Anzeige Charliplexing.

Charliplexing

Die digitalen Ausgänge der Mikrocontroller haben eine dreistellige Logik: an die Stromversorgung angeschlossen, an die „Masse“ angeschlossen und an nichts angeschlossen. Wenn wir die LED anzünden müssen, müssen Sie "+" auf X und "-" auf "Y" anwenden. Nur in diesem Fall leuchtet sie auf. Wenn Y nichts zugeführt wird, leuchtet die LED nicht auf. Weitere Informationen zur Methode finden Sie in einem gleichnamigen Wikipedia-Artikel. Die Beschreibung der Arbeit speziell in unserem Fall finden Sie weiter unten.

Bild

LED-

Spaltenlayout Angenommen, wir möchten LED1 grün leuchten lassen. Wenn wir der blauen Linie folgen, ist es klar, dass es notwendig ist, "+" auf Eingang 1 anzuwenden. Nachdem wir der roten Linie gefolgt sind, verstehen wir, dass wir "-" auf Eingang 3 anwenden müssen. Den anderen Eingängen wird nichts zugeführt.

Visualisierung

Es wurde beschlossen, die gesamte Musikanalyse auf einem mit dem Cube verbundenen PC durchzuführen. Die Hauptidee: Der PC analysiert den Tonaufzeichnungskanal, wandelt den Ton in Frequenzinformationen um und überträgt die Musikrhythmusdaten an das Arduino. Außerdem hebt der auf diesen Informationen basierende Mikrocontroller bestimmte LEDs hervor.

Da die Autoren des Projekts über umfangreiche Erfahrungen mit Ruby verfügen, möchte ich im Rahmen des Projekts auf diese Programmiersprache zurückgreifen. Es wurde ein Artikel von David Guttman entdeckt , der die Visualisierung von Sound auf JRuby mit dem Rubin-Verarbeitungsjuwel und der Minim-Java-Bibliothek beschreibt. Der gefundene Artikel wurde als Grundlage für das Schreiben eines Visualisierers verwendet.

Montage


Sammle die Spalte

Bild


Vor dem Anschließen der LEDs an die Säule muss bei jeder der vier LEDs die Beine so gebogen werden, dass jedes Bein um 90 ° benachbart ist.

BildBild

Dann muss jede der LEDs der Reihe nach um 90 ° gedreht werden (jede nachfolgende LED sollte relativ zur vorherigen um 90 ° im Uhrzeigersinn gedreht werden). Zuvor konnte eines der Beine markiert werden (wir haben es mit grünem Lack markiert), um nicht verwirrt zu werden.

BildBild

Wir verbinden unsere LEDs in einer Spalte. Nach dem Anschließen der LEDs schneiden wir die hervorstehenden Enden der Beine ab.

BildBildBild

Bild Bild

Wir platzieren die Spalten

Die verbleibenden 15 Spalten werden auf die gleiche Weise gesammelt.

Bild


Die Säulen werden im gleichen Abstand voneinander auf der Platine platziert und bilden so einen Würfel mit einer Seite von 4 LEDs. Alle Pfosten sollten in die gleiche Richtung gedreht werden (eine vorläufige Markierung des „Stützbeins“ ist hier sehr nützlich).

Bild Bild

Bild Bild

Wir verbinden die Säulen miteinander

Drehen Sie die Struktur um und beginnen Sie, die Drähte anzuschließen. Insgesamt gibt es 16 Drähte, die Verbindung wurde in 4 Stufen durchgeführt.

BildBild

BildBild

BildBild

BildBild

Bild


Es bleibt eine Verbindung zum Arduino - und Sie können mit der Programmierung beginnen.

Stellen Sie eine Verbindung zu Arduino her

Charlikub-Autoren haben die Cubeplex-Bibliothek für die bequeme Cube-Programmierung mit dem Arduino bereitgestellt. Damit diese Bibliothek ohne Änderungen verwendet werden kann, müssen unsere Drähte in der folgenden Reihenfolge angeschlossen werden (die Nummerierung entspricht den Drähten in den Bildern aus dem vorherigen Abschnitt):

Bild Bild

Arduino programmieren


Grundfunktionalität

Wie oben erwähnt, verwendeten die Autoren die Charlieplex-Bibliothek, die eine drawLed () -Funktion bereitstellt, die die Farbe und Position der LED in XYZ-Koordinaten akzeptiert.
Markieren Sie den gesamten Würfel rot
#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-Nachrichten

Messaging wird über serielle E / A an den Port implementiert, über den die Steuerung eine Verbindung zum Computer herstellt. Die Arbeit mit solchen Ereignissen wird in Arduino über SerialEvent implementiert .
Benutzerdefinierte Cube-Hervorhebung mit Benutzereingaben
#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');
}


Programmierung für Unterhaltungsmusik

Es wird angenommen, dass der Würfel im Takt der Musik blinkt. Dementsprechend kann das Nachrichtenformat auf eine Ziffer vereinfacht werden. Der Algorithmus lautet wie folgt: Sobald der Musikanalysator den Beat "fängt", sollte der Würfel vollständig aufleuchten. Danach geht der Würfel langsam aus (Schicht für Schicht). Sobald der Analysator die nächste Messung erfasst, leuchtet der Würfel wieder vollständig auf. Das heißt, es reicht aus, eine Figur auf den Würfel zu übertragen: Wie viele Ebenen müssen momentan hervorgehoben werden? Außerdem bestimmen wir bei jeder Iteration zufällig eine neue Farbe.
Markieren Sie eine bestimmte Anzahl von Ebenen
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);
      }
    }
  }
}


Klanganalyse auf JRuby


Das Minim-Bibliotheksset enthält die BeatDetect- Klasse , die Tools zum Bestimmen des Musikrhythmus bereitstellt. Im Allgemeinen ist es mit dieser Bibliothek äußerst einfach, eine Verbindung zum Tonempfangskanal herzustellen und dessen Frequenzanalyse durchzuführen. Für unsere Zwecke wurde die Frequenzmethode zur Bestimmung des Rhythmus entwickelt.
Der Code wurde unter Ubuntu 15.10 getestet. Version der JRuby , vom Autor selbst benutzt - jruby 9.0.5.0. Um das Skript auszuführen, müssen Sie Processing installieren und die Minim- Bibliothek verbinden .
Rhythmusanalyse
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



Arbeitsdemonstration




Mittels PulseAudio wurde dem Visualisierer ein Audioausgang als Audioeingang zugewiesen, d.h. Wir erhalten eine Visualisierung aller Geräusche, die aus den Lautsprechern kommen. Nach der Aufnahme wurde der Ton dem Video überlagert, das zum Zeitpunkt der Erstellung des Films wiedergegeben wurde.

Nachwort


Wir haben es geschafft, einen Sound Visualizer in Verbindung mit einem PC zu bekommen. In Zukunft können Sie den Algorithmus zur Bestimmung des Rhythmus verbessern (Standardwerkzeuge zur Bestimmung des Rhythmus der Minim-Bibliothek sind alles andere als ideal), und Informationen zu Frequenzen können auch in den Cube ausgegeben werden. Wie Sie sehen können, ist ein Würfel einfach zu erstellen und zu programmieren. Darüber hinaus werden nur wenige Komponenten verwendet.

Referenzen:


Die Autoren
Makoed Victor und Eugene Kunitsa, Studenten der BSUiR Naval Forces im 3. Jahr

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


All Articles