4x4x4 LED RGB cube لتصور الموسيقى

في هذه المقالة ، سنتحدث عن تجربة تجميع مكعب 4x4x4 على مصابيح RGB LED ، بالإضافة إلى تطوير البرامج اللازمة لاستخدام المكعب كمصور للصوت. يتم استخدام متحكم اردوينو أونو.

الصورة


تحضير


المكعب

عند البحث في مثل هذه المشاريع ، تم اكتشاف تطبيق يسمى "Charliecube" بواسطة Asher Glick و Kevin Baker. هذا الخيار جدير بالملاحظة أنه ، على عكس التطبيقات الأخرى ، لا ينص على وجود عدادات أو سجلات التحول أو أي مكونات أخرى لبناء المكعب لغرض برمجته اللاحقة ويستخدم 16 ناتجًا فقط من وحدة التحكم الدقيقة (بينما يسمح بمعالجة 64 LEDs). في قلب هذا التطبيق ، يتم تصميم شاشة LED التي تسمى Charliplexing.

تشارليبليكسينج

تحتوي المخرجات الرقمية لوحدات التحكم الدقيقة على منطق مكون من ثلاثة أرقام: متصل بالطاقة ، ومتصل بـ "الأرض" وغير متصل بأي شيء. إذا كنا بحاجة إلى إضاءة LED ، فمن الضروري تطبيق "+" على X و "-" على "Y" ، في هذه الحالة فقط سيضيء. إذا لم يتم تغذية أي شيء بـ Y ، فلن يضيء مؤشر LED. يمكن العثور على مزيد من التفاصيل حول الطريقة في مقالة ويكيبيديا التي تحمل الاسم نفسه ، فيما يلي وصف للعمل على وجه التحديد في حالتنا.

الصورة

تخطيط العمود LED

لنفترض أننا نريد إضاءة LED1 باللون الأخضر. إذا اتبعنا على طول الخط الأزرق ، فمن الواضح أنه من الضروري تطبيق "+" على الإدخال 1. بعد اتباع الخط الأحمر ، نتفهم أننا بحاجة إلى تطبيق "-" على الإدخال 3. لا يتم إدخال أي شيء إلى المدخلات الأخرى.

التصور

تقرر إجراء كل تحليل الموسيقى على جهاز كمبيوتر متصل بالمكعب. الفكرة الرئيسية: يقوم الكمبيوتر الشخصي بتحليل قناة التسجيل الصوتي ، وتحويل الصوت إلى معلومات التردد ونقل بيانات إيقاع الموسيقى إلى Arduino. علاوة على ذلك ، يبرز المتحكم الدقيق القائم على هذه المعلومات أضواء LED معينة.

نظرًا لأن مؤلفي المشروع لديهم خبرة واسعة مع Ruby ، ​​أود أن ألجأ إلى لغة البرمجة هذه في إطار المشروع. تم اكتشاف مقال بقلم ديفيد غوتمان يصف تصور الصوت على JRuby باستخدام جوهرة معالجة الياقوت ومكتبة Minim java. تم أخذ المقالة التي تم العثور عليها كأساس لكتابة متخيل.

التجمع


اجمع العمود

الصورة


قبل توصيل مصابيح LED بالعمود ، من الضروري في كل من مصابيح LED الأربعة ثني الأرجل بحيث تكون كل ساق متجاورة 90 درجة.

الصورةالصورة

ثم يجب أن يتم تدوير كل من مصابيح LED 90 درجة بالتناوب (يجب تدوير كل مصباح لاحق 90 درجة في اتجاه عقارب الساعة بالنسبة إلى السابق). في السابق ، كان يمكن تمييز أحد الساقين (لدينا علامة بالورنيش الأخضر) حتى لا يتم الخلط.

الصورةالصورة

نقوم بتوصيل مصابيح LED الخاصة بنا في عمود. بعد توصيل المصابيح ، نقوم بتقليم الأطراف البارزة للساقين.

الصورةالصورةالصورة

الصورة الصورة

نضع الأعمدة

يتم تجميع الأعمدة الخمسة عشر المتبقية بنفس الطريقة.

الصورة


يتم وضع الأعمدة على السبورة على نفس المسافة من بعضها البعض ، وبالتالي تشكيل مكعب مع جانب يساوي 4 مصابيح LED. يجب أن تتحول جميع المشاركات في نفس الاتجاه (يعد وضع العلامات الأولية للساق "الداعمة" مفيدًا جدًا هنا).

