Arduinoで音声フーリエ変換サーボモーターを動かす
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