Arduinoオーディオリアクティブデスクライト
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> ![]() |
|
アプリとオンラインサービス
> ![]() |
|
このプロジェクトについて
HELLO WORLD !!
こんにちは!このビルドでは、シンプルなコンポーネントといくつかの基本的な Arduino を使用して、すべての音と音楽に合わせて踊る見栄えの良いライトを作成します。 プログラミング。ゲームや音楽の再生など、本当に音を出すものなら何でも机の上に立っていると素晴らしい効果が得られます。始めましょう!
これは、彼らが行ったyoutuberの「NaturalNerd」に基づいて私がフォローしているプロジェクトです。これは私のバージョンのプロジェクトです。すべての功績は彼らに与えられ、プロジェクトの実行方法の詳細を私に提供してくれた彼らに大声で叫びました。
Youtubeリンク
ステップ1:主な供給品
まず最初に:どのような種類の物資が必要で、どれくらいの費用がかかりますか?まあ、それらは主にオプションであり、多くの即興で作ることができます。それでも、このガイドに従うには、いくつかの重要な項目が必要です。
- Arduino Nano (または同様に小さいArduinoタイプ)(RM 12.50購入リンク)
- サウンドディテクタモジュール (RM 5.90購入リンク)
- 5ボルト 電源 (または降圧モジュールで12ボルト)
- 個別に アドレス指定可能なLED ストリップあたり60個のLED。メーター(購入リンク)
必要な外観に応じて、ストリップを別の方法で配置したり、別の方法で光を拡散したりすることができます。これはあなたが創造的になることができる場所です。私のアプローチが気に入ったら、次のアイテムを使用しました:
- 最も高い IKEA Droppar jar (IKEAリンク)
- 短い長さの PVCパイプ。
- フォームボード
- ホットグルーガン
あなたが行ってアイテムを購入する店にもよりますが、私が考えたすべてのものはRM 83.30前後でした。そこでは、LEDストリップが、たった1メートルでRM40の費用がかかる最も高価な部品でした。
ステップ2:コンポーネントに電力を供給する
コンポーネントへの電力供給は簡単な方法になります。 Arduino NanoのUSBケーブルを使用して、PCに直接接続します。 ACからDC電源などの外部電源を使用する場合は、回路に流れる電流の量を減らすのに役立つ降圧モジュールが必要になります。そうしないと、使用しておらず、接続されているコンポーネントを含めてArduinoを焼く可能性が非常に高くなる可能性があります。
<図>
ショーの主役はサウンドディテクターモジュールです。これにより、Arduinoにアナログ信号が提供されます。これを使用して(うまくいけば)RGBライトを巧みに照らすことができます。これを実行できるようにするには、両方のデバイスに電力を供給する必要があります。幸いなことに、両方とも5ボルトの入力が必要です。降圧モジュールを使用して12ボルトから5ボルトに降圧していますが、5ボルトの電源を直接使用する方が簡単です。 ArduinoとサウンドディテクタボードのVINを正の入力に配線します。次に、ArduinoのGNDと検出器をマイナスに配線します。添付の回路図の黒と赤のワイヤーを見てください。また、LEDストリップの正と負の入力を電源に接続する必要があります。
ステップ3:検出器とストリップ
<図>


3つの部品すべてを電源に接続したら、それらを相互に接続する必要があります。
サウンドディテクタモジュールは、アナログ入力ピンを介してArduinoと通信します。この場合、ピン番号0を使用します。
LEDストリップには、アドレス指定するLEDを理解できるようにするためのデジタルパルスが必要です。したがって、デジタル出力ピンをArduinonanoに接続する必要があります。ピン番号6を使用します。
後でケーブルが狭いスペースで互いに衝突しないように、選択した領域に収縮チューブを使用します。
ここで提供した概略図に従ってください。大丈夫です!
素晴らしい、今ではほとんど電子機器で終わりです!
ステップ4:コードのアップロード
このビルドの最も重要な部分は、間違いなくコードです。このビルドをかなりクールなものからめちゃくちゃ素晴らしいものに変えることができます。このプロジェクトと一緒に提供したコードを使用できます。主な原則は、センサーから取得したアナログ値を、表示するLEDの量にマッピングすることです。
ステップ5:ケーシングの準備
<図>




最初は、蓋がアクリルでできていると思いました。瓶を購入して、それがアクリルではなくガラスであることに気づきました。そのため、ArduinoとLEDを簡単に突き刺して取り付けることができるカバーを作成して、計画を再調整する必要があります。だから私はフォームボードを選びます。
最初のステップ 、正確に円形で、瓶のガラスカバーと同じ直径のフォームボードをカットする必要があります。適切な直径測定ツールがないので、ウェットマーカーを使用して即興でガラスの直径に印を付け、紙にスタンプします。その後、紙をフォームボードに貼り付けますが、紙の円の端をたどってボードを貼り付けます。完璧ではありませんが、すべてのArduinoとLEDコンポーネントを保持するのに十分なはずです。
第2ステップ 、私は瓶の蓋のガラスを割る必要があります。 注意!瓶を厚いビニール袋で覆ってください ガラスが部屋の周りに飛散するのを防ぎ、オープンスペースでそれを行います。あなたの周囲に気づいてください。ガラスを割った後、ジャーリッドのサイドクラックに付着したガラスをすべて取り除いてください。これは、あなたや他の人が、詰まったガラスに自分自身を切ることで怪我をするのを防ぐためです。
第3ステップ 、瓶の蓋の中央に円形のフォームボードを置きます。フォームがきつく締まっていて、ゆるすぎて瓶にぴったりとはまらないことを確認してください。
<図>