الصورة الصورة

الصورة الصورة

نربط الأعمدة معا

اقلب الهيكل وابدأ في توصيل الأسلاك. هناك 16 سلكًا في المجموع ، تم الاتصال في 4 مراحل.

الصورةالصورة

الصورةالصورة

الصورةالصورة

الصورةالصورة

الصورة


يبقى الاتصال بـ Arduino - ويمكنك بدء البرمجة.

اتصل بـ Arduino

قدم مؤلفو Charlikub مكتبة cubeplex لبرمجة المكعب المريحة مع Arduino. من أجل استخدام هذه المكتبة بدون تعديلات ، من الضروري توصيل أسلاكنا بالترتيب التالي (يتوافق الترقيم مع الأسلاك في الصور من القسم السابق):

الصورة الصورة

برمجة اردوينو


الوظائف الأساسية

كما ذكر أعلاه ، استخدم المؤلفون مكتبة charlieplex ، التي توفر وظيفة drawLed () التي تقبل لون وموضع LED في إحداثيات XYZ.
قم بتمييز المكعب بالكامل باللون الأحمر
#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);
      }
    }
  }
}


رسائل الكمبيوتر

يتم تنفيذ المراسلة من خلال الإدخال / الإخراج التسلسلي إلى المنفذ الذي يتم من خلاله توصيل وحدة التحكم بالجهاز. يتم تنفيذ العمل مع مثل هذه الأحداث في Arduino من خلال SerialEvent .
تسليط الضوء على المكعب المخصص مع إدخال المستخدم
#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');
}


برمجة الموسيقى الخفيفة

من المفترض أن المكعب سوف يومض على إيقاع الموسيقى. وفقًا لذلك ، يمكن تبسيط تنسيق الرسالة إلى رقم واحد. الخوارزمية هي: بمجرد أن "يقبض" محلل الموسيقى على الإيقاع ، يجب أن يضيء المكعب تمامًا. بعد ذلك ، سيخرج المكعب ببطء (طبقة تلو الأخرى). بمجرد أن يلتقط المحلل الإجراء التالي ، يضيء المكعب مرة أخرى تمامًا. أي أنه يكفي نقل شكل واحد إلى المكعب: كم عدد الطبقات التي يجب إبرازها في الوقت الحالي. أيضًا ، في كل تكرار ، سنحدد لونًا جديدًا بشكل عشوائي.
قم بتمييز عدد معين من الطبقات
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);
      }
    }
  }
}


تحليل الصوت على JRuby


تتضمن مجموعة مكتبة Minim فئة BeatDetect ، والتي توفر أدوات لتحديد إيقاع الموسيقى. بشكل عام ، باستخدام هذه المكتبة ، من السهل جدًا الاتصال بقناة استقبال الصوت وإجراء تحليل التردد. لأغراضنا ، ظهرت طريقة التردد لتحديد الإيقاع.
تم اختبار الرمز على Ubuntu 15.10 ؛ نسخة JRuby المستخدمة من قبل المؤلفين هي jruby 9.0.5.0. لتشغيل البرنامج النصي ، يجب تثبيت المعالجة وتوصيل مكتبة Minim .
تحليل الإيقاع
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



مظاهرة عمل




عن طريق PulseAudio ، تم تعيين المخرج الصوتي كمدخل صوتي ، أي نحصل على تصور لجميع الأصوات التي تأتي من مكبرات الصوت. بعد التسجيل ، تم فرض الصوت على الفيديو ، والذي تم استنساخه في وقت إنشاء الفيلم.

خاتمة


تمكنا من الحصول على متخيل صوت بالتزامن مع جهاز كمبيوتر. في المستقبل ، يمكنك تحسين الخوارزمية لتحديد الإيقاع (الأدوات القياسية لتحديد إيقاع مكتبة Minim أبعد ما تكون عن المثالية) ، ويمكن أيضًا إخراج المعلومات حول الترددات إلى المكعب. كما ترى ، المكعب سهل البناء والبرمجة. بالإضافة إلى ذلك ، فإنه يستخدم الحد الأدنى من المكونات.

المراجع:


المؤلفان
ماكويد فيكتور ويوجين كونيتسا ، طلاب السنة الثالثة في القوات البحرية BSUiR

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


All Articles