sound with arduino

arduinoで音を制御(録音, 再生etc)したい時用の個人的まとめです.

最終的には録音/再生ができるようにしています. 動画

setting_rec-play.jpg

1. 再生

1-1. mp3を再生する

SDカードにmp3の音源を入れ, moduleを使用して再生します.

  • 良: moduleのおかげで簡単に再生できる
  • 悪: moduleが必要
  • 悪: 用意した音源しか再生できない

code

 

1-2. arduinoのみで再生する

  • PWMのピンを利用し, 2.5Vを中心に0~5Vで電圧を揺らすことで, PWMピンから直接再生する
  • そのままのPWMだと遅くて(?)不適なのでFastPWMを利用
  • PROGMEMを使用してフラッシュメモリーに書き込みます(32KBなのでプログラム部分を除くと8000Hzで最大約4秒)
  • PWMなので音の振幅の解像度は8bit(256)
  • 音の波形を[0,255]で表現できれば良い. 作成方法は自由(WAV音源を変換する方法を下記では紹介).
  • 音源のサンプリングレートはdelayMicrosecondsで調整(例:8000Hzなら125[=1/8000]). ただし, プログラム内容によっては微調整が必要そう.
  • 悪: フラッシュメモリにはconstで事前に書き込むので録音等はできない

配線

256の音源を作る

作成例

  1. test.wavを用意する
  2. rawにformat変換 audacityでサンプリング周波数8000Hz, その他の非圧縮ファイル, RAW(header-less), Unsigned 8-bit PCMと指定してtest.rawを作る
  3. ターミナルでxxd -i sample.rawを実行して数値に変換する
  4. 0x7f, 0x80, 0x7f, ...みたいな数値列(16進数)ができた

最終的な数値は127, 128, 127, ...のように10進数であってもOK

code

(私の「あいう」の声が無限に流れますが悪しからず...)

2. 録音

「録音する」といってもwavを作るとかではなく, 上記の「arduinoのみで再生する」を前提にした録音です. 必要であればPC等で適宜wav等に変換していただくということで... ざっくりいって「analog-inの数値をSD-cardに記録するだけ」です.

  • micをanalog-inに接続して記録
  • ECM等だとオペアンプ+電圧シフトで2.5V中心の[0V, 5V]で電圧が揺れるようにする必要がある.
  • analog-inの10bitの数値を8bit(1byteで記録するため)に変換してSD cardに記録
  • printlnではなくwriteを利用しbyte(16進数. 00=0, 10=16 等)で記録する.
  • これは再生時に使用するreadがASCIIで読み込むため. printlnで記録すると10進数で記録されるため1桁ずつreadした後に1つ数値として復元する処理が必要になってしまい, 再生速度に間に合わなくなってしまう.

マイク

ECM等のマイクだと本来, 音を0Vを中心に+/-で微振動するのみ. arduinoのanalog inに突っ込んでもノイズと変わらないので検知できない. 故に

  • 信号増幅: マイクからの信号をオペアンプ等で100倍ほど増幅し, 振幅を5V程度にする
  • 電圧シフト: analog inが正値のみを受け取るため, 2.5Vを中心に[0V, 5V]で揺れるようにレベルシフトする

を行う必要がある. 自分で回路を組んでも良いが,

等のオペアンプ付のマイクモジュールを利用すると楽. (というか, 電気回路を自分で組むのはまだ上手くいってないです... どなたか教えて欲しい)

参照

マイクモジュール

回路全体

マイク

オペアンプ

書き込み

SDカード

arduino

ノイズ

配線

上記のモジュールであれば,

でOKです. SD cardは, 以前の記事のように

で繋げばOKです(以前の記事とくらべて, 配線の並びを個人的美的感覚の関係でCSを4から9に変えました).

code

録音したdataの形(確認)

DATA.TXTという形で録音したデータを保存していますが, それをPCのテキストエディタで開いてみると

という感じで16進数で保存されているのがわかります.

3. 録音した音声を再生

配線

code

 

4. 再生と録音をスイッチで制御

上記の再生と録音に加えてスイッチを組み合わせることで, 簡単なサンプラーを作ることができます. (チチチ...という謎のノイズがマイク, スピーカーにのってしまっています. 調べ中)

配線

setting_rec-play.jpg

code

再生後に録音する際にFastPWMを直すために

を追加しています.

動画