まず、トーンジェネレーターと言っていますが、プログラム的には出しているのは矩形波です。 オシロスコープで観察してみると、周波数が高くなるにつれ波形がなまってくるのが観察できました。
可変抵抗で20Hzから2000Hzまで任意の周波数を設定して出力することができます。 また、一つの可変抵抗ではこのレンジは広すぎるため、セレクターで4つの範囲に区切って周波数を設定できるようにしています。 箱の中には
- Arduinoで周波数を作る部分
- スピーカーへ出力するアンプ部分
- 電源をACアダプタとUSB5Vを選択できる回路
- オーディオケーブルを繋いでパススルーで音を出力するための切り替え が入っています
機能的には完成です 各スイッチに説明を刻印したいな…というところであと一息です
プログラム(コードブロックの書き方がうまく行っていないのか途中だけ黒背景になっていますが、この線以下すべてがプログラムです)
#include <Arduino.h> #include <TM1637Display.h>
// Module connection pins (Digital Pins) #define CLK 2 #define DIO 3
// The amount of time (in milliseconds) between tests #define TEST_DELAY 1000
TM1637Display display(CLK, DIO);
int tonevoltage = 0; //トーンを決める可変抵抗のアナログ入力値 int selectin = 0; //レンジセレクターのアナログ入力値 int select = 0; //レンジセレクターの切り替えの瞬間に1024になってしまうのを防ぐ double h = 0; //トーンのアナログ入力値を int disp = 0; //計算された出力する周波数 int sound = 4; // スピーカーを接続するピン番号
void setup() { pinMode(12,OUTPUT); Serial.begin(9600); }
void loop() { tonevoltage = analogRead(6) ; selectin = analogRead(7) ; //レンジセレクターを回す際に一瞬回路が途切れてanalogReadに5V(1023)が入ってしまうのを排除する if(selectin < 1000){ select = selectin; }
//可変抵抗のアナログ入力はノイズが乗るので、ある程度繰り返し読んで平均を取る
int i;
int t = 100; //平均する回数
h = 0; //hをリセット
for (i = 0; i < t; i++){
h = h + analogRead(6);
}
h = h / t; //t回のanalogReadの平均
if(select >= 700){
//20-200Hz
disp = (180*h/1024+20);
Serial.print ("A");Serial.println("");
} else if ((select < 700) && (select >= 300) ) {
// 200-600Hz
disp = (400*h/1024+200);
Serial.print ("B");Serial.println("");
} else if ((select < 300) && (select >= 100) ){
// 600-1200Hz
disp = (600*h/1024+600);
Serial.print ("C");Serial.println("");
} else {
// 1200-2000Hz
disp = (800*h/1024+1200);
Serial.print ("D");Serial.println("");
}
display.setBrightness(0x0f);
display.showNumberDec(disp, false);
Serial.print (select);Serial.print("--");Serial.print (tonevoltage);Serial.print("--");Serial.print (h);Serial.print("--");Serial.print (disp);Serial.println(""); tone(sound,(disp)) ;
//delay(TEST_DELAY); }