カラー音楽または音楽の視覚化

それはすべて、レーザーショーの作成について私に本当に興味を持った1つの投稿から始まりました 。 それは新年の直前であり、差し迫った新年会のために何かを考え出す必要がありました。 そして、レーザー駆動レーザーショーは、医師が注文したものでした! 中国のポインターは1つずつ燃え、その明るさは非常に平凡でした。 ちょうどどこかで、DVDドライブからレーザーポインターを作成する方法に関する記事を見つけました。 新しい年は長い年月を経て、LPTポートは燃え尽きましたが、私が注文したATTiny2313と他の多くの電子部品が登場しました。 はんだごて、すくいによって組み立てられた多くのやり直しボードに多くの時間が経過しました...最後に、3Wで強力なRGB LEDを注文することにしました。 その後、レーザーショーは、COMポート経由でWinamp視覚化プラグインを使用して、30mWの緑色レーザーで既に実行されていました。 一般的に、LEDは私に大きな印象を与え、レーザーショーに色の音楽を追加することにしました。



装置



私たちに与えられたもの:3つのクーラーとレーザーショーモジュール用のレーザー。 2つの強力な3W RGB LED。 これには、特別なプログラムを使用してCOMポートを介してコンピューターと通信できるように、コントロールユニットを作成する必要があります。



最後にレーザーが死に、コードがレーザーショー用に書かれていなかったとすぐに言わなければならないので、ここからはカラー音楽についてのみお話します。 回路にはUSBポートもありますが、実装することもできませんでした。



画像



コントロールユニットにはATMega8マイクロコントローラーが選択されました。 その上でのプログラミングは簡単で、インターネットには記事がたくさんあります。 EasyElectronicsの Webサイトは私を大いに助けてくれ、そこで簡単なデバイスの作り方を学び、回路について少し学びました。



LEDの選択肢は多くありませんでした。実際には、ARPL-STAR 3W RGBの1つのオプションしかありませんでした。 ARPL-STAR 3W RG

6つのピンがあるため、3つのLEDはそれぞれ個別に制御されます。 私の場合、接続図は共通のアノードでした。 私はLEDがかなり大きな電流を消費することを言わなければなりません-最大輝度でそれぞれ350mA。 合計2つのRGBランプがあり、同じMK端子に並列に接続されているため、電流は非常に小さくなります。 切り替えについては、同じuln2003がレーザーショーに関する記事から選択されました。ランプの各LEDには2つの出力しか使用されていません。 各ピンは500mAしか保持しないため、合計6ピンです。 私はすぐにそのアイデアが最高ではなかったと言います。 パラメーターはすべて正常に並んでいますが、実際には、ランプがすべての電源で白色の場合、ulnが過熱してオフになります。 完全に異なるデザインのアイデアを思いついたので、それについて以下に説明します。



図には、MK用の標準ボディキットがあります。Molexコネクタは電源用に統合されており、レーザーショークーラー用に12V、その他すべてに5Vを提供します。 コンピューターに接続できますが、便宜上、Molexタイプの出力を備えた別の電源ユニットを使用しました。 MKのプログラミングには 、標準のGromovプログラマーが使用されました。 そして、これがRS232 <-> UART アダプターです。 将来、USB経由ですべてを実行する予定でしたが、ボード上の間違ったUSBコネクタを使用したため、コンピューターに接続するためのコードが見つかりません。



ランプの色は、内蔵されている3つのLEDすべてに依存します。 カラーモデルはRGBです。 各LEDの輝度は電圧に依存します。 したがって、 PWMは特定のコンポーネントの輝度を変更するために使用されます。 したがって、コントローラの色を設定するには、0から255までの3つの値を送信するだけで十分です。255は最大輝度を意味します。 ランプは非常に高温なので、ラジエーターに置く必要があることに注意してください。



MKプログラムはAVRStudioのCで記述されており、非常に簡単です。UARTによってバイトが到着すると、キューに入力されます。 メインループでは、プログラムは現在のコマンドを呼び出します。 コマンドは、実行するテーブル内のプロシージャのインデックスです。 使用されるコマンドは3つだけです:シンプル、色のクリア、色の設定。 単純なプログラムでは、キューにデータがあるかどうかを確認し、データがある場合は、現在のコマンドのインデックスがキューにあるものに変更されます。 色設定コマンドは3バイトのデータを受け入れるため、データキューに3バイトが入るまでメインループでハングします。



PWMはソフトウェアに実装されています。 これは、ATMega8には3つのPWMハードウェアチャネルしかないため、そのうち6つが必要でした。3つはレーザーショークーラー用、3つはランプ用です。



メインプログラムコードは次のとおりです。

