4x4x4 LED RGB cube untuk visualisasi musik

Pada artikel ini, kita akan berbicara tentang pengalaman merakit kubus 4x4x4 pada LED RGB, serta pengembangan perangkat lunak yang diperlukan untuk menggunakan kubus sebagai visualisator suara. Mikrokontroler Arduino Uno digunakan.

gambar


Persiapan


Kubus

Ketika meneliti proyek-proyek tersebut, implementasi yang disebut "Charliecube" ditemukan oleh Asher Glick dan Kevin Baker. Opsi ini patut diperhatikan karena, tidak seperti implementasi lainnya, ia tidak menyediakan kehadiran penghitung, register geser, atau komponen lainnya untuk membuat kubus untuk tujuan pemrograman berikutnya dan hanya menggunakan 16 output mikrokontroler (sambil memungkinkan menangani 64 LED). Inti dari implementasi ini adalah desain layar LED yang disebut Charliplexing.

Pembicaraan tipuan

Output digital dari mikrokontroler memiliki logika tiga digit: terhubung ke daya, terhubung ke "ground" dan tidak terhubung ke apa pun. Jika kita perlu menyalakan LED, perlu menerapkan "+" ke X dan "-" ke "Y", hanya dalam kasus ini itu akan menyala. Jika tidak ada yang dimasukkan ke Y, LED tidak menyala. Rincian lebih lanjut tentang metode ini dapat ditemukan di artikel Wikipedia dengan nama yang sama , deskripsi karya khusus dalam kasus kami diberikan di bawah ini.

gambar

Layout Kolom LED

Misalkan kita ingin menyalakan LED1 berwarna hijau. Jika Anda mengikuti garis biru, jelas bahwa perlu menerapkan "+" ke input 1. Setelah mengikuti garis merah, kami memahami bahwa kami perlu menerapkan "-" ke input 3. Tidak ada yang dimasukkan ke input lain.

Visualisasi

Diputuskan bahwa semua analisis musik akan dilakukan pada PC yang terhubung ke kubus. Gagasan utama: PC menganalisis saluran rekaman suara, mengubah suara menjadi informasi frekuensi dan mentransfer data ritme musik ke Arduino. Selanjutnya, mikrokontroler berdasarkan informasi ini menyoroti LED tertentu.

Karena penulis proyek memiliki pengalaman luas dengan Ruby, saya ingin menggunakan bahasa pemrograman ini dalam kerangka kerja proyek. Sebuah artikel oleh David Guttman ditemukan menggambarkan visualisasi suara di JRuby menggunakan permata pengolahan ruby ​​dan perpustakaan java Minim. Artikel yang ditemukan diambil sebagai dasar untuk menulis visualisator.

Majelis


Kumpulkan kolom

gambar


Sebelum menghubungkan LED ke kolom, perlu di masing-masing dari empat LED untuk menekuk kaki sehingga setiap kaki dengan 90 Β° berdekatan.

gambargambar

Kemudian masing-masing LED perlu diputar 90 Β° secara bergantian (masing-masing berikutnya harus diputar 90 Β° searah jarum jam relatif terhadap yang sebelumnya). Sebelumnya, salah satu kakinya bisa ditandai (kita sudah ditandai dengan pernis hijau) agar tidak bingung.

gambargambar

Kami menghubungkan LED kami di kolom. Setelah menghubungkan LED, kami memotong ujung kaki yang menonjol.

gambargambargambar

gambar gambar

Kami menempatkan kolom

15 kolom yang tersisa dikumpulkan dengan cara yang sama.

gambar


Kolom ditempatkan di papan pada jarak yang sama satu sama lain, sehingga membentuk kubus dengan sisi sama dengan 4 LED. Semua posting harus diputar ke arah yang sama (penandaan awal dari kaki "pendukung" sangat berguna di sini).

gambar gambar

gambar gambar

Kami menghubungkan kolom bersama

Balikkan struktur dan mulailah menghubungkan kabel. Total ada 16 kabel, koneksi dilakukan dalam 4 tahap.

gambargambar

gambargambar

gambargambar

gambargambar

gambar


Tetap terhubung ke Arduino - dan Anda dapat memulai pemrograman.

Terhubung ke Arduino

Penulis Charlikub telah menyediakan pustaka cubeplex untuk pemrograman kubus yang nyaman dengan Arduino. Agar perpustakaan ini dapat digunakan tanpa modifikasi, perlu menghubungkan kabel kami dalam urutan berikut (penomoran sesuai dengan kabel pada gambar dari bagian sebelumnya):

gambar gambar

Pemrograman Arduino


Fungsionalitas dasar

Seperti disebutkan di atas, penulis menggunakan perpustakaan charlieplex, yang menyediakan fungsi drawLed () yang menerima warna dan posisi LED dalam koordinat XYZ.
Sorot seluruh kubus dengan warna merah
#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);
      }
    }
  }
}


Olahpesan PC

Pesan diimplementasikan melalui seri I / O ke port yang digunakan pengontrol untuk terhubung ke mesin. Bekerja dengan acara semacam itu diterapkan di Arduino melalui SerialEvent .
Sorotan kubus khusus dengan input pengguna
#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');
}


Pemrograman untuk musik ringan

Diasumsikan bahwa kubus akan berkedip dengan irama musik. Dengan demikian, format pesan dapat disederhanakan menjadi satu digit. Algoritme adalah ini: begitu penganalisa musik "menangkap" irama, kubus akan menyala sepenuhnya. Setelah itu, kubus perlahan akan keluar (lapis demi lapis). Segera setelah penganalisa menangkap ukuran berikutnya, kubus menyala lagi sepenuhnya. Yaitu, cukup memindahkan satu gambar ke kubus: berapa banyak lapisan yang perlu disorot saat ini. Juga, pada setiap iterasi, kami akan secara acak menentukan warna baru.
Sorot sejumlah layer tertentu
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);
      }
    }
  }
}


Analisis Suara tentang JRuby


Set perpustakaan Minim termasuk kelas BeatDetect , yang menyediakan alat untuk menentukan irama musik. Secara umum, menggunakan perpustakaan ini sangat sederhana untuk terhubung ke saluran penerima suara dan melakukan analisis frekuensinya. Untuk keperluan kami, metode frekuensi untuk menentukan ritme muncul.
Kode diuji di Ubuntu 15.10; Versi JRuby yang digunakan oleh penulis adalah jruby 9.0.5.0. Untuk menjalankan skrip, Anda harus menginstal Memproses dan menghubungkan perpustakaan Minim .
Analisis irama
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



Demonstrasi kerja




Melalui PulseAudio, visualisator ditugaskan output audio sebagai input audio, mis. kami mendapatkan visualisasi dari semua suara yang berasal dari speaker. Setelah merekam, suara ditumpangkan pada video, yang direproduksi pada saat film dibuat.

Kata penutup


Kami berhasil mendapatkan visualizer suara bersama dengan PC. Di masa depan, Anda dapat meningkatkan algoritme untuk menentukan ritme (alat standar untuk menentukan ritme perpustakaan Minim jauh dari ideal), dan informasi tentang frekuensi juga dapat menjadi output ke kubus. Seperti yang Anda lihat, kubus mudah dibuat dan diprogram; selain itu, ia menggunakan minimum komponen.

Referensi:


Penulis
Makoed Victor dan Eugene Kunitsa, siswa tahun ke-3 Pasukan Angkatan Laut BSUiR

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


All Articles