Help us understand the problem. What is going on with this article?

[WIP] Arduinoで音を出したい(メモ)

More than 5 years have passed since last update.

[WIP] Arduinoで音を出したい(メモ)

Arduinoといえば、何故かMIDI関連ばっか作ってるので、毛色を変えて音が出るモノを作ってみたいと思います。
あまり変わってない?

というわけで、簡単にArduinoで音を出したい(サウンドを生成して鳴らす)というメモ。

今日は休日ということもあり、こんな感じ(圧電スピーカーだけ!w)で試すことに。

圧電スピーカーだけ!w

※よく見るとArduino UNOじゃなく互換機なのですが、お気になさらずw

tone()

これが一番簡単ですね。tone()で、矩形波が出ます。周波数で音程を指定できます。

たとえば、こんなコードで簡単に音が鳴ります。

void setup()
{
  pinMode(8, OUTPUT); // D8にスピーカー繋ぐ。
}

int sounds[] = {200,300,400,600,800,1200,1600,2400};
int v = 0;

void loop()
{
  tone(8,sounds[v],10);

  delay(50);
  v ++;
  if(v > 7){
    v =0;
  }
}

公式のチュートリアルも用意されてます。

上記チュートリアルにノートナンバーと周波数の変換用の定義も置いてあるのですが、例えばMIDIと変換するような場合は下記のような配列を使うと良いと思います。
MIDIノートと周波数の関係(g200kgさん)を見ながら乱雑につくったものです。)

PROGMEM int freqs[] = {
  8,8,9,9,10,11,11,12,13,14,15,15,16,17,18,19,
  21,22,23,24,26,28,29,31,33,35,37,39,41,44,46,49,
  52,55,58,62,65,69,73,78,82,87,93,98,104,110,117,123,
  131,139,147,156,165,175,185,196,208,220,233,247,262,277,294,311,
  330,349,370,392,415,440,466,494,523,554,587,623,659,698,740,784,
  831,880,932,988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976,
  2093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951,4186,4435,4699,4978,
  5274,5588,5920,6272,6645,7040,7459,7902,8372,8870,9397,9956,10548,11175,11840,12544
};

Arduinoで音を出す、光らせる、動かす

@mio_kさんの記事です。

Arduinoで音を出すには、出力ピンに高速にON/OFFすればいいんですね。。そういえばそっか!
という、原理のようなモノを体感させてくれる、良記事です。

Arduino DDS Sinewave Generator

矩形波だけでなく、正弦波(sine wave)を出したいと思って探してたら見つかったのがこのサイト。
まだちゃんと仕組みは理解してないのですが、サンプルコードをArduinoに流したら確かに音が出ました!
(サイトにあるローパスフィルタは作りませんでしたが、圧電スピーカー鳴らすくらいなら大丈夫でした)

Arduino Realtime Audio Processing

さきほどのサイトの中に、こんなコンテンツもありました。
こちらは、入力した音を加工したりすることも出来るよ、というモノ。凄い!

今回は回路が無い(今はスピーカーしか無いんじゃw)ので、後日実験してみたいと思います。

PWMDAC_Synthライブラリ

こちらは、Akiyoshi Kamideさんが公開されているシンセサイザーライブラリです。

CAmiDionという電子楽器を作られているようです。

早速、使ってみました。

#define PWMDAC_OUTPUT_PIN   11
#include <PWMDAC_Synth.h>

void setup(){
  pinMode(13,OUTPUT);
  PWM_SYNTH.setup();
}

int cnt1 = 0;
int v = 0;
byte notes[] = {70,74,78,82,86,90,94,98};

void loop()
{
  if(cnt1 == 0){
    digitalWrite(13,HIGH);
    PWM_SYNTH.noteOn(1,notes[v],120);
  }
  if(cnt1 == 1000){
    digitalWrite(13,LOW);
    PWM_SYNTH.noteOff(1,notes[v],0);
    v ++;
    if(v > 7){
      v = 0;
    }
  }
  cnt1++;
  if(cnt1 >= 2000){
    cnt1 = 0;
  }
  PWM_SYNTH.updateEnvelopeStatus(); 
}

とりあえず、今回はMIDIを使わず、入力デバイスも無い状態で実験してるので、こんなヘッポコなコードになってしまいましたw

音は鳴ってくれたのですが、圧電スピーカーだとキツいかも。。。そろそろw

コレに変更

これは、以前に100均のヘッドホンをバラして取り出したスピーカーです。
こっちの方がマトモに聞こえます。下の方で作り方書きます。

Mozzi

Tim Barrassさんが公開しているシンセサイザーライブラリ。
ダウンロードしてみると判りますが、膨大なファイルが!

サンプルも沢山あるので(このライブラリのサンプルはスピーカーをD9に繋ぐ前提なので注意)試してみると面白いです。すげー!

まとめ

というわけで、いろいろ触ってみようと思います。
適宜Updateしようと思いますので、「こんなんもあるよ〜!」と教えて頂けたらうれしいです!

おまけ。実験用スピーカーの作り方。

すぐに圧電スピーカーの限界に達してしまったため、100均ヘッドホンから実験用スピーカーを作りました。
こういう実験のために、オーディオ機器に繋ぐのは危険です!壊しちゃうかも。
というわけで、実験には壊しても平気な100均スピーカーがオススメ。

とくに、ヘッドホンから取り出すと、音は小さいですが、2つ取れますw

こんなのを買います。(私はダイソーで買いました)

買ったもの

容赦なくバラします。

バラして中身を取り出す

もともと繋がってるケーブルは、取っちゃいます。使いません。

替わりに、中が単芯の電線を使つなげます。

(固いジャンパー作る時に使うコレがおすすめ)

ジャンパ線

(より線しか無い場合、差し込み口作るのが面倒です)

早速ハンダづけます。
左側が+(Arduinoのデジタルピンに繋ぐ方)、右側が-(GND) です。

ハンダ付け!

このとき、スピーカーが磁石でハンダゴテにひっついて、あわわ〜! ってなるので注意。
スピーカーを固定しときましょう。

完成!

かっこ悪いスピーカー

こんなに見るからに安っぽいモノなら、壊れても平気で、存分に実験に使えますね!w

Arduinoにも直接ささる!
もちろんブレッドボードにも刺さります。

Arduinoに接続!

というわけで、便利な実験用スピーカーの作り方でした〜
(記事を書くために、もう1個GETw)

tadfmac
aka D.F.Mac. 実験音楽家。TripArts Music主宰。ハンディーレコーダーでの音集めが趣味。 Web技術、フィジカルコンピューティングなどにも興味があります。
http://soundcloud.com/tadfmac
kddi
KDDIは、通信を中心に周辺ビジネスを拡大する「通信とライフデザインの融合」をより一層推進し、国内はもとよりグローバルにおいても、5G/IoT時代における新たな価値創造を実現し、お客さまの期待を超える新たな体験価値の提供を追求してまいります。
http://www.kddi.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away