int main() { #define baudrate 9600L #define bauddivider (F_CPU / (16 * baudrate) - 1) UBRRL = LO(bauddivider); UBRRH = HI(bauddivider); UCSRA = 0; UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE; UCSRC = 1<<URSEL|1<<UPM1|0<<UPM0|1<<UCSZ0|1<<UCSZ1; D_SEND('r'); TCCR0 = (0<<CS02)|(0<<CS01)|(1<<CS00); TIMSK = (1<<TOIE0); DDRB = DDRD = DDRC = 0xff; PORTB = PORTD = PORTC = 0; g_currentSetup = 0; SetupShowFromPredefines(0); g_currentColorSetup = 0; SetColorFromPredefines(0); UartRcvInit(); g_command = 0; g_shit = 1; g_pwmValue = 0; sei(); for(;;) { //.      //  ,     //    if (g_shit > 0 && g_counter >= 0xff00) { g_currentColorSetup++; if (g_currentColorSetup == MAX_COLOR_PREDEFINES) g_currentColorSetup = 0; SetColorFromPredefines(g_currentColorSetup); ATOMIC_BLOCK(ATOMIC_FORCEON) { g_counter = 0; } } PCOMMAND pFunc = (PCOMMAND)pgm_read_word(g_commands + g_command); if (pFunc()) { g_command = 0; } } return 0; } ISR(USART_RXC_vect) { //  UartOnRecieve(); } ISR(TIMER0_OVF_vect) { g_counter++; g_pwmValue++; //      if (g_pwmValue == 0) { LAMP_PORT |= LAMP_MASK; } //       //     if (g_pwmValue == g_pwm[3]) CBI(LAMP_PORT, LAMP_RED); if (g_pwmValue == g_pwm[4]) CBI(LAMP_PORT, LAMP_GREEN); if (g_pwmValue == g_pwm[5]) CBI(LAMP_PORT, LAMP_BLUE); }
      
      







色変更コマンドの例:

 // - 4 //  bool UpdateColor() { ColorData data; if (UartRead((byte*)&data, sizeof(ColorData))) { D_SEND('l'); g_shit = 0; SetColor(&data); return true; } return false; } void SetColor(ColorData *pData) { ATOMIC_BLOCK(ATOMIC_FORCEON) { g_pwm[3] = pData->red; g_pwm[4] = pData->green; g_pwm[5] = pData->blue; } }
      
      







プリント基板はLUT方式で作成されます。







プログラム







最初は、すべてがWinampの視覚化プラグインを使用して制御されていました。 しかし、それは便利ではなかった、なぜなら 多くの場合、音楽はvkontakteを聴きました。 次のように、C#で記述することにしました。 アプリケーションは純粋にフロントエンドである必要があります。 サウンドキャプチャに関する情報をインターネットで検索しても、実用的なものは見つかりませんでしたが、サウンドカードでは、再生中のものを出力するようにレコーダーを構成できることを思い出しました。 そこで、ベースライブラリを使用して、すぐに例を作成しました。 また、C#にはシリアルポートを操作するためのクラスがすべてあることがわかりました。すべてが非常にシンプルであることがわかりました。



ランプのカラーモデルは明らかな理由でRGBですが、音楽の視覚化には最適ではないため、プログラムはHSVモデルを使用します。 各色コンポーネント(色、彩度、明度)は個別に構成されます。 カラーミュージックだけに限定しないことにしました。各カラーコンポーネントについて、可能なソースのいずれかを選択できます。手動入力、ランダム値、オーディオ、および別のコンポーネントのコピーです。 手動モードでは、色、明るさ、彩度を自分で調整できます。 ランダムモードを使用すると、ムードランプを作成できます(範囲、シフト周波数、シフト速度の設定があります)。 最も興味深いモードは、もちろんオーディオです。



すべてが周波数スペクトルに基づいています。 色成分の値に影響を与える周波数範囲が選択され、信号レベルが選択されます(低減、増加可能)、オフセット、スムージング。 信号レベルではなく、その変化を使用することもできます。 私は通常これをランプの明るさに付け、そのようなストロボ効果を得ます(ちなみに、ストロボも実現できます)-信号レベルが増加すると、輝度は増加し、減少すると、それに応じて減少します。 ここでシフトが便利になり、初期輝度を調整できます。



できること



まず、上で書いたように、ランプをフルパワーでオンにすると、ulnのためにランプはかなり早くオフになります。 さらに、ランプをヘッドユニットから比較的長い距離に配置する必要がある場合は、太いワイヤを使用する必要があります。そうしないと、大きな損失が発生します。 それで、私は完全に異なるデザインのアイデアを得ました:各ランプを、独自の電源、独自のMKおよびコントロールを備えた別個のモジュールとして作成すること。 これらのモジュールは、ツイストペアケーブルを介してメインデバイスに接続され、avrツールはMKが互いに通信できるようにします。 T.O. ランプを個別に制御することができます。



第二に、音楽だけでなくビデオにも電球を点滅させることができ、AmbLightのようなことをすることができ、現在のアーキテクチャではこれを行うことができます。 ビデオキャプチャに関する情報はありますか? ランプ自体は非常に明るく、特に2つあり、35平方の部屋を十分に照らすので、写真を新しいレベルに上げることができます! 海からの写真を見ると、部屋全体が心地よい青い色合いで満たされています。



おわりに



多くのことが行われ、多くのことはまだ行われていませんが、残念ながら近い将来ではありません。 最後に-ビデオ。 残念ながら、私のカメラは優れた光感度で違いはありません。したがって、ビデオではまったく何も照らされていないようです。 実際、効果は非常に強く、ランプ自体を見ると、それらは強く目を押します-これはパーティーに最も適しています。











UPD:制御プログラムのソースコードをアーカイブに追加しました



All Articles