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

Arduino Nano 33 BLE가 포함된 사운드 스펙트럼 시각화 장치

구성품 및 소모품

Arduino Nano 33 BLE
× 1
일렉트릿 마이크 증폭기 Max9814
× 1
0.91인치 OLED I2C 디스플레이 128 x 32픽셀
× 1
커패시터 4.7nF
RC 저역 통과 필터 및 선택한 차단 주파수에 따라 다름
× 1
커패시터 470μF
× 1
저항 2K
RC 저역 통과 필터 및 선택한 차단 주파수에 따라 다름
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

소개

작은 OLED 디스플레이에서 막대 그래프가 음악과 사운드에 어떻게 반응하는지 확인하십시오. 가장 낮은 주파수는 그래프의 왼쪽 끝으로 향하고 가장 높은 주파수는 오른쪽으로 향합니다.

건설

연결

<울>
  • 시스템에 더 잘 맞는 감도에 따라 Mic GAIN 연결:VCC 마이크 GAIN 40dB, 낮은 감도, GND 마이크 GAIN 50dB의 경우 중간 감도 또는 마이크를 GAIN 플로팅 60dB, 고감도용
  • 아날로그 핀 0 A0 연결 마이크 앰프로 OUT
  • 연결 3.3V , GND , SDA (또는 아날로그 4 A4 ) 및 SCL (아날로그 5 A5 ) I2C SSD1306
  • 전원 버스의 VCC와 GND 사이에 470uF 커패시터 연결
  • 저주파 노이즈가 발생합니까?

    소음은 작동 중인 측정 시스템 근처의 모든 전기 장치에서 발생합니다. 모든 전자 장치는 고정 주파수로 작동하며 50Hz 또는 60Hz의 주파수를 갖는 교류(AC) 전압이 해당 국가의 전력선 주파수입니다. 패러데이 케이지를 사용하여 소음을 쉽게 제거할 수 있습니다. 회로를 상자 안에 넣고 상자를 접지에 연결하십시오. 회로를 잘 접지하십시오.

    Arduino Nano 33 BLE의 핀아웃

    arduino 코어 AnalogRead 및 Arduino Nano 33 BLE를 사용하면 초당 약 35,000개의 샘플만 얻을 수 있으므로 17.5Khz 이상의 주파수에는 FFT를 사용할 수 없습니다. 시계를 읽고 바쁜 대기 루프에서 여러 비교를 수행해야 하기 때문입니다. 조심하고 8kHz의 상한선을 취할 것입니다. 따라서 간단한 RC 저역 통과 필터를 사용하여 해당 주파수 이상의 성가신 솔루션을 피할 수 있습니다.

    차단 주파수 fc =8842[Hz]

    의 경우 R =180Ω C =0.1uF

    차단 주파수 fc =17000[Hz]

    에 대해 2K Ohm 저항과 4.7nF 커패시터 사용

    최대 샘플 속도의 대략적인 계산

    일반 아두이노 analogRead() 함수를 사용하면 오디오를 샘플링하기에는 너무 느리므로 최대 샘플링 레이트를 계산해보자.

    우리는 arduino 코어 AnalogRead와 Arduino Nano 33 BLE를 사용하여 얻을 수 있는 샘플 수를 추정할 것입니다.

    이 작은 프로그램을 실행하여 추정해 보겠습니다.

    /*
    * AnalogRead를 사용한 최대 샘플 속도의 대략적인 계산
    */

    #define ANALOG_PIN A0

    #define SAMPLES 1000000.0
    int newTime;
    int analogValue;
    void setup() {

    Serial.begin(9600);
    Serial.println("샘플링. .. 잠시만 기다려 주세요. ");
    }

    void loop() {
    // 반복적으로 실행하려면 여기에 기본 코드를 입력하세요.
    newTime =micros ();

    // 1백만 샘플
    for (int i =0; i <(int)SAMPLES; i++){
    analogValue =analogRead(ANALOG_PIN);
    }
    float elapsedTimePerSampleUs =(micros()- newTime) / SAMPLES;
    Serial.print("샘플당 시간(미국):");
    Serial.println(elapsedTimePerSampleUs);
    Serial.print("최대 샘플링 주파수(hz):");
    Serial.println(pow(10,6) /elapsedTimePerSampleUs );
    }

    arduino 코어 AnalogRead 및 Arduino Nano 33 BLE를 사용하면 초당 약 35,000개의 샘플만 얻을 수 있습니다. Nyquist 정리의 결과인 대략적인 2배율 요구 사항은 스펙트럼 시각화 장치를 17kHz 미만의 주파수로 제한합니다. 저역 통과 필터를 사용하여 해당 한계 이상의 주파수를 건너뛸 수 있습니다.

    바쁜 대기 루프에서 시계를 읽고 몇 가지 비교를 수행해야 하므로 주의를 기울여야 하며 상한선인 8kHz를 사용합니다.

    // 샘플 채취
    for (int i =0; i unsigned long newTime =micros();
    int value =analogRead(ANALOG_PIN );
    vReal[i] =값;
    vImag[i] =0;
    while (micros() <(newTime + sampling_period_us)) {
    yield();
    }
    }

    사용자 인터페이스

    화면은 11개의 주파수 영역으로 나뉘며 인간의 귀가 주파수를 인식하는 방식과 유사한 로그 스케일 그룹화 주파수입니다.

    인간은 약 20Hz에서 20kHz의 주파수 범위에서 소리를 감지할 수 있습니다. (인간의 유아는 실제로 20kHz보다 약간 높은 주파수를 들을 수 있지만 성숙함에 따라 일부 고주파 감도를 잃을 수 있습니다. 평균 성인의 상한선은 종종 15-17kHz에 가깝습니다.)

    대표를 위해 구역 3에서 13(11 구역)을 사용합니다.

    각 막대는 간격선이 있는 밴드의 최대값과 채워진 사각형이 있는 밴드의 평균값을 나타냅니다.

    값은 경험적 방법으로 얻은 사전 선택된 참조와 함께 데시벨을 사용하여 표시됩니다.

    어떻게 작동합니까?

    오디오 샘플은 고속 푸리에 변환 또는 FFT를 사용하여 주파수 스펙트럼으로 변환됩니다.

    그런 다음 스펙트럼을 14개 영역으로 나누어 그룹화하고 11개 영역만 dB로 표시합니다.

    마이크 모듈 정보

    일렉트릿 마이크

    일렉트릿은 준영구적으로 대전된 유전체입니다. 세라믹 재료를 가열하여 자기장에 넣은 다음 자기장에 있는 동안 냉각시켜 만듭니다. 영구 자석의 정전기적 등가물입니다. 일렉트릿 마이크로폰에서 이 재료의 조각은 마이크로폰의 다이어프램이 하나의 판을 형성하는 커패시터 유전체의 일부로 사용됩니다. 음압은 다이어프램을 움직입니다. 플레이트의 움직임은 음압에 따라 정전용량을 변화시킵니다. 유전체에 내장된 고정 전하가 주어지면 커패시터 양단의 전압도 변합니다. 일렉트릿 커패시터는 내장 FET 증폭기의 입력에 연결됩니다. 일렉트릿 마이크는 작고 감도가 우수하며 주파수 응답이 넓고 일반적으로 비용이 매우 저렴합니다.

    MAX9814 마이크 증폭기

    MAX9814는 자동 이득 제어(AGC) 및 저잡음 마이크 바이어스가 있는 마이크 증폭기이며 브레이크아웃으로 구성할 수 있는 몇 가지 옵션이 있습니다.

    MAX9814 모듈에는 3가지 증폭기 설정(40dB, 50dB, 60dB)이 있습니다. 기본값은 60dB이지만 Gain 핀을 VCC 또는 접지로 점퍼하여 40dB 또는 50dB로 설정할 수 있습니다.

    내부 저잡음 마이크 바이어스 1.25V, 2Vpp. 앰프의 출력은 1.25V DC 바이어스에서 최대 약 2Vpp이므로 최대 3.3V 입력인 모든 아날로그/디지털 변환기와 쉽게 사용할 수 있습니다.

    공격/방출 비율도 기본 1:4000에서 1:2000 또는 1:500으로 수정할 수 있습니다.

    라인 입력에 직접 연결하려면 DC 성분을 차단하기 위한 차단 커패시터/커플링 커패시터가 필요합니다. 시스템에 따라 1uF 이상 직렬로 차단 커패시터를 사용할 수 있습니다. 의심스러운 경우 33uF에서 100uF로 시도하십시오. 커플링 회로는 DC 구성 요소를 차단하면서 AC 신호가 한 부분에서 다른 부분으로 흐르도록 합니다. 오디오 회로에서 이것은 DC 구성 요소가 오디오 출력을 왜곡하는 것을 방지하기 위해 수행됩니다. 커플링 커패시터의 효율성은 삽입 손실, 등가 직렬 저항 및 직렬 공진 주파수를 비롯한 광범위한 주파수 종속 매개변수에 따라 달라집니다.

    전원 공급 장치:2.7V ~ 5.5V

    감도

    감도 , 입력 압력에 대한 아날로그 출력 전압 또는 디지털 출력 값의 비율은 모든 마이크의 핵심 사양입니다. 음향 영역의 단위를 전기 영역의 단위에 매핑하면 알려진 입력이 주어지면 마이크 출력 신호의 크기가 결정됩니다.

    마이크의 감도는 주어진 표준 음향 입력에 대한 출력에서의 전기적 응답입니다. 마이크 감도 측정을 위한 표준 기준 입력 신호는 94dB 음압 레벨(SPL) 또는 1파스칼(Pa, 압력 측정)에서 1kHz 사인파입니다. 더 높은 감도 값을 가진 마이크는 더 낮은 감도 값을 가진 마이크보다 고정 음향 입력에 대해 더 높은 레벨 출력을 갖습니다. 데시벨(dB) 단위의 마이크 감도는 일반적으로 음수입니다. 따라서 감도가 높을수록 절대값이 작아집니다.

    아날로그 마이크의 경우 감도는 일반적으로 dBV 단위, 즉 1.0V rms를 기준으로 한 데시벨로 지정됩니다.

    참조 레벨 및 주파수 응답

    마이크의 주파수 응답은 주파수 스펙트럼 전체의 출력 레벨을 나타냅니다. 고주파 및 저주파 제한은 마이크 응답이 1kHz에서 기준 출력 레벨보다 3dB 낮은 지점으로 설명됩니다. 1kHz의 기준 레벨은 일반적으로 0dB로 정규화됩니다.

    0.91인치 OLED I2C 디스플레이 128 x 32픽셀

    이것은 약 1인치 대각선 크기의 작은 디스플레이입니다. 128x32개의 개별 백색 OLED 픽셀로 구성되어 있으며, 각 픽셀은 컨트롤러 칩에 의해 켜지거나 꺼집니다. 백라이트가 필요하지 않습니다. 이는 OLED를 실행하는 데 필요한 전력을 줄여줍니다.

    여기서 사용하는 모델은 핀이 4개뿐이며 I2C 통신 프로토콜을 사용하여 Arduino와 통신합니다. 이 모델에는 RESET 핀이 없습니다. Arduino Uno I2C 핀에 연결하기만 하면 됩니다.

    <울>
  • Arduino Nano:SDA(A4); SCL(A5);
  • OLED 디스플레이를 제어하려면 adafruit_SSD1306.h 및 adafruit_GFX.h 라이브러리가 필요합니다. 다음 지침에 따라 해당 라이브러리를 설치하십시오.

    우리는 Adafruit 라이브러리를 사용하고 있습니다. 그들을 지원하기 위해 Adafruit에서 무언가를 구입할 수 있음을 기억하십시오.

    다음 단계

    Arduino Nano 33 BLE는 아날로그 읽기를 더 잘 할 수 있습니다. 다음 버전은 nrf52840에 최적화된 FFT 및 아날로그 입력을 사용할 것입니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Arduino Nano 33 BLE용 사운드 스펙트럼 시각화 장치
  • Arduino Nano 33 BLEArduino용 사운드 스펙트럼 시각화 장치
    Arduino Nano 33 BLE용 사운드 스펙트럼 시각화 장치
    arduinoFFT 사용 https://github.com/kosme/arduinoFFT
    Adafruit_GFX 사용 https://github.com/adafruit/Adafruit-GFX-Library
    Adafruit_SSD1306 사용 https://github.com/adafruit/Adafruit_SSD1306
    /* Arduino Nano 33용 Sound Spectrum Visualizer BLE Arduino 기반 사운드 시각화 도우미 @author Enrique Albertos 하드웨어 요구 사항:- Arduino 또는 Arduino 호환 보드. - ssd1306 oled I2C 128x32 디스플레이 - max9814가 있는 일렉트릿 마이크 증폭기 - 옵션:휴대용 배터리(또는 USB를 통해 전원 공급) 소프트웨어 요구 사항:- arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com /adafruit/Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 연결:- 마이크 GAIN:* VCC에서 마이크 GAIN으로 40dB * GND에서 마이크 GAIN 50dB * 플로팅 마이크 GAIN 60dB - 아날로그 핀 0에서 마이크 앰프 출력 - +3.3V, GND, SDA(또는 아날로그 4) 및 SCL(아날로그 5)에서 I2C SSD1306 @uses arduinoFFT https://github.com/kosme/arduinoFFT @uses Adafruit_GFX https://github. com/adafruit/Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 이 프로그램은 무료 소프트웨어입니다. Free Software Foundation, 라이선스 버전 3 또는 (귀하의 선택에 따라) 이후 버전. 이 프로그램은 유용하기를 바라며 배포되지만 어떠한 보증도 하지 않습니다. 상품성 또는 특정 목적에의 적합성에 대한 묵시적 보증도 없이. 자세한 내용은 GNU 일반 공중 라이선스를 참조하십시오.*/#include "arduinoFFT.h#include #include #define SAMPLES 1024 // power of 2#define SAMPLING_FREQ 24000 // 12kHz Fmax =sampleF /2 #define AMPLITUDE 100 // 감도#define FREQUENCY_BANDS 14#define SCREEN_WIDTH 128 // OLED 디스플레이 너비(픽셀)#define SCREEN_HEIGHT 32 // OLED 디스플레이 높이(픽셀)#define BARWIDTH 11#define BARS 11# ANALOG_PIN A0// I2C에 연결된 SSD1306 디스플레이 선언(SDA, SCL 핀)#define OLED_RESET -1 // 핀 번호 재설정(또는 Arduino 재설정 핀을 공유하는 경우 -1)Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); double vImag[SAMPLES];double vReal[SAMPLES];unsigned long sampling_period_us;arduinoFFT fft =arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ); // 배경 잡음을 제거하기 위해 참조를 조정합니다. noisefloat reference =log10(50.0);double cout FREQUENCY_BANDS];void setup() { // SSD1306_SWITCHCAPVCC =디스플레이 생성 v 내부적으로 3.3V의 전압 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 주소 0x3C for 128x32 for (;;); // 진행하지 않고 계속 반복합니다. } // 디스플레이 설정 display.clearDisplay(); 디스플레이.디스플레이(); display.setRotation(0); display.invertDisplay(거짓); 샘플링_주기_us =(1.0 / SAMPLING_FREQ ) * pow(10.0, 6); // 컷오프 주파수를 계산하고, 로그 스케일 밑을 만듭니다. basePOt double basePot =pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFrequencies[0] =베이스팟; for (int i =1; i  max[index] ) { max[index] =vReal[i]; } if (hz> coutoffFrequencies[인덱스]) { 중앙값[인덱스] =합계 / 개수; 합계 =0.0; 카운트 =0; 인덱스++; 최대[인덱스] =0; 중앙값[인덱스] =0; } hz +=hzPerSample; } // 주파수 대역별로 중앙값과 최대값을 계산합니다. if ( sum> 0.0) { median[index] =sum / count; if (median[index]> maxinband) { maxinband =median[index]; } } int 막대 =0; for (int i =FREQUENCY_BANDS - 1, i>=3, i--) { int newHeight =0; 정수 newMax =0; // 실제 데시벨 계산 if (median[i]> 0 &&max[i]> 0 ) { newHeight =20.0 * (log10(median[i] ) - reference); newMax =20.0 * (log10(max[i]) - 참조); } // 최소 및 최대 레벨 조정 if (newHeight <0 || newMax <0) { newHeight =1; newMax =1; } if (newHeight>=SCREEN_HEIGHT - 2) { newHeight =SCREEN_HEIGHT - 3; } if (newMax>=SCREEN_HEIGHT - 2) { newMax =SCREEN_HEIGHT - 3; } int barX =막대 * BARWIDTH + 5; // 이전 레벨 중앙값 제거 if (oldHeight[i]> newHeight) { display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK); } // 이전 최대 레벨 제거 if ( oldMax[i]> newHeight) { for (int j =oldMax[i]; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_BLACK); } } // 새로운 최대 레벨을 페인트합니다. for (int j =newMax; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_WHITE); } // 새로운 레벨 중앙값을 그린다. display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE); oldMax[i] =newMax; 이전 높이[i] =새 높이; 바++; } display.drawFastHLine(0, SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display();}

    회로도

    soundspectrumvisualizer_qLzRsVPVlc.fzz

    제조공정

    1. Arduino Pong 게임 - OLED 디스플레이
    2. K30 센서로 CO2 모니터링
    3. 1Sheeld/Arduino를 사용한 청각 장애인용 통신
    4. Arduino로 코인 억셉터 제어
    5. Bluetooth가 탑재된 Arduino로 LED 제어!
    6. Arduino Nano:조이스틱으로 2개의 스테퍼 모터 제어
    7. 소리로 데이터 보내기
    8. Arduino Nano가 있는 휴대용 가이거 계수기
    9. Arduino로 태양 복사열 측정
    10. Arduino Nano로 먹는 로봇 만들기 | 금 나사