968円で作る。LEDイコライザっぽい表示機

# 概要
音センサを購入したので試してみました。
こちらの機器はアンプも内蔵されているため、非常に優秀とのこと…

# 少し感想
当初、アナログ出力をそのまま表示させていたましたが思ったような値は出ませんでした。
音声などは周波数になってしまっているため、高速フーリエ変換(fft)という計算が必要らしく。
そのモジュールを利用して出力しています。

# 部品
**音センサー:**[MAX4466](https://ja.aliexpress.com/item/33004879556.html?spm=a2g0s.9042311.0.0.27424c4doc1BUn)
133円
<img width="250" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/68a1031f-3fdb-60a9-faf9-c3b6e48565c4.png">

**表示機:**[MAX7219ENGが組み込まれた8x8 LED](https://ja.aliexpress.com/item/32580532205.html?spm=a2g0s.9042311.0.0.27424c4dZcGFCl)
136円
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/eba92fc4-741b-8ccb-acd7-89736dada779.png">


**コンピュータ:**[Arduino UNO互換機](https://www.amazon.co.jp/FC-%E5%B7%A5%E5%A0%B4-R3%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89-%E3%83%90%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-ATmega328P-Arduino%E3%81%A8%E4%BA%92%E6%8F%9B%E6%80%A7/dp/B07H4KTVK5/ref=sxbs_sxwds-stvp?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2S335VL3VWB52&cv_ct_cx=arduino+uno&keywords=arduino+uno&pd_rd_i=B07H4KTVK5&pd_rd_r=d31aaf3a-0258-4866-b883-ee3cb37525ae&pd_rd_w=II02q&pd_rd_wg=kzB7i&pf_rd_p=e29507e3-7937-4495-82f4-55b5d5ca8047&pf_rd_r=SN5PWYGF5TQS3EX5XFVB&psc=1&qid=1584128141&s=diy&sprefix=Ard%2Cdiy%2C251)
699円
<img width="400" alt="img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/47f88a1f-c4ae-cc1d-84cc-12b8cc736b9b.png">

#利用モジュール

**max4466**
フーリエ変換のモジュールです。
下記のsiteからダウンロードして、Arduinoフォルダにコピーしてください。
http://wiki.openmusiclabs.com/  

<img width="400" alt="img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/dcb336c4-8977-6ec7-66dc-11754e2cd5fc.png">
<img width="400" alt="img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/391f9cb4-c830-7f5e-f8b7-c504b979c33a.png">




MACだと下記

```text

/Users/{user name}/Documents/Arduino/libraries
```

**max7219eng_8x8led**
LEDをコントロールするモジュールです。
ArduinoのLibraryで検索し、インストールしてください
https://github.com/danidask/MatrizLed  

<img width="400" alt="img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/f25fb6b2-38cb-a50b-9664-bd25a09b59d9.png">
<img width="400" alt="img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/22cd7726-ab8b-75b0-dc10-91149495c7ac.png">


#配線
<img width="400" alt="スクリーンショット 2020-03-26 7.52.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/f3baec62-1969-c4ae-3864-c0b724073b4d.png">

#ソースコード

下記の「fft_adc」というスケッチ例をほとんど参考にしています。
http://wiki.openmusiclabs.com/

Licence:GPL licensed 

```c++
/*
fft_adc.pde
guest openmusiclabs.com 8.18.12
example sketch for testing the fft library.
it takes in data on ADC0 (Analog0) and processes them
with the fft. the data is sent out over the serial
port at 115.2kb.  there is a pure data patch for
visualizing the data.
*/

#define LOG_OUT 1 // use the log output function
#define FFT_N 256 // set to 256 point fft

#include <FFT.h> // include the library
#include <MatrizLed.h>
MatrizLed pantalla;

void setup() {
//  Serial.begin(115200); // use the serial port
    Serial.begin(2000000); // use the serial port
  TIMSK0 = 0; // turn off timer0 for lower jitter
  ADCSRA = 0xe5; // set the adc to free running mode
  ADMUX = 0x40; // use adc0
  DIDR0 = 0x01; // turn off the digital input for adc0

  pantalla.begin(12, 11, 10, 2); // dataPin, clkPin, csPin, numero de matrices de 8x8
}
char strbuf[64];
void loop() {
  while(1) { // reduces jitter
    cli();  // UDRE interrupt slows this way down on arduino1.0
    for (int i = 0 ; i < 512 ; i += 2) { // save 256 samples
      while(!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      k -= 0x0200; // form into a signed int
      k <<= 6; // form into a 16b signed int
      fft_input[i] = k; // put real data into even bins
      fft_input[i+1] = 0; // set odd bins to 0
    }
    fft_window(); // window the data for better frequency response
    fft_reorder(); // reorder the data before doing the fft
    fft_run(); // process the data in the fft
    fft_mag_log(); // take the output of the fft
    sei();
#if 0
    Serial.write(255); // send a start byte
    Serial.write(fft_log_out, 128); // send out the data
#endif
    int _sum = 0;
    for(int i=0;i<128;i++){
          _sum+=fft_log_out[i];
    }
    int ave = _sum/128/3;
    int cnt=0;
    for(int x=0;x<8;x++){
      for(int y=0;y<8;y++){
        if(ave > cnt){
           pantalla.setLed(0, x, y, true);
        }else{
           pantalla.setLed(0, x, y, false);
        }
        cnt++;
      }
    }
    
    memset(strbuf,0,64);
    memset(strbuf,'|',_sum/128/3);
    Serial.print(strbuf);
    Serial.print("\n");
    delayMicroseconds(1);
  }
}
```
[github](https://github.com/hashito/arduino_startup/tree/master/MAX4466toMAX7219ENG_8x8LED)



# 動作確認
gif動画で上げても分かりにくかったので、Youtubeにて確認いただけると幸いです。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/iuCIArwpOW8/0.jpg)](http://www.youtube.com/watch?v=iuCIArwpOW8)