編集履歴一覧に戻る
s51517765のアイコン画像

s51517765 が 2021年01月31日18時11分21秒 に編集

初版

タイトルの変更

+

Arduinoでデジタルテルミンを作った

タグの変更

+

秋葉原

本文の変更

+

![デジタルテルミン](https://camo.elchika.com/da1eca0dba332d8986b86c8c6a4eb890cd23c8d7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62336539306561662d376461642d343165332d386363662d6164313030626336316330652f61626466633462642d616362382d343364372d623364612d646336386234643061666238/) テルミンとは世界初の電子楽器でシンセサイザーの元になったものです。 https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%AB%E3%83%9F%E3%83%B3 テルミンはコンデンサをもつ高周波発振器を2つ内蔵していて、演奏者の手とアンテナの間にコンデンサを形成し、これによりアナログ回路的に音程を形成します。 また、左手により音量をコントロールすることが出来ます。 このようなテルミンをまねて、手をかざすことで音楽を奏でられる楽器をArduinoで作りました。 どちらかというとシングルアンテナのマトリョミンに近いです。 マトリョミンは音量コントロールが省略された構成のテルミンです。 https://www.mandarinelectron.com/matryomin/ 本来のテルミンは完全にアナログ回路で音を発しますが、これをArduinoを用いてデジタルで作りました。 言ってみればデジタルテルミンです。 # 回路図 ![回路図](https://camo.elchika.com/c5bb8fd0309e09df4bda096aafb8cea9c41ba307/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62336539306561662d376461642d343165332d386363662d6164313030626336316330652f66656136666133312d616234382d346233342d613530392d396439373661656665376636/) 音程のコントロールは超音波距離センサを用いて、音は圧電スピーカから発します。 通常、圧電スピーカはGPIOから直接駆動することもできますが、周波数等の関係で音量が小さくなるので外部(ここではUSB)から電源をとることで音量UPをしました。 そのためトランジスタ(2SC1815)を使っています。 超音波センサでかざした手との間の距離を測定し、音程を決定します。 @[youtube](https://www.youtube.com/watch?v=DUBi24YffcE) ```c:main.c const int TrigPin = A0; const int EchoPin = A1; long dist = 0; long toneCycle = 100000; long aveCount = 40; unsigned long toneLength = 10; const int SpeakerPin = 8; unsigned long t = 0; void setup() { Serial.begin(9600); pinMode(TrigPin, OUTPUT); pinMode(EchoPin, INPUT); } void loop() { dist = 0; for (int i = 0; i < aveCount; i++) { digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds(8); digitalWrite(TrigPin, LOW); dist += pulseIn(EchoPin, HIGH) ; } dist /= aveCount; dist /= 30; dist *= 30; Serial.println(dist); if (200 < dist && dist < 4400 ) { t = millis(); for (int i = 0; i < toneLength; i++) { digitalWrite(SpeakerPin, HIGH); delayMicroseconds(toneCycle / dist); digitalWrite(SpeakerPin, LOW); delayMicroseconds(toneCycle / dist); } } } ```