工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoを搭載したRGBMatrix Audio Visualizer

コンポーネントと消耗品

>
Arduino UNO
× 1
Arduino用Adafruitネオピクセルシールド
× 1
SparkFun Spectrum Shield
× 1
Arduino用のProtoStaxエンクロージャー
Arduino用の積み重ね可能なモジュラーエンクロージャー(UnoおよびMegaフットプリント)
× 1
SPSTオフ-(オン)青い押しボタンスイッチ
× 1
3.5mm絶縁ステレオジャックパネルマウント
× 2
90°角度付き3.5mm補助ケーブル
× 2
パッチコード3.5mmステレオオーディオオス-オス6フィート
× 1

必要なツールとマシン

>
ドリル/ドライバー、コードレス

このプロジェクトについて

この記事では、Arduino、RGB LEDマトリックスシールド、およびオーディオスペクトラムアナライザーシールドを使用してRGB LEDマトリックスオーディオビジュアライザーを構築し、それをエンクロージャーに入れて、完成したプロジェクトを作成する方法について説明します。あなたの音楽の素敵な光のショーを持っているためにあなたの音楽システムによって表示してください!

オーディオスペクトル分析には、2つのMSGEQ7グラフィックイコライザーディスプレイフィルターを使用するSparkFunのスペクトラムシールドを使用します。これは、ステレオオーディオ入力を7バンド(チャネルごと)に分割し、ArduinoのADCを使用してそれぞれの振幅を読み取ります。開始するためのArduinoサンプルスケッチが付属しています。

RGB LEDマトリックスには、40個のRGB NeoPixel(WS2812光源のAdafruitの用語)で構成されるArduino用のAdafruitのNeoPixelシールドを使用します。赤、緑、青のLEDは、ドライバーチップと一緒に、単一のワイヤーで制御される小さな表面実装パッケージに統合されています。これらは個別に使用したり、長いストリングにチェーンしたり、さらに興味深いフォームファクターに組み立てたりすることができます。シールドの場合、それらは一緒にチェーンされています。 ShieldにはAdafruit_NeoMatrixライブラリも付属しており、RGB LEDMatrixへのアクセスとLEDの制御を簡素化します。

最後にエンクロージャーがあります。私がProtoStaxと呼ばれる新しい積み重ね可能なモジュラーエンクロージャシステムを作成したことをご存知の方もいらっしゃるかもしれません。それは私が引っ掻かなければならなかった個人的なかゆみでした-私はプロトタイピングのさまざまな段階をサポートし、開始時に保護とオープンアクセスを提供し、後で側壁と上部を追加する機能を備えたエンクロージャーが必要でしたが、積み重ねることもできました複数のユニットを並べて、または重ねて配置することで、プロトタイピングのニーズや他のボードやコンポーネントの追加に合わせて拡張することができます。

この例では、Arduino用のProtoStaxを使用します。これは、Arduino用の透明なアクリル製エンクロージャーです。Uno/ Leonardoフットプリントとより大きなMega / Dueフットプリントの両方に適合します。これは、積み重ね可能でモジュール式であり、2人用のスペースがあります。シールド(いくつかのマイナーな変更を加えて、概要を説明します)。透明で頑丈で、ゴム製の脚が付いているので、わずかに持ち上げてテーブルの表面を保護できるため、オーディオビジュアライザーとそのライトショーを音楽システムと一緒に表示できます。 😊

さあ、始めましょう。 😊

ステップ1-Arduinoをエンクロージャベースプレートに取り付けます

まず、Arduino(この例ではUno)をエンクロージャーのベースプレートに取り付けましょう。これにより、Arduinoを構成およびセットアップし、それを試してみるための完全なオープンアクセスを提供しながら、保護が提供されます。閉じる準備ができたら、側壁と天板を簡単に追加して、すべてをネジで固定できます。

Arduinoをベースプレートに取り付け、脚やその他のハードウェアを追加して、プラットフォーム構成でエンクロージャを準備します。 。スライドショーの以下の手順を参照してください。各画像のキャプションには番号が付けられ、各手順の追加の説明が記載されています。

アニメーションGIFとしてのすべての手順は次のとおりです。

ステップ2-Arduino用のSparkFunスペクトラムシールドを準備する

SparkFun SpectrumShieldにはヘッダーが付属していません。幸いなことに、Arduino用のAdafruit NeoPixel Shieldには、スタッキングヘッダーとプレーンヘッダーの両方が付属しています。 NeoPixel Shieldを一番上​​に配置したいので、プレーンヘッダーを使用してフラッシュします。これにより、SpectrumShieldで使用するためのスタッキングヘッダーが残ります。これはまさに私が望むものです。 😉

ただし、スタッキングヘッダーを備えたSpectrum Shieldはぴったりとはまりません。下の図に示すように、ArduinoUnoのUSBポートと電源ポートが邪魔になります。

次の2つの変更を行いました-

  • USBポートと電源ポートを介してSpectrumShieldの端を切り取ります(その部分にはプロトタイピング領域があり、使用されていません。使用している場合でも、1列の穴だけを切り落とすことになります)。スペクトラムシールドはArduinoにぴったりと収まります。
  • スタッキングヘッダーの脚が長すぎて、SpectrumShieldがぴったりと収まらない場合があります。スタッキングヘッダーの脚を髪の毛で切り落とし、SpectrumShieldがスタッキングヘッダーでArduinoにぴったりと収まるようにしました。

今ではぴったりとフィットします!

ステップ3-Arduino用のAdafruitNeoPixelShieldをSpectrumShieldのスタッキングヘッダーに挿入します

Adafruit NeoPixel Shieldは、SpectrumShieldの上にあります。まず、(付属の)通常のヘッダーをはんだ付けする必要があります。付属の端子コネクタにもはんだ付けしましたが、この例では、すべてのLEDが同時にオンになるわけではないため、Arduinoを使用して電力を供給しています。したがって、消費電力はArduinoが提供できる量の範囲内です。 。

Arduinoページ用のAdafruitのNeoPixelShieldからのメッセージ:

ステップ4-デモコード

デモコードを見て、それが何をしているのか見てみましょう。そのために、2つの主要な部分に分割できます。

  • スペクトル分析と結果の保存
  • これを8x5NeoPixelMatrixのディスプレイ/カラースキームに変換します。

ここでデモコードをすばやく参照できます:

https://github.com/protostax/ProtoStax_Audio_Visualizer_Demo/blob/master/ProtoStax_Audio_Visualizer_Demo.ino

スペクトル分析

スペクトラムシールドに関する追加情報については、スペクトラムシールドフックアップガイドを参照してください。ここに情報をまとめました。

スペクトラムシールドのSTROBEピンとRESETピンにデジタルシーケンスを書き込むことにより、シールドが使用するMSGEQ7チップを初期化します。次に、スペクトルが分割されている7つの異なる周波数帯域のそれぞれの大きさを読み取ることができます。各バンドが読み取られ、続いてSTROBEピンがパルス化されて、次のバンドの読み取りが開始されます。値は、ステレオ入力の2つのチャンネルのFrequencies_One [7]とFrequencies_Two [7]に保存されます。値はArduinoの10ビットADCを使用して読み取られるため、出力値は0〜1023になります。これらは、各周波数帯域の振幅を表します。

  // SpectrumShieldピン接続を宣言します#defineSTROBE4#define RESET 5#define DC_One A0#define DC_Two A1 //スペクトル変数を定義しますintfreq_amp; int Frequencies_One [7]; int Frequencies_Two [7]; int i; void setup(){... //スペクトラムアナライザを初期化しますdigitalWrite(STROBE、LOW); delay(1); digitalWrite(RESET、HIGH); delay(1); digitalWrite(STROBE、HIGH); delay(1); digitalWrite(STROBE、LOW); delay(1); digitalWrite(RESET、LOW); ...} void loop(){... Read_Frequencies(); ...} / *******************から周波数をプルスペクトラムシールド******************** / void Read_Frequencies(){... //(freq_amp =0; freq_amp <7; freq_amp ++)の各帯域の周波数を読み取ります{Frequencies_One [freq_amp] =(analogRead(DC_One)+ analogRead(DC_One))>> 1; Frequencies_Two [freq_amp] =(analogRead(DC_Two)+ analogRead(DC_Two))>> 1; ... digitalWrite(STROBE、HIGH); digitalWrite(STROBE、LOW); }}  

周波数スペクトルの7つの帯域は次のとおりです。

  • 63Hz
  • 160Hz
  • 400Hz
  • 1kHz
  • 2.5kHz
  • 6.25kHz
  • 16kHZ

これらをBASS、MID_RANGE、TREBLEの3つの範囲に分割しました。通常の低音域は60〜250 Hzであるため、最初の2つの帯域は低音域の範囲にあります。ミッドレンジの周波数は通常500Hz〜2 kHzなので、次の3つのバンドをMID_RANGEにグループ化します。残りの2つのバンドをTREBLEにグループ化します。

[注:各バンドの最大読み取り値を個別の変数に記録することにも注意してください。これは、読み取り値をRGBマトリックス列で表されるレベルに自動的にスケーリングするために使用できる可能性があります。これは、入力信号が低い場合に役立ちます。そうでない場合、RGBマトリックスのごく一部しか点灯しません。 ]

RGBマトリックス

NeoPixelシールドおよびNeoPixels全般に関する追加情報については、AdafruitNeoPixelÜberguideを参照してください。ここに私たちの使用に関する情報を要約しました。

最初は少し混乱しましたが、明確にしようとする主なポイントは、NeoPixelシールドの方向と向き、および座標系の番号付けです。ユーバーガイドが説明していますが、もう少し簡単にできると思います。

最初に注意することは、座標系では、[0、0]は、方向に関係なく、常に左上を指すということです。

次に、関心のある方向のWIDTH、続いてHEIGHTに注意します(つまり、シールドの場合は5 x8と8x 5)

3つ目は、PHYSICAL LED#0(かわいいAdafruitのロゴでマークされている)の位置に注意することです。場合によっては、TOP-RIGHT、TOP-LEFT、BOTTOM-LEFT、およびBOTTOM-RIGHT。また、物理LEDの進行方向にも注意してください。私たちのボードでは、レイアウトはプログレッシブです(1つの行の終わりの後の次の物理的なLEDは、黄色の線で示されているように、次の行の始まりから始まります)。プログレッションの方向は、幅が広い場合(水平方向)(短い緑の矢印で示されている)の場合はROWSに沿っており、幅の狭い列(垂直方向)(これも短い緑の矢印で示されている場合)です。 )。

これらは、スライドショーの下の4つの画像で示されています。キャプションには、それぞれの場合に関連する設定が含まれています!

この例では、7つの周波数帯域と、8 x 5(または、どちらの見方に応じて5 x 8)のマトリックスがあります。私は8次元に沿って7つのバンドを表示することを選択しました(1つは未使用のままにします)。次に、5次元に沿った各周波数帯域の振幅表現を表示します。言い換えれば、私は私の進歩を次のようにしたいと思っています:

原点を左下隅(最低周波数帯域の最低レベルを表す)から開始し、上に向かって進んでいきたいと思います。ただし、座標系で最初に注意することは、[0、0]は常にTOP-LEFTを指すため、NeoMatrixを初期化するための値の選択を理解するには、頭を左に傾けて下の画像を見る必要があります。 !! 😊(幅=5、高さ=8、右上、列がプログレッシブ)

NeoMatrixと周波数のグラフ化に関連するデモコードを少し掘り下げてみましょう。まず、NeoPixelのWIDTH =5、HEIGHT =8であり、好きな向きはTOP-RIGHT、COLUMNSPROGRESSIVEであると判断しました。 setup()関数でマトリックスに必要な設定に従います。

loop()では、シリアル入力を読み取って配色を選択します-3つの異なる配色を定義しました

 列挙型スキーム{MAGNITUDE_HUE =0、MAGNITUDE_HUE_2 =1、HSV_COLOR_WHEEL =2};  

次に、その配色を選択してGraph_Frequenciesを呼び出します。表示する周波数の範囲(BASS、MID-RANGE、またはTREBLE)を選択できる最初のパラメーターにも注意してください

  enum RANGE {BASS =0、MID_RANGE =1、TREBLE =2、ALL =3};  

今のところ、表示するすべての範囲を選択しています-表示する範囲の選択を実装するための演習として、シリアル入力を介して、またはBASS、MID_RANGE、 TREBLEまたはALL。 RANGEを選択すると、表示される行の「from」と「to」の範囲が決まります。

各行(周波数帯域)について、2つの周波数の大きさ(ステレオ入力の右チャネルと左チャネル)の大きい方を選択します。すでに説明したように、その値は0から1023の間にあります。これをディスプレイの5つの異なる列にマップする必要があるため、周波数を204として定義されているFREQ_DIV_FACTORで除算します(1023/204 =5、1023の出力を5にマップします)。安全のために、表示するnumColが5以下であることも確認します。これにより、各周波数帯域で表示する列の数が決まります。

次に、matrix.drawPixel()を使用して、適切なピクセルを適切な色で表示します。

グラフィックディスプレイでHSVカラーホイールを使用しています。これは克服するためにいくつかの余分なしわをもたらしました。

通常、使用法はmatrix.drawPixel(column、row、Color(r、g、b))です。ここで、Color(r、g、b)は、RED、GREEN、およびBLUEの値で指定された色を表します。ただし、HSVを使用すると、スムーズな色の変化が可能になります。

NeoMatrixは、単一のuint16_t色相値を取り、uint32_t HSV色を返すmatrix.ColorHSV(uint16_t hue)メソッドを提供します。

ただし、matrix.Color(r、g、b)はuint16_tカラーを返します。 matrix.drawPixelも16ビットカラーを想定しています。

これを回避する方法は、matrix.setPassThruColor(32ビットカラー値)を使用することです。これにより、drawPixelがその色の引数を無視し、代わりに上記の方法ですでに設定されている32ビットの色を使用するフラグをマトリックスに設定します。問題のフラグをリセットするには、matrix.setPassThruColor()を呼び出すことを忘れないでください。あまりエレガントではありませんが、機能します。たとえば、

  static uint16_t hue =0; // 2184522250から-250uint16_t hueDelta =200; hue + =hueDelta; ... rgbcolor =matrix.ColorHSV(hue); ... matrix.setPassThruColor(rgbcolor); matrix.drawPixel(col、row、(uint16_t)0); //ここでは色は重要ではありませんmatrix.setPassThruColor(); ... matrix.show();  

HSVを使用すると、16ビットの色相をインクリメントしてHSVカラーコードを生成できるため、スムーズな色の変化が得られます。

参考までに、さまざまなコードを次に示します。

<コード>はの#define NEO_MATRIX_WIDTH 5#8#定義NEO_MATRIX_HEIGHT定義
 NEOPIXEL_PIN 6 //シールドピンにマッピング6Adafruit_NeoMatrixマトリックス=Adafruit_NeoMatrix(NEO_MATRIX_WIDTH、NEO_MATRIX_HEIGHT、NEOPIXEL_PIN、NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE、NEO_GRB + NEO_KHZ800)。 .... void setup(){... matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(40); matrix.fillScreen(0); matrix.show(); ...} void loop(){staticintスキーム=0; while(Serial.available()> 0){スキーム=Serial.parseInt(); } ... Graph_Frequencies(ALL、scheme); ... delay(50);} void Graph_Frequencies(CHANNEL c、SCHEME s){... for(row =from; row  Frequencies_One [row])?Frequencies_Two [row]:Frequencies_One [row]; int numCol =(freq / FREQ_DIV_FACTOR); if(numCol> 5)numCol =5; for(int col =0; col  

次は配色の選択です。さまざまな周波数範囲(bassHue、midHue、trebleHue)の色を選択できるように準備したことに注意してください。私は3つの異なる配色を作成しました。1つは最小振幅から最大振幅までの表示に緑から赤/ピンクの範囲を使用し、もう1つはよりピンク/青のシフト範囲を使用します。 3番目のスキームは、すべてのピクセルに同じ色を使用しますが、カラーホイール全体を循環します。 3つの配色すべてのビデオをお見せします。

  switch(s){case MAGNITUDE_HUE:bassHue =22250; midHue =22250; // 54613 trebleHue =22250; // 43690 if(row> =0 &&row <2){rgbcolor =matrix.ColorHSV(bassHue-(7416 * col)); } else if(row> =2 &&row <5){rgbcolor =matrix.ColorHSV(midHue-(7416 * col)); } else if(row> =5 &&row <7){rgbcolor =matrix.ColorHSV(trebleHue-(7416 * col)); } 壊す;ケースMAGNITUDE_HUE_2:bassHue =54613; midHue =54613; // 54613 trebleHue =54613; // 43690 if(row> =0 &&row <2){rgbcolor =matrix.ColorHSV(bassHue-(7416 * col)); } else if(row> =2 &&row <5){rgbcolor =matrix.ColorHSV(midHue-(7416 * col)); } else if(row> =5 &&row <7){rgbcolor =matrix.ColorHSV(trebleHue-(7416 * col)); } 壊す;ケースHSV_COLOR_WHEEL:rgbcolor =matrix.ColorHSV(hue);壊す; }  

ステップ6-すべてをテストする

これがすべてをテストするビデオです

ステップ6-閉じる

上部ブレース要素、側壁、オーディオケーブル、および上部を取り付けます。スライドショーの以下の手順を参照してください。各画像のキャプションには番号が付けられ、各手順の追加の説明が記載されています。

1つのアニメーションGIFのすべての手順は次のとおりです。

ステップ7-あなたの作品を展示し、美しい音楽をさらに美しくしましょう!

これで、音楽システムと一緒に表示できる楽しいオーディオビジュアライザーを使用して、クールな自家製の軽いアクションで音楽を補強することができます。

ステップ8-さらに進んで

プロジェクトをさらに進めるためのアイデアをいくつか紹介します。

1.現在、オーディオケーブル(入力および出力)はエンクロージャー内のSpectrum Shieldに接続されているため、これらのワイヤーが接続され、外部にぶら下がっているこのエンクロージャーがあります。代わりに、Spectrum Shieldのステレオジャックの近くの側壁にいくつかのパネルマウントステレオジャック(使用される「もの」のリストに記載)を追加し、3.5mmオスステレオオーディオジャックでオーディオケーブルをはんだ付けすることができますそれぞれに接続し、代わりにそれらをスペクトラムシールドのオーディオジャックに接続します。この場合、エンクロージャーは非常にきれいになり、すべての配線は、外部システムを接続するためのエンクロージャーのオーディオジャックのみで自己完結型になります。

2.オーディオビジュアライザーにさらに多くのライトスキームを追加できます-さまざまな色の範囲、さまざまなパターン。

3.シリアル入力を使用して周波数範囲を有効/無効にするオプションを追加します。現在、変更できるのは配色のみで、表示する周波数範囲はできません。

4.シリアル入力を使用する代わりに、異なる配色を切り替えるスイッチを追加します。パネルマウントの瞬間的な押しボタンスイッチ(使用される「もの」のリストにリストされている)に対応するために、長い側壁の1つに穴を追加するようにエンクロージャーを変更します。

5. 2番目のスイッチを追加して、表示されるさまざまな周波数範囲(BASS、MID_RANGE、TREBLE、ALL)を切り替え、そのスイッチをエンクロージャーの側壁に取り付けます。

6.エンクロージャーはアクリル製なので、表面を保護するために青い画家のテープを使用し、必要な側にドリルで穴を開けて、パネルマウントステレオジャックやスイッチを取り付けることができます。ステップドリルを使用するか、小さい穴から始めて、希望のサイズになるまで穴を拡張することをお勧めします。記載されているステレオジャックには5/16 "の取り付け穴が必要であり、スイッチには0.47"の取り付け穴が必要です。

7.天板の上面を軽く均一に研磨します。これは光ディフューザーとして機能し、より拡散した穏やかな光の効果をもたらします。

十分な関心があれば、プロジェクトを更新して、オーディオジャックとスイッチと不透明なライトディフューザートップで表示します。更新されたプロジェクトをご覧になりたい場合は、メッセージを送ってください。 😊

もう考えられますか?以下にコメントを書いてお知らせください。 😊ご不明な点がございましたら、お気軽にお問い合わせください。 😊

幸せな作り! 😊

コード

ProtoStaxオーディオビジュアライザーのデモ
このProtoStaxオーディオビジュアライザーデモで使用されるコードを含むGithubリポジトリhttps://github.com/protostax/ProtoStax_Audio_Visualizer_Demo

製造プロセス

  1. K30センサーによるCO2モニタリング
  2. 1Sheeld / Arduinoとの盲ろう者のコミュニケーション
  3. Arduinoでコインアクセプターを制御する
  4. MAX7219を搭載した24x16マトリックスのArduinoPongゲーム
  5. 可聴周波数検出器
  6. LEDを制御するBluetoothを搭載したArduino!
  7. ArduinoまたはESP8266を搭載した静電容量式指紋センサー
  8. Arduinoでオーディオを再生する
  9. ビリーベースの口を任意のオーディオソースでアニメートする
  10. ArduinoRGBカラーミキサー
  11. ArduinoUnoでLEDマトリックスを制御する