Cube RVB LED 4x4x4 pour la visualisation musicale

Dans cet article, nous parlerons de l'expérience de l'assemblage d'un cube 4x4x4 sur des LED RGB, ainsi que du développement du logiciel nécessaire pour utiliser le cube comme visualiseur de son. Le microcontrôleur Arduino Uno est utilisé.

image


La préparation


Cube

Lors de la recherche de tels projets, une implémentation appelée «Charliecube» a été découverte, créée par Asher Glick et Kevin Baker. Cette option est remarquable en ce que, contrairement à d'autres implémentations, elle ne prévoit pas la présence de compteurs, de registres à décalage ou de tout autre composant pour construire le cube à des fins de programmation ultérieure et n'utilise que 16 sorties du microcontrôleur (tout en permettant d'adresser 64 LED). Au cœur de cette implémentation se trouve la conception de l'écran LED appelé Charliplexing.

Charliplexing

Les sorties numériques des microcontrôleurs ont une logique à trois chiffres: connectées à l'alimentation, connectées à la "masse" et non connectées à quoi que ce soit. Si nous devons allumer la LED, il faut appliquer «+» à X et «-» à «Y», seulement dans ce cas, elle s'allumera. Si rien n'est envoyé à Y, la LED ne s'allume pas. Plus de détails sur la méthode peuvent être trouvés dans l'article Wikipédia du même nom , la description du travail spécifiquement dans notre cas est donnée ci-dessous.

image

Disposition des colonnes LED

Supposons que nous voulons allumer LED1 en vert. Si vous suivez la ligne bleue, il est clair qu'il faut appliquer "+" à l'entrée 1. Après avoir suivi la ligne rouge, nous comprenons que nous devons appliquer "-" à l'entrée 3. Rien n'est envoyé aux autres entrées.

Visualisation

Il a été décidé que toutes les analyses musicales seraient effectuées sur un PC connecté au cube. L'idée principale: le PC analyse le canal d'enregistrement sonore, convertit le son en informations de fréquence et transfère les données de rythme musical à l'Arduino.En outre, le microcontrôleur basé sur ces informations met en évidence certaines LED.

Les auteurs du projet ayant une grande expérience avec Ruby, je voudrais recourir à ce langage de programmation dans le cadre du projet. Un article de David Guttman a été découvert décrivant la visualisation du son sur JRuby à l'aide de la gemme de traitement de rubis et de la bibliothèque java Minim. L'article trouvé a été utilisé comme base pour écrire un visualiseur.

Assemblage


Récupérez la colonne

image


Avant de connecter les LED à la colonne, il est nécessaire dans chacune des quatre LED de plier les pieds de sorte que chaque pied soit à 90 ° adjacent.

imageimage

Ensuite, chacune des LED doit être tournée de 90 ° alternativement (chaque suivante doit être tournée de 90 ° dans le sens horaire par rapport à la précédente). Auparavant, l'une des jambes peut être marquée (nous l'avons marquée avec du vernis vert) afin de ne pas se confondre.

imageimage

Nous connectons nos LED dans une colonne. Après avoir connecté les LED, nous coupons les extrémités saillantes des pieds.

imageimageimage

image image

Nous plaçons les colonnes

Les 15 colonnes restantes sont collectées de la même manière.

image


Les colonnes sont placées sur la carte à la même distance les unes des autres, formant ainsi un cube avec un côté égal à 4 LED. Tous les poteaux doivent être tournés dans le même sens (le marquage préliminaire de la jambe «de soutien» est ici très utile).

image image

image image

Nous connectons les colonnes ensemble

Retournez la structure et commencez à connecter les fils. Il y a 16 fils au total, la connexion a été réalisée en 4 étapes.

imageimage

imageimage

imageimage

imageimage

image


Il reste à se connecter à l'Arduino - et vous pouvez commencer la programmation.

Connectez-vous à Arduino

Les auteurs de Charlikub ont fourni la bibliothèque cubeplex pour une programmation pratique des cubes avec l'Arduino. Pour que cette bibliothèque puisse être utilisée sans modifications, il est nécessaire de connecter nos fils dans l'ordre suivant (la numérotation correspond aux fils dans les images de la section précédente):

image image

Programmation Arduino


Fonctionnalité de base

Comme mentionné ci-dessus, les auteurs ont utilisé la bibliothèque charlieplex, qui fournit une fonction drawLed () qui accepte la couleur et la position de la LED en coordonnées XYZ.
Mettez en surbrillance l'ensemble du cube en rouge
#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);
      }
    }
  }
}


Messagerie PC

La messagerie est implémentée via des E / S série sur le port via lequel le contrôleur se connecte à la machine. Travailler avec de tels événements est implémenté dans Arduino via SerialEvent .
Surlignage de cube personnalisé avec entrée utilisateur
#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');
}


Programmation pour la musique légère

On suppose que le cube clignotera au rythme de la musique. Par conséquent, le format du message peut être simplifié à un chiffre. L'algorithme est le suivant: dès que l'analyseur de musique "rattrape" le rythme, le cube doit s'allumer complètement. Après cela, le cube s'éteindra lentement (couche par couche). Dès que l'analyseur capture la mesure suivante, le cube se rallume complètement. Autrement dit, il suffit de transférer une figure dans le cube: combien de couches doivent être mises en évidence pour le moment. De plus, à chaque itération, nous déterminerons au hasard une nouvelle couleur.
Mettez en surbrillance un nombre donné de couches
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);
      }
    }
  }
}


Analyse sonore sur JRuby


L'ensemble de bibliothèque Minim comprend la classe BeatDetect , qui fournit des outils pour déterminer le rythme de la musique. En général, en utilisant cette bibliothèque, il est extrêmement simple de se connecter au canal de réception du son et d'effectuer son analyse de fréquence. Pour nos besoins, la méthode de fréquence pour déterminer le rythme est apparue.
Le code a été testé sur Ubuntu 15.10; La version de JRuby utilisée par les auteurs est jruby 9.0.5.0. Pour exécuter le script, vous devez installer Processing et connecter la bibliothèque Minim .
Analyse du rythme
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



Démonstration de travail




Au moyen de PulseAudio, le visualiseur s'est vu attribuer une sortie audio en tant qu'entrée audio, c'est-à-dire nous obtenons une visualisation de tout le son qui provient des haut-parleurs. Après l'enregistrement, le son a été superposé à la vidéo, qui a été reproduite au moment de la création du film.

Postface


Nous avons réussi à obtenir un visualiseur sonore en conjonction avec un PC. À l'avenir, vous pouvez améliorer l'algorithme pour déterminer le rythme (les outils standard pour déterminer le rythme de la bibliothèque Minim sont loin d'être idéaux), et les informations sur les fréquences peuvent également être sorties dans le cube. Comme vous pouvez le voir, un cube est simple à construire et à programmer; en outre, il utilise un minimum de composants.

Références:


Auteurs
Makoed Victor et Eugene Kunitsa, étudiants de 3e année des BSUiR Naval Forces

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


All Articles