산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

FHT 오디오 스펙트럼 시각화 장치

구성품 및 소모품

Arduino Nano R3
× 1
WS2812B 8X32 RGB LED 매트릭스
× 1
저항 4.75k 옴
× 3
저항 100k 옴
× 2
저항 10k 옴
× 2
스루 홀 저항기, 390옴
× 1
1N4007 – 고전압, 고전류 정격 다이오드
1N4004도 괜찮습니다.
× 1
커패시터 100nF
× 2
커패시터 1000μF
× 1
SparkFun 푸시버튼 스위치 12mm
또는 상자에 회로를 삽입하려는 경우 두 개의 패널 버튼
× 2
4x6cm 일반 프로토타입 보드
× 1
PCB 스테레오 RCA 암 플러그
× 1

필요한 도구 및 기계

납땜 인두(일반)
3.5mm 오디오 잭 케이블 - 스테레오 RCA 커넥터

이 프로젝트 정보

Arduino FHT 라이브러리

FHT는 잘 알려진 FFT와 정확히 동일한 작업을 수행하지만 이것과 달리 실제 데이터만 사용하는 반면 FFT는 복잡한 데이터에 대해 작동하므로 FHT는 절반의 처리 능력과 절반의 시스템 메모리를 사용합니다.

이 라이브러리는 FFT lib에서 사용하는 실제 값과 허수 값에 대해 하나씩 데이터 샘플링을 위해 2개 대신 단일 배열을 사용합니다. 또한 복잡한 부동 소수점 로그 계산이 있는 루프를 피하고 대신 일부 숫자 테이블을 사용하여 복잡한 수학 계산을 단순화합니다. .

단점은 샘플링을 수행하는 데 사용되는 배열 크기 값의 절반을 항상 반환한다는 것입니다. 이로 인해 오디오 범위의 양쪽 끝에서 특정 해상도와 정밀도가 손실됩니다. 그러나 특정한 경우에는 측정기를 개발할 필요가 없고 간단한 장치가 필요합니다. 극도의 정밀도가 필요하지 않으며 음악적 리듬에 따라 소수의 LED만 켜면 됩니다.

물론 이것은 FHT 라이브러리의 모달리티 작업에 대해 논의하기에 적절한 장소가 아닙니다. 더 자세히 알고 싶은 사람은 Open Music Lab 웹사이트를 참조하여 사용된 트릭을 이해하는 데 필요한 모든 문서를 찾을 수 있습니다. 다양한 기능과 Arduino용으로 이미 작성된 일부 일반 예제.

FFT 라이브러리는 빠르기 때문에 깜박임을 줄이기 위해 코드에 지연을 삽입해야 했습니다. 최종 결과를 즉시 알 수 있습니다. 디스플레이는 종종 음악에 뒤처지는 것처럼 보였던 FFT 라이브러리를 사용하는 버전보다 훨씬 빠르고 반응성이 뛰어납니다. 시스템 리소스를 덜 사용하여 추가 기능을 관리하기 위해 몇 줄의 코드를 추가할 수 있었습니다.

새 버전

프로젝트는 이전 버전과 동일하므로 이미 이전 버전을 만든 사람들은 버튼과 10K 저항을 추가하고 코드를 업데이트하기만 하면 됩니다.

FHT 라이브러리의 구현 외에도 이 버전에는 다음과 같은 추가 기능이 있습니다.

