Arduinoで作るトーンジェネレーター

© CC BY 4+ visibility405
© CC BY 4+
visibility405

ダイラタンシー流体をスピーカーの上で踊らせるためにAruduinoでトーンジェネレーターを作りました。

動画
開発素材

デバイス

システム構成
system image

まず、トーンジェネレーターと言っていますが、プログラム的には出しているのは矩形波です。 オシロスコープで観察してみると、周波数が高くなるにつれ波形がなまってくるのが観察できました。

可変抵抗で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); }

ストーリー

この実験をやるために制作しました https://youtu.be/2ZOZmvHFWUY 動画では携帯のアプリを使って周波数を作っていますが、これを携帯に依存せずにやろうとしたのが目的です。

メンバー
  • user
    工作記録帳 @handicraft_recordbook
    • 設計
    • プログラミング
    • 制作

関連リンク

同じニオイがする作品
  • event ぶらっくぺっぱー
  • event 強制学習装置
  • event 伝言ホーム琴葉姉妹
  • event すしどらいばー - 可変速度回転寿司 -

イベントまとめ

コンテストまとめ

作品を登録しよう

モノづくりしている人に、つくった作品を見てもらえ、リアクションがもらえるかも?

close

目次