Arduinoで音声フーリエ変換サーボモーターを動かす

2022年,グループ展,ブログ,作品,制作年別,展覧会出品,瀬戸内界隈展

Arduinoで音声をフーリエ変換して、周波数ごとにサーボモーターを動かす作品にしたいのです。

Arduino本体のUSBへ電源をきちんと供給しないと動作が不安定になります、、、
完成形はこちら
コードはこんな感じ。

#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <Adafruit_I2CRegister.h>
#include <Adafruit_SPIDevice.h>

////////////////////Servo
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
////////////////////Servo

////////////////////FFT
#include <arduinoFFT.h>

arduinoFFT FFT = arduinoFFT(); 

#define CHANNEL A0
const uint16_t samples = 32; 
const double samplingFrequency = 2000; 

unsigned int sampling_period_us;
unsigned long microseconds;

double vReal[samples];
double vImag[samples];

#define SCL_INDEX 0x00
#define SCL_TIME 0x01
#define SCL_FREQUENCY 0x02
#define SCL_PLOT 0x03
////////////////////FFT

////////////////////Servo
Adafruit_PWMServoDriver pwm0 = Adafruit_PWMServoDriver(0x40);  
#define SERVOMIN 110
#define SERVOMAX 480
 
int angle;
int minDig = 0;
int maxDig = 90;
////////////////////Servo
 
 void setup() {
  ////////////////////FFT
  sampling_period_us = round(1000*(1.0/samplingFrequency));
  Serial.begin(115200);
  while(!Serial);
  ////////////////////FFT

  
  ////////////////////Servo
   pwm0.begin();
   pwm0.setPWMFreq(50);
   
   for(int i=0; i<samples; i++){
     servo_move(i, minDig); 
     delay(100);
   }
  delay(5000);
  ////////////////////Servo
 
}
 
 void loop() {
////////////////////FFT
  /*SAMPLING*/
  microseconds = micros();
  for(int i=0; i<samples; i++)
  {
      vReal[i] = analogRead(CHANNEL);
      vImag[i] = 0;
      while(micros() - microseconds < sampling_period_us){
      }
      microseconds += sampling_period_us;
  }
        FFT.Compute(vReal, vImag, samples, FFT_FORWARD); 
      ////////////////////FFT
      
      ////////////////////////Servo
    
         
         for(int i2=0; i2<samples; i2++){
           angle = vReal[i2];

           if(angle <= minDig){angle = minDig;};
           if(angle >= maxDig){angle = maxDig;}
           
           servo_move(i2, angle);
           Serial.print(angle);
           Serial.print("|");
           delay(5);
         }
       Serial.print("\n");
       Serial.print("\n");
       
      ////////////////////Servo 

  
}////End Loop


 
////////////////////Servo 
 void servo_move(int n, int angle){
   angle = map(angle, 0, 180, SERVOMIN, SERVOMAX);
   pwm0.setPWM(n, 0, angle);
}
////////////////////Servo