제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
|
프로젝트
이 프로젝트는 Arduino Nano와 8x32 WS2812B RGB Led Matrix를 사용하여 RGB 32밴드 오디오(음악) 주파수 스펙트럼 시각화 장치를 만들기 위한 것입니다.
영감을 준 오리지널 프로젝트
Shajeeb 에 감사드립니다. MAX72xx led 매트릭스를 기반으로 한 원래 프로젝트의 저자. RGB WS2812B Led Matrix에 적응하도록 led 매트릭스의 파일럿 부분만 수정했습니다.
원본 프로젝트 링크:32-Band Audio Spectrum Visualizer Analyzer
WS2812B RGB Led 매트릭스
5050 SMD 고휘도 LED를 기반으로 하는 RGB LED 매트릭스를 사용하면 RGB 매트릭스가 LED당 10mA 이상을 흡수할 수 있으므로 외부 전원 공급 장치를 사용해야 하므로 최대 밝기로 켜진 모든 LED가 2.5A 이상을 흡수할 수 있습니다.
이러한 이유로 USB 케이블이 연결되어 있지 않을 때 Arduino에 독립 실행형 모드로 전원을 공급할 수 있고 Arduino가 RGB 매트릭스의 전원이 되는 것을 피하기 위해 +5V에서 다이오드를 직렬로 삽입했습니다. 공급할 수 없는 전류로 보드의 내부 회로에 과부하가 걸립니다.
원래 프로젝트에는 입력 다이오드 외에도 가능한 전압 피크로부터 LED 매트릭스 입력을 보호하기 위해 Arduino 핀 D6과 데이터 입력 사이에 직렬로 390옴 저항을 추가하고 개선을 위해 1000µF 12V 커패시터를 추가했습니다. Arduino 공급 전압 안정성.
하드웨어 조립
메인 사진에서 볼 수 있듯이 3.5mm 암 잭 소켓으로 교체할 수 있는 2개의 RCA 오디오 소켓(보드에 직접 납땜)을 사용하여 4x6cm 멀티 홀 보드에서 첫 번째 프로토타입을 만들었습니다. 윙윙거리는 소리를 피하기 위해 중요한 것은 소스와 카드 오디오 입력을 차폐 케이블로 연결하는 것입니다. 또 다른 팁은 Arduino와 led 매트릭스 간의 연결을 최대한 짧게 유지하는 것입니다.
코드
결국, 모든 소프트웨어는 FFT 라이브러리를 통한 샘플링 절차 작성자의 훌륭한 작업과 Shajeeb의 최종 구현을 기반으로 합니다.
두 가지 기능을 추가했습니다:
첫 번째는 GetLedFromMatrix(...)입니다. 행렬을 행과 열로 매핑하고 행과 열 좌표를 통해 256개 LED 각각을 처리할 수 있습니다.
두 번째는 내가 임의로 SetColumn(...) 이라고 불렀던 것입니다. - 오디오 디지털화로 얻은 피크 값(0에서 7 사이의 값)을 기반으로 각 열의 LED를 켭니다. ) 및 2차원 배열의 미리 설정된 색상을 기반으로 합니다. 값을 변경하고 색상을 원하는 대로 변경할 수 있습니다. 코드를 단순화하기 위해 0에서 255 사이의 값에서 시작하여 setPixelColor 함수에 직접 전달될 부호 없는 32비트 길이 값을 반환하는 Wheel()(Adafruit의 Neopixel 라이브러리에 첨부된 데모에서 가져옴)이라는 소브루틴을 사용했습니다. 이것에서 당신은 RGB 색상 값을 저장하기 위해 32비트 변수를 가능한 한 사용하지 않는 Arduino의 메모리 제한을 염두에 두고 마음대로 플레이할 수 있습니다.
오디오 균등화
또한 PC 마더보드에 통합된 사운드 카드에서 나오는 오디오로 테스트를 실행했기 때문에 주파수 응답을 개선하기 위해 32개 값의 바이트 배열을 추가했습니다. 이 바이트 배열은 실제로 저음과 저음을 감쇠하는 이퀄라이제이션 곡선을 구성합니다. 고음을 향상시킵니다. 필요하지 않은 경우 EQ_ON 변수를 false 로 설정하기만 하면 됩니다. 또는 eq[32]의 32개 값을 변경하여 감쇠 수준을 변경합니다. 배열에서 값 100은 진폭을 변경하지 않고 100보다 작은 값은 감쇠하고 100보다 큰 값은 주파수 대역을 강조합니다.
주도 밝기
매트릭스의 밝기는 코드에서 32(BRIGHTNESS const)로 사전 설정됩니다. WS2812B 매트릭스(종이 위)의 최대 밝기 값은 255이지만 이미 값이 100보다 크면 LED 조명이 불행히도 흰색에서 옅은 노란색으로 바뀝니다. 의 오른쪽 커넥터에 있습니다.
나는 여전히 노력하고 있습니다 ...
마지막으로 최대 밝기 64를 사용하는 경우 1A 전원 공급 장치로 충분할 것이고 그렇지 않으면 2A가 필수적입니다.
향후 업데이트
OpenMusicLabs FHT를 사용하는 새 버전을 개발 중입니다. Arduino FFT보다 몇 배 빠른 것으로 판명된 라이브러리입니다.
계속 지켜봐 주세요. :)
제발 나의 나쁜 영어를 용서해 주세요. 저는 구글 번역기를 사용했습니다.
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">/* Copyright (c) 2019 Shajeeb TM 이에 따라 이 소프트웨어 및 관련 문서 파일("소프트웨어")의 사본을 얻는 모든 사람에게 다음을 포함하여 제한 없이 소프트웨어를 취급할 수 있는 권한이 부여됩니다. 다음 조건에 따라 소프트웨어 사본을 사용, 복사, 수정, 병합, 게시, 배포, 하위 라이선스 및/또는 판매할 수 있는 권한과 소프트웨어가 제공된 사람에게 그렇게 하도록 허용할 수 있는 권한:저작권 고지 및 이 허가 고지는 소프트웨어의 모든 사본 또는 상당 부분에 포함되어야 합니다. 소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않는 어떠한 종류의 명시적 또는 묵시적 보증 없이 "있는 그대로" 제공됩니다. 어떤 경우에도 저자 또는 저작권자는 계약, 불법 행위 또는 기타의 행위로 인해 소프트웨어 또는 다른 거래와 관련하여 발생하는 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어. Janux의 WS2812B Led Matrix 버전*/#include섹션>#include #include #define SAMPLES 64 //2의 거듭제곱이어야 함#define xres 32 // 총 수 디스플레이의 열은 <=SAMPLES/2#define yres 8 // 디스플레이의 총 행 수#define ledPIN 6 // Led Matrix를 제어하기 위한 파인트#define NUM_LEDS(xres * yres)#define BRIGHTNESS 32#define buttonPin 5 // displaycolorbyte를 변경할 푸시버튼 핀의 번호 yvalue;byte displaycolumn, displayvalue;int peaks[xres];byte state =HIGH; // 입력 핀바이트의 현재 판독값 previousState =LOW; // 입력 핀바이트의 이전 판독값 displaycolor =0;//sampligdouble vReal[SAMPLES];double vImag[SAMPLES];byte data_avgs[xres];arduinoFFT FFT =arduinoFFT(); // FFT 객체 unsigned long lastDebounceTime =0; // 마지막으로 출력 핀이 토글된 시간dunsigned long debounceDelay =100; // 디바운스 시간; 출력이 깜박이면 증가// 매개변수 1 =매트릭스의 LED 수// 매개변수 2 =핀 번호(대부분 유효함)// 매개변수 3 =픽셀 유형 플래그, 필요에 따라 함께 추가:// NEO_KHZ800 800 KHz 비트스트림(대부분 NeoPixel products w/WS2812 LEDs)// NEO_KHZ400 400 KHz(클래식 'v1'(v2 아님) FLORA 픽셀, WS2811 드라이버)// NEO_GRB 픽셀은 GRB 비트스트림용으로 연결됨(대부분의 NeoPixel 제품)// NEO_RGB 픽셀은 RGB 비트스트림용으로 연결됨( v1 FLORA 픽셀, v2 아님)Adafruit_NeoPixel 픽셀 =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800);// 저음을 감쇠하고 고음을 향상시키는 EQ 필터// 일반적으로 저음이 많고 고주파수가 좋지 않은 PC 사운드 카드에 유용합니다.bool EQ_ON =true; // eqbyte를 비활성화하려면 false로 설정 eq[32] ={50, 55, 60, 70, 75, 80, 85, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 225, 255 };//setColumn 함수에서 사용되는 단일 led의 색상 정의, 사용자 정의 색상의 경우 0//색상은 다음과 같습니다. Wheel 함수로 계산, 아래 바이트 색상 참조[][8] ={ {170, 160, 150, 140, 130, 120, 1, 1}, {1, 5, 10, 15, 20, 25, 90, 90} , {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 0, 0}, {170, 160, 150, 140, 130, 120, 1, 1}, {170, 160, 150, 140, 130, 120, 1, 1}}; 무효 설정() { pixel.begin (); 픽셀.setBrightness(밝기); // FFT 연산 시작 ADCSRA =0b11100101; // ADC를 자유 실행 모드로 설정하고 프리 스칼라를 32(0xe5)로 설정 ADMUX =0b00000000; // 핀 A0 및 외부 전압 참조 사용}void loop() { // ++ 샘플링 for (int i =0; i peaks[i]) peaks[i] =yvalue; //피크 저장> previuos peak yvalue =peaks[i]; 표시 열 =나; 표시값 =y값; setColumn(디스플레이 열, 디스플레이 값); // 버킷 그리기 } pixel.show(); // 버킷 표시 displaycolorChange(); // 버튼을 눌러 색상 모드를 변경하는지 확인}//----------------------------------------------------- ----------------------------// y에 따른 x 열의 라이트 led valuevoid setColumn(byte x, byte y) { byte led , 나; for (i =0, i i) { switch (displaycolor) { case 4://배열 값에 0을 입력하여 피크 색상을 사용자 정의 if (colors[displaycolor][i]> 0) { //색상 배열에 정의된 일반 색상 pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } else { //배열 값이 0인 봉우리의 사용자 지정 색상 pixel.setPixelColor(led, 255, 255, 255); //LED 번호, R, G, B 값 } break; 사례 5://열별로 색상 변경 pixel.setPixelColor(led, Wheel(x * 16)); 부서지다; 사례 6://행별로 색상 변경 pixel.setPixelColor(led, Wheel(i * 36)); 부서지다; 기본값://디스플레이 색상 설정 -> 0에서 3까지의 디스플레이 색상 //색상은 색상 배열에 정의되어 있습니다. pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); }//END SWITCH } else { pixel.setPixelColor(led, 0); } }}//=======================================================================// x,y 좌표로 지도된 수를 계산// 수평으로 배치된 구불구불한 레이아웃으로 WS2812B에 유효함 // 및 오른쪽 하단에 led 0(오른쪽에 입력 커넥터)// 입력 값:x=0-31, y=0-7, 0에서 255까지의 led 번호 반환//==========================================================================바이트 GetLedFromMatrix(바이트 x, 바이트 y) { x =xres - x - 1; if (x &0x01) { //홀수 열은 뒤로 증가 return ((x + 1) * yres - y - 1); } else { //열도 정상적으로 증가합니다. return ((x + 1) * yres - yres + y); }}//==========================================================================무효 displaycolorChange() { int 읽기 =digitalRead(buttonPin); if (reading ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) // 누를 때만 작동합니다. { displaycolor++; if (디스플레이 색상> 6) 디스플레이 색상 =0; lastDebounceTime =밀리(); } previousState =reading;}/* Adafruit Neopixel 데모 스케치의 유틸리티 색상 값을 얻으려면 0에서 255 사이의 값을 입력하십시오. 색상은 R - G - B - 다시 R로의 전환입니다.*/unsigned long Wheel(byte WheelPos) { WheelPos =255 - WheelPos; if (WheelPos <85) { return pixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) { WheelPos -=85; 반환 pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}
제조공정
구성품 및 소모품 Arduino Nano R3 × 1 연산 증폭기 IC TL061 × 1 저항 10k 옴 × 2 저항 1M 옴 × 1 세라믹 디스크 커패시터, 39pF × 1 소형 1-2W 트래픽의 2차 코일 × 1 필요한 도구 및 기계 납땜 인두(일반) 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 지진계는 지진을 감지하고 강도
구성품 및 소모품 Arduino UNO × 1 Adafruit Standard LCD - 파란색 바탕에 16x2 흰색 × 1 SparkFun 푸시버튼 스위치 12mm × 4 저항 10k 옴 × 4 저항 221옴 음, 220옴... × 2 단일 회전 전위차계 - 100,000옴 × 1 부저 × 1 브레드보드(일반) × 1 점퍼 와이어(일반) × 1