シンセに加速度センサーをつなぐ
前回、シンセに接触位置センサーをつなぎましたが、今回はQuxのVCOに加速度センサーをつないでみました。僕のやった手順を書き記します。
やりかた
今回は加速度センサにADXL345というものを使いました。これはI2C(アイスクエアシー)やSPIなどの通信方式を経由してマイコンと接続し、デジタルで加速度を取得できるセンサーです。こちらが秋月電子で手に入るADXL345の見た目です。
これはデジタル通信で値を取得するセンサーなので、Arduinoを使って加速度を取得し、CVとして出力するようなものを作りました。
回路
まずは加速度センサー、Arduino、シンセをそれぞれ繋ぎました。
この部分はRC回路を用いたローパスフィルタ(Low Pass Filter : LPF)です。僕は10kΩの抵抗と10uFのコンデンサを使いました。抵抗を可変抵抗に置き換えて、いい感じのところを探ってみてもいいかもしれません。
なぜLPFをつけるかというと、Arduinoの出力はPWMで、なおかつその周波数が可聴域にあるからです。PWMの波形をなだらかにすることで、安定した電圧を作り出すというわけです。詳しいことは検索してみてください。コメントで聞いていただいても構いません。
Arduinoのコード
下準備
コードはこちらのGithubページにアップロードされています。
加速度センサー用のライブラリは、Hideki Hamadaさんのライブラリを使います。ArduinoのLibrary Manager
からADXL345と検索してインストールしました。
#includeとグローバル変数
#include <Wire.h>
#include <ADXL345.h>
ADXL345 accel(ADXL345_STD);
constexpr byte CV_PIN = 9;
constexpr uint8_t CV_Max = 96;
constexpr uint8_t CV_Min = 32;
constexpr uint8_t CV_Range = CV_Max - CV_Min;
CV_Max
とCV_Min
は出力する電圧の幅を設定しています。
setup関数
void setup() {
Wire.begin(); //I2C通信を始める
accel.writeRange(ADXL345_RANGE_16G); //加速度センサーの設定
accel.start(); //加速度センサーを起動
pinMode(CV_PIN, OUTPUT); //CV用の出力ピンを設定
}
loop関数
void loop() {
if(accel.update()) {
val = accel.getZ(); //Z軸を使用
}
static float vol;
vol = (val + 1.0) * 0.5 * CV_Range + CV_Min;
analogWrite(CV_PIN, static_cast<int>(vol));
}
LPFをつけれない!
PWM + LPFは似非DACだ!とかいい感じのコンデンサも抵抗もない!というあなたはLPFの回路を省くことができます。ですが、Arduinoから出ているPWM周波数は可聴域内のため、周波数を可聴域外に設定する必要があります。
回路
コード
setup()
関数の最初に以下の2文を追加します。すると、PWMの周波数が31.4kHzになり、PWMの音が聞こえなくなりました。簡単ですね。
TCCR1B &= B11111000;
TCCR1B |= B00000001;
これが何をしているかはArduino PWM 高速化
で検索したりこちらのサイトを御覧いただければわかるかと思います。
終わりに
加速度センサーを使った楽器がつくれましたね!何かあればご気軽にコメントやTwitterでご質問ください。