第1步:測(cè)試您的LED
將所有東西布置在適當(dāng)大小的工作空間上。插入電烙鐵。您要做的第一件事就是測(cè)試您的LED。
我很快了解到這些燈不喜歡在沒有數(shù)據(jù)的情況下響應(yīng)電源。如果您跳起來嘗試僅用電源測(cè)試它們而它們不起作用,請(qǐng)稍等片刻。他們可能只需要注入一些代碼即可激活LED。在切割LED燈條之前,請(qǐng)遵循本指南將燈條連接至Arduino/電源。然后運(yùn)行此處找到的示例代碼。
注意:一端確實(shí)已預(yù)焊接了導(dǎo)線。隨意嘗試一下。在卷軸上,我收到了預(yù)包裝的電纜,但沒有用(哼哼聲),所以我不得不切斷兩個(gè)LED并從卷軸的裸露端開始。
步驟2:焊接VU防護(hù)板
抓住Shifty VU防護(hù)板和Arduino。
VU防護(hù)板帶有一組接頭引腳,用于連接到Arduino的。這些接頭需要焊接,因?yàn)檫B接太松,甚至不能出于測(cè)試目的而簡(jiǎn)單地插入。有關(guān)如何將屏蔽層焊接到Arduino的技巧,請(qǐng)參閱Sparkfun的這份出色指南。
步驟3:切割LED燈條
對(duì)于這個(gè)項(xiàng)目,我使用了3條帶,每條帶38個(gè)LED。
您可以決定要保留多長(zhǎng)時(shí)間。較短的燈條(少于10個(gè)LED)可能不會(huì)給您帶來很大的效果,但是請(qǐng)確定適合您的項(xiàng)目的長(zhǎng)度,并相應(yīng)調(diào)整本指南中的步驟。
LDP8806燈帶每節(jié)帶有兩個(gè)LED,每16個(gè)LED與焊錫相連。您可以在插排的任何點(diǎn)進(jìn)行切割和連接,但是如果需要在連接點(diǎn)斷開插排的連接,請(qǐng)務(wù)必拆焊。觀看此視頻,該視頻顯示了如何分割這種類型的條帶。
步驟4:連接準(zhǔn)備
在本指南中,我將使用黑色,紅色,黃色和綠色的線。您可以使用所需的任何顏色,但是請(qǐng)記住,在以下步驟中將參考這些顏色。
剝開兩端的線以獲得每種四種顏色的幾根導(dǎo)線。
獲取您的LED指示燈。您想找到箭頭指向遠(yuǎn)離帶狀切口的末端。
小心地切掉密封條的末端,這樣就可以到達(dá)連接器(或?qū)⑵渫耆械簦?/p>
用焊料固定連接器。這樣可以更輕松地焊接電線。再次注意箭頭的方向;注意它是如何指向遠(yuǎn)離焊料的。這就是數(shù)據(jù)流的方向,如果將它們混在一起,可能會(huì)損壞條帶。
只需檢查一下,箭頭方向是否正確?如果沒有,您將破產(chǎn)。
第5步:連接LED
這些LED有四個(gè)引腳;地,5v,C(時(shí)鐘)和D(數(shù)據(jù))。條帶的某些部分上標(biāo)有值,有些則沒有。沒關(guān)系,只要知道您要焊接到哪個(gè)引腳即可。繼續(xù)操作時(shí)請(qǐng)參閱接線圖,并仔細(xì)檢查條帶面對(duì)的方向。
將條帶焊接在一起,確保每個(gè)輸出都連接到其各自的輸入。
第6步:連接到Arduino/電源
獲取5V電源和Arduino。
從在插排布置的輸入端開始,將綠色數(shù)據(jù)線連接到引腳2,將黃色時(shí)鐘線連接到引腳3。紅色5V線直接連接到電源,并且電源和LED燈帶與驅(qū)動(dòng)器共享公共接地。 Arduino。
請(qǐng)參閱上面的接線圖,并仔細(xì)檢查所有連接。
第7步:代碼
將Arduino連接到您的PC。抓住您的音頻分配器并將其連接到PC。使用一根音頻電纜連接至VU屏蔽,另一根電纜連接至揚(yáng)聲器。將電源適配器連接到電源插座。
一旦一切都連接好,請(qǐng)從步驟0開始運(yùn)行測(cè)試程序以再次檢查所有指示燈是否點(diǎn)亮。
從Github下載項(xiàng)目代碼并添加到您的Arduino庫(kù)。打開Arduino IDE并上傳。
#include “fix_fft.h”
#include “HSBColor.h”
#include “LPD8806.h”
#include “SPI.h”
// Choose 2 pins for Arduino output
#define DATA_PIN 2
#define CLOCK_PIN 3
// Defines the number and arrangement of LEDs in the visualizer. For a vertical setup, this will determine the space to light ratio as they wrap
#define NUM_BARS 12
#define BAR_LENGTH 12
// The difference in hue for each bar after the first.
#define BAR_HUE_DIFF 8
// Create a LPD8806 instance to control the strip
LPD8806 strip = LPD8806(NUM_BARS * BAR_LENGTH, DATA_PIN, CLOCK_PIN);
// The current hue of the first strip of the bar
int curHue = 0;
// FFT data storage
char im[NUM_BARS * 2], data[NUM_BARS * 2];
int prev[NUM_BARS];
// HSB/RGB data buffer
int rColor[3];
// Converts a 2d visualizer point to it‘s location on the strip
int getStripLocation(int col, int row)
{
// Controls the strip in alternating directions. This allows for chaining horizontal bars end-to-end
if (col % 2 == 0)
row = BAR_LENGTH - row - 1;
return col * BAR_LENGTH + row;
}
void setup()
{
analogReference(DEFAULT);
strip.begin();
strip.show();
}
void loop()
{
uint16_t i, j, k;
uint32_t color;
// Read analog input
for (i = 0; i 《 NUM_BARS * 2; i++)
{
int val = (analogRead(3) + analogRead(2)) / 2;
data[i] = val * 2;
im[i] = 0;
delay(1);
}
// Set the background colour of the LEDs when they are not receiving music data
for (i = 0; i 《 NUM_BARS * BAR_LENGTH; i++)
strip.setPixelColor(i, 20, 20, 40);
// Set the proper pixels in each bar
for (i = 0; i 《 NUM_BARS; i++)
{
// Each LED bar has 2 FFT frequencies that are summed together
int fft_start = i * 2;
int fft_count = 2;
// Get a positive data point from the FFT
int curData = 0;
for (k = 0; k 《 fft_count; k++)
curData += sqrt(data[fft_start + k] * data[fft_start + k] + im[fft_start + k] * im[fft_start + k]);
// Account for the ShiftyVU’s filtering
if (i == 0 || i == 7)
curData /= 2;
// Smoothly drop from peaks by only allowing data points to be one LED lower than the previous iteration.
// This prevents seizure-inducing flashes which might be caused by the ShiftyVU‘s filtering (?)
if (prev[i] 》 BAR_LENGTH && curData 《 prev[i] - BAR_LENGTH)
curData = prev[i] - BAR_LENGTH;
// Base color for each bar
H2R_HSBtoRGB((curHue + i * 8) % 360, 99, 99, rColor);
color = strip.Color(rColor[0] / 2, rColor[1] / 2, rColor[2] / 2);
// If only the first LED is lit, but not fully. This is outside the for loop because the subtraction of
// BAR_LENGTH causes the value to wrap around to a very high number.
if (curData 《 BAR_LENGTH)
{
int brightness = curData * 99 / BAR_LENGTH;
H2R_HSBtoRGB((curHue + i * BAR_HUE_DIFF) % 360, 99, brightness, rColor);
// Colour of the base of each bar. Change this to match the background colour of the LEDs
strip.setPixelColor(i, 20, 20, 40);
}
else
{
for (j = 0; j 《 BAR_LENGTH; j++)
{
// Light up each fully lit LED the same way.
if (curData - BAR_LENGTH 》 j * BAR_LENGTH)
strip.setPixelColor(getStripLocation(i, j), color);
else if (curData 》 j * BAR_LENGTH)
{
// Dims the last LED in the bar based on how close the data point is to the next LED.
int brightness = (j * BAR_LENGTH - curData) * 99 / BAR_LENGTH;
H2R_HSBtoRGB((curHue + i * BAR_HUE_DIFF) % 360, 99, brightness, rColor);
strip.setPixelColor(getStripLocation(i, j), strip.Color(rColor[0] / 2, rColor[1] / 2, rColor[2] / 2));
}
}
}
// Store all of the data points for filtering of the next iteration.
prev[i] = curData;
}
// Cycle through all the colors.
if (curHue == 359)
curHue = 0;
else
curHue++;
// Display the strip.
strip.show();
}
步驟8:播放一些音樂
一旦上傳了所有內(nèi)容,就播放一些音樂!現(xiàn)在,您應(yīng)該具有類似的內(nèi)容(我的上面覆蓋有用于擴(kuò)散的光面板)。
-
led
+關(guān)注
關(guān)注
240文章
23062瀏覽量
657038 -
聲控
+關(guān)注
關(guān)注
3文章
92瀏覽量
32804 -
頻譜分析儀
+關(guān)注
關(guān)注
16文章
1085瀏覽量
85210
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論