<울>
  • 밝기 조정을 위한 추가 버튼이 있음
  • <울>
  • EEPROM에 색상 및 밝기 설정을 저장하여 다음에 켤 때 다시 로드할 수 있습니다.
  • <울>
  • 버튼을 눌렀을 때와 켜져 있을 때 색상 및 밝기 설정 수준을 표시합니다(비활성화 가능).
  • <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • FHT 코드 버전
  • FHT 코드 버전Arduino
    /* Copyright (c) 2020 Janux 이 소프트웨어 및 관련 문서 파일("소프트웨어")의 사본을 얻는 모든 사람에게 다음을 포함하여 제한 없이 소프트웨어를 처리할 수 있는 권한이 무료로 부여됩니다. 다음 조건에 따라 소프트웨어 사본을 사용, 복사, 수정, 병합, 게시, 배포, 재라이센스 부여 및/또는 판매하고 소프트웨어가 제공된 사람에게 그렇게 하도록 허용하는 권리를 제한합니다. 위의 저작권 통지 및 이 허가 통지는 소프트웨어의 모든 사본 또는 상당 부분에 포함되어야 합니다. 소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않는 어떠한 종류의 명시적 또는 묵시적 보증 없이 "있는 그대로" 제공됩니다. 어떤 경우에도 저자 또는 저작권자는 계약, 불법 행위 또는 기타의 행위로 인해 소프트웨어 또는 다른 거래와 관련하여 발생하는 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어. Shajeeb에서 만든 MAX72xx LED 매트릭스 및 FFT 라이브러리에 대한 원래 프로젝트를 기반으로 합니다. Norvegian Creation의 Ragnar Ranøyen Homb의 작업을 기반으로 하는 구성 설정 섹션.*/#define LIN_OUT 1 //FHT 선형 출력 크기#define FHT_N 128 //FHT에 대한 샘플 설정, 2의 거듭제곱이어야 함#include  #define xres 32 //디스플레이의 총 열 수, 반드시 <=SAMPLES/2#define yres 8 //디스플레이의 총 행 수#define ledPIN 6 //LED를 제어하기 위한 파인트 출력#define NUM_LEDS(xres * yres) //매트릭스의 총 led#include #define colorPIN 5 //ledcolor를 변경하기 위한 핀#define 밝기PIN 10 //밝기를 변경하기 위한 핀byte displaycolor =0; //기본 색상 값byte 밝기 =1; //기본 밝기 레벨#include #define CONFIG_START 32 //메모리 시작 위치#define CONFIG_VERSION "VER01" //구성 버전 구성typedef struct { char version[6]; 바이트 표시색; 바이트 밝기;} configuration_type;configuration_type CONFIGURATION ={ CONFIG_VERSION, displaycolor, 밝기};바이트 yvalue;int peaks[xres];바이트 상태 =HIGH; // 입력 핀바이트의 현재 판독값 previousState =LOW; // pinunsigned 입력에서 이전 판독값 long lastDebounceTime =0; // 마지막으로 출력 핀이 토글된 시간dunsigned long debounceDelay =100; // 디바운스 시간; 출력이 깜박이면 증가합니다.byte data_avgs[xres]; //샘플리그용 어레이// 매개변수 1 =매트릭스의 LED 수// 매개변수 2 =핀 번호// 매개변수 3 =픽셀 유형 플래그, 필요에 따라 함께 추가:// NEO_KHZ800 800 KHz 비트스트림(대부분의 NeoPixel 제품(WS2812 LED 포함) )// 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 필터바이트 eq[32] ={ 60, 65, 70, 75, 80, 85, 90, 95, 001, 90, 95, 0100 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, EQ 200, bool =true // eq를 비활성화하려면 false로 설정합니다. // led에 대해 5가지 색상 세트를 정의하고, 단일 사용자 정의 colorbyte에 대해 0을 정의합니다. [][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, 110, 0}};//디스플레이 설정을 위한 문자 정의byte charBitmap[] ={ 0x1C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 는 0x08, 0x08에서, 0x08에서,가 0x1c, 0x0C, 0x12를,은 0x04, 0x08에서, 0x10, 명령에 0x1E, 0x0C, 0x12를,는 0x02, 0x06 일, 0x12를, 0x0C, 0x10, 명령은 0x10, 0x10, 명령하는 0x14,에 0x1E,은 0x04,에 0x1E, 0x10, 명령에 0x1E, 는 0x02, 0x12를, 0x0C,에 0x1E, 0x10, 명령 0x10, 명령에 0x1E, 0x12를,에 0x1E,에 0x1E, 0x02로,은 0x04, 0x08에서,는 0x08, 0x08에서, 0x0C, 0x12를, 0x0C, 0x12를,는 0x12, 0x0C,가 0x1c, 0x12를,가 0x1c, 0x12를, 0x12, 0x1C}; 무효 설정() { pixel.begin(); // Led Matrix 초기화 // FFT 연산 시작 ADCSRA =0b11100101; // ADC를 자유 실행 모드로 설정하고 프리스케일러를 32(0xe5)로 설정 ADMUX =0b00000000; // 핀 A0 및 외부 전압 참조 사용 // EEPROM에서 구성 데이터 읽기 if (loadConfig()) { displaycolor =CONFIGURATION.displaycolor; 밝기 =CONFIGURATION.brightness; } //EEPROM에서 로드된 밝기 설정 pixel.setBrightness(brightness * 24 + 8); //시작 시 현재 구성 표시 //이를 원하지 않으면 true를 false로 변경 showSettings(3, true);}void loop() { while (1) { // 지터 감소 Sampling(); // FHT 라이브러리는 하나의 데이터 배열만 사용합니다. // FHT 결과를 no와 일치하도록 재정렬합니다. 표시 열 SendToDisplay(); // 측정값에 따라 디스플레이로 전송 colorChange(); // 버튼이 눌렸는지 확인하여 색상 밝기 변경Change(); // 버튼이 눌렸는지 확인하여 밝기 변경 delay(10); // 깜박임을 줄이기 위한 지연 (FHT가 너무 빠름 :D) }}void Sampling() { for (int i =0; i  peaks[i]) peaks[i] =yvalue; // 이전 피크인 경우 피크를 저장합니다. yvalue =peaks[i]; // 표시할 피크 선택 setColumn(i, yvalue); // 열 그리기 } pixel.show(); // show column}// y에 따라 x 열의 led를 켭니다. valuevoid setColumn(byte x, byte y) { int led, i; for (i =0, i  i) { switch (displaycolor) { case 4:if (colors[displaycolor][i] ==0) { // 0 값으로 사용자 정의 색상 표시 배열에서 pixel.setPixelColor(led, 255, 255, 255); //withe } else { // 색상 배열에 정의된 표준 색상 pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } 부서지다; 사례 5://열별로 색상 변경 pixel.setPixelColor(led, Wheel(x * 16)); 부서지다; 사례 6://행별로 색상 변경 pixel.setPixelColor(led, Wheel(i * y * 3)); 부서지다; 사례 7://색상 변경... country :D //이탈리아 국기 //if (x <11) pixel.setPixelColor(led, 0, 255, 0); //if (x> 10 &&x <21) pixel.setPixelColor(led, 255, 255, 255); //if (x> 20) pixel.setPixelColor(led, 255, 0, 0); //별과 줄무늬 if (i  debounceDelay) { displaycolor++; if (디스플레이 색상> 7) 디스플레이 색상 =0; showSettings(1, true); //이 saveConfig()를 원하지 않으면 false로 설정합니다. lastDebounceTime =밀리(); } 이전 상태 =읽기;} 무효 밝기 변경() { int 읽기 =digitalRead(brightnessPIN); if (읽기 ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) { 밝기++; if (밝기> 7) 밝기 =0; pixel.setBrightness(밝기 * 24 + 8); showSettings(2, true); //이 saveConfig()를 원하지 않으면 false로 설정합니다. 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);}// 유효한 설정인 경우 로컬 CONFIGURATION에 EEPROM의 내용을 로드합니다.int loadConfig() { if (EEPROM.read(CONFIG_START + 0) ==CONFIG_VERSION[0] &&EEPROM.read(CONFIG_START + 1) ==CONFIG_VERSION[1] &&EEPROM.read(CONFIG_START + 2) ==CONFIG_VERSION[2] &&EEPROM.read(CONFIG_START + 3) ==3CONFIG_VERSION[ ] &&EEPROM.read(CONFIG_START + 4) ==CONFIG_VERSION[4]) { // (unsigned int i =0; i =0; x--) { for (int y =5; y>=0; y--) { if ((charBitmap[val * 6 + 5 - y]>> x) &0x01) { pixel.setPixelColor(GetLedFromMatrix(4 - x + pos, y + 1), Wheel((pos> 10) * 170)); 픽셀.쇼(); } } }}//Janux® 작성, 2020년 6월 28일 최종 버전.

    회로도


    제조공정

    1. 32(Lineer) / 11(Pseudo Log) 대역 오디오 스펙트럼 분석기
    2. 갈증 경보 식물 알람
    3. 이탈리아어 단어 시계
    4. Sigfox kWh 미터
    5. 블루투스 온도 모니터
    6. 제스처 제어 잠금
    7. 컴패니언 IC
    8. USB MIDI 어댑터
    9. Arduino용 절연 아날로그 입력
    10. 반응 시간 측정