第4ステップ、 このプロジェクトのレイアウトを変更する必要があることに気づきました。故障した場合にユーザーがArduinoコンポーネントに簡単にアクセスできるようにしたいと思います。そこで、ミニブレッドボードを使って蓋の中央に置くことにしました。それだけでなく、私はサウンドモジュールからケーブル用に2つの穴を切り、それを瓶の蓋の下部に配置して瓶の内側に入れ、ブレッドボードに接続し、ArduinoがUSBケーブルに接続して機能するための穴をもう1つ切りました。回路の電源として。
<図>



5番目のステップ 、PVCパイプにマスキングテープで印を付け、テープの中央に線を引きます。それから、私はそれを塩ビ管にテープで留めます。マーキングは、塩ビ管を均等に切断し、きれいに切断しようとしていることを示しています。
使用する必要のある塩ビの長さを測定した後、私が付けたマークに従って慎重にカットしました。塩ビ管の長さは、瓶の高さによって異なります。任意の長さを使用できます。
<図>





6番目のステップ 、LEDストリップで切断したPVCパイプを反らせて、わずかに傾斜させ、PVCの上部に向かってらせん状にします。ケーブル管理のために、余分なケーブルの長さをPVCジャーの内側に隠すための小さな穴を作成するようにします。次に、PVCをブレッドボードに立てる方法を見つける必要があります。ホットグルーガンまたは両面テープを使用して、PVCパイプを追加のフォームボードにテープで貼り付け、ブレッドボードの未使用領域に貼り付けることができます。このステップでは、コンポーネントの一部をブレッドボードに接続できます。
提供されている概略図を使用して、すべてのコンポーネントを接続します。
(ブレッドボードの左側の領域が正になり、ブレッドボードの右側の領域が負になります。 `
<図>





7番目のステップでは、サウンドモジュールを瓶の蓋の外側に配置しました。これは、モジュールが後でjarファイルの外でサウンドを簡単に選択できるようにするために意図的に行われます。モジュールを配置した後、ケーブルで接続し、与えられた回路図に示されているように一致させます。次に、すべてのケーブルをセンサーに接続し、Arduinoをブレッドボードに接続します。 Arduinoは垂直にセットアップされているため、回路に電力を供給するためのケーブルは、フォームボードを介してArduinoボードに簡単に接続できます。
<図>
そして、このようにして、私はプロジェクトを完了します。試行錯誤しながら少し時間がかかりましたが、なんとか完了しました。
コード
- Arduinoのコーディング
Arduinoのコーディング Arduino
このコードにより、サウンドモジュールによって検出されたサウンドにLEDが反応できるようになります。#include/ **基本構成** ///セットアップ内のLEDの数#defineNUM_LEDS60 // LEDを制御するピン#defineLED_PIN 6 //センサー値を読み取るピンform#define ANALOG_READ 0 //マイクの低い値と最大値を確認#defineMIC_LOW 0.0#define MIC_HIGH 200.0 / **その他のマクロ* ///以前のセンサー値の数が動作平均に影響しますか?#defineAVGLEN 5 //以前のセンサー値の数がピーク/ HIGH(曲など)にあるかどうかを決定します#defineLONG_SECTOR 20 // Mneumonics#define HIGH 3 #define NORMAL 2 //測定を再開する前に、「現在の平均」音をどのくらいの時間保持しますか#define MSECS 30 * 1000#define CYCLES MSECS / DELAY / *読み取り値が間違っているか奇妙な場合があります。読み値が平均からどれだけ逸脱して破棄されないようにすることができますか? ** /#define DEV_THRESH 0.8 // Arduino loop delay#define DELAY 1float fscale(float originalMin、float originalMax、float newBegin、float newEnd、float inputValue、float Curve); void insert(int val、int * avgs、int len); intcompute_average(int * avgs、int len); void visual_music(); //表示するLEDの数intcurshow =NUM_LEDS; / *まだ実際には使用されていません。サウンドリアクティブモードと一般的なグラデーションパルス/静的カラー* / intモード=0を切り替えることができると考えられています; //モードに基づいて異なる色を表示します.intsongmode =NORMAL; //最後のCYCLESunsignedlongsong_avg;の平均サウンド測定// song_avgがリセットされてからの反復回数intiter =0; // relitfloatでない場合はLEDが黒にフェードする速度fade_scale =1.2; // Led arrayCRGB leds [NUM_LEDS]; / *「正規化」に使用される短いサウンド平均入力値。センサー入力を直接使用する代わりに、短い平均を使用します* / int avgs [AVGLEN] ={-1}; //長い音avgintlong_avg [LONG_SECTOR] ={-1}; //頻度を追跡する、および特定のmodestructにヒットした時間time_keeping {unsigned long times_start;短い時間;}; // cyclestructcolorごとに各色をインクリメントまたはデクリメントする量{intr; int g; int b;}; struct time_keeping high; struct color Color; void setup(){Serial.begin(9600); //すべてのライトを設定して、すべてが期待どおりに機能していることを確認しますFastLED.addLeds (leds、NUM_LEDS); for(int i =0; i (song_avg / iter * 1.1)){if(high.times!=0){if(millis()-high.times_start> 200.0){high.times =0; songmode =NORMAL; } else {high.times_start =millis(); high.times ++; }} else {high.times ++; high.times_start =millis(); }} if(high.times> 30 &&millis()-high.times_start <50.0)songmode =HIGH; else if(millis()-high.times_start> 200){high.times =0; songmode =NORMAL; }} //ランプ内の音を視覚化するためのメイン関数voidvisualize_music(){int Sensor_value、mapped、avg、longavg; //実際のセンサー値sensor_value =analogRead(ANALOG_READ); // 0の場合、すぐに破棄します。おそらく正しくなく、CPUを節約します。 if(sensor_value ==0)return; //過去の平均から大きく外れた読み取り値を破棄します。マップ済み=(float)fscale(MIC_LOW、MIC_HIGH、MIC_LOW、(float)MIC_HIGH、(float)sensor_value、2.0); avg =Compute_average(avgs、AVGLEN); if(((avg --mapped)> avg * DEV_THRESH))// || ((avg --mapped)<-avg * DEV_THRESH))return; //新しい平均を挿入します値insert(mapped、avgs、AVGLEN); insert(avg、long_avg、LONG_SECTOR); //「曲の平均」センサー値を計算しますsong_avg + =avg; iter ++; if(iter> CYCLES){song_avg =song_avg / iter; iter =1; } longavg =Compute_average(long_avg、LONG_SECTOR); // HIGHモードに入るかどうかを確認しますcheck_high(longavg); if(songmode ==HIGH){fade_scale =3; Color.r =5; Color.g =3; Color.b =-1; } else if(songmode ==NORMAL){fade_scale =2; Color.r =-1; Color.b =2; Color.g =1; } //点灯するLEDの数を決定しますcurshow =fscale(MIC_LOW、MIC_HIGH、0.0、(float)NUM_LEDS、(float)avg、-1); / *異なるLEDを設定します。高すぎる値と低すぎる値を制御します。試してみるのが楽しいこと:一方向のオーバーフローを考慮しないでください。いくつかの興味深い光の効果が現れます! * / for(int i =0; i 255)leds [i]。 r =255; else if(leds [i] .r + Color.r <0)leds [i] .r =0;それ以外の場合、leds [i] .r =leds [i] .r + Color.r; if(leds [i] .g + Color.g> 255)leds [i] .g =255; else if(leds [i] .g + Color.g <0)leds [i] .g =0;それ以外の場合、leds [i] .g =leds [i] .g + Color.g; if(leds [i] .b + Color.b> 255)leds [i] .b =255; else if(leds [i] .b + Color.b <0)leds [i] .b =0;それ以外の場合、leds [i] .b =leds [i] .b + Color.b; //他のすべてのLEDは、最終的な完全な暗闇へのフェージングジャーニーを開始します} else {leds [i] =CRGB(leds [i] .r / fade_scale、leds [i] .g / fade_scale、leds [i] .b / fade_scale ); } FastLED.show(); } //開始ポインタと長さを指定して、int配列の平均を計算します。compute_average(int * avgs、int len){int sum =0; for(int i =0; i 10)curve =10; if(curve <-10)curve =-10;曲線=(曲線* -.1); //-反転とスケーリング-これはより直感的に思えます-正の数値は出力曲線のハイエンドにより多くの重みを与えます=pow(10、curve); //線形スケールを他のpow関数の対数指数に変換します//範囲外のinputValuesをチェックしますif(inputValue originalMax){inputValue =originalMax; } //ゼロ参照値OriginalRange =originalMax --originalMin; if(newEnd> newBegin){NewRange =newEnd --newBegin; } else {NewRange =newBegin --newEnd; invFlag =1; } zeroRefCurVal =inputValue --originalMin; normalizedCurVal =zeroRefCurVal / OriginalRange; // 0に正規化-1float // originalMin> originalMaxをチェックします-他のすべての場合の計算、つまり負の数は(originalMin> originalMax){return0;の場合はうまくいくようです。 } if(invFlag ==0){rangedValue =(pow(normalizedCurVal、curve)* NewRange)+ newBegin; } else //範囲を反転する{rangedValue =newBegin-(pow(normalizedCurVal、curve)* NewRange); } return rangedValue;}
回路図

製造プロセス