1.ADMP441 DIP化基板について
(主な仕様)
・A/Dコンバータ:24ビット
・インターフェース:I2S(Inter-IC Sound)
・SNR: 61dBA
・感度: -26dBFS
・周波数特性: 60Hz~15kHz
・最大音圧(peak): 120dB SPL
・所要電圧: 1.8V~3.3V
左はADMP441を取り付けた基板に、4本足のピンヘッダーを両側にハンダ付けしたものです。DIP化キットなので、ピンヘッダーをハンダ付けする必要があります。
ADMP441はAnalog Devices社製のI2Sデジタル出力マイクです。3×5mmのマイクチップが、10×10mmのDIP化基板に組み付けられています。微細加工技術で作成された、いわゆるMEMSと呼ばれるものです。この小さなパッケージの中に、マイクロフォン、ADコンバーター、アンチエリアシングフィルター、I2Sインターファイスなどを内蔵した高機能マイクです。アンプやADコンバーターを介することなく音声処理プロセッサーなどに直結できる優れものです。
2.マイク基盤の作成
今回使用する部品類は下表の通りです。名称をクリックすると詳細情報を参照できます。
No. | 名 称 | 数量 | 参考単価 | 備 考 |
1 | I2Sデジタル出力マイク ADMP441 DIPモジュール | 2 | \750 | |
2 | ブレッドボード ECI-801 | 1 | \270 | |
3 | 100kΩ 1/4W カーボン抵抗器 | 1 | 100本入りで\100程度 | |
4 | ジャンパーワイヤ | 少々 | \300 | 色サイズ別14種類 各5本セット |
5 | 配線用ワイヤ | 少々 |
<ご注意>
ADMP441は秋月電子通商で購入したものですが、現時点で「販売終了」になっています。
同等品がStrawberry Linux社から \1,000.-で入手できるようです。
また代替品として「SPH0645LM4H搭載 I2S MEMSマイクモジュール」スイッチサイエンス社 \1,089.-があります。
SPH0645LM4Hを使用する場合は、下表の記号が次のように変わります。
SCK --> BCLK、SD --> DOUT、WS --> LRCLK、L/R --> SEL
なお、ADMP441の後継として同スペックのINMP441があり、海外の通販サイトから入手できます。
いずれも動作確認はしていませんが、ご参考まで。
下図はADMP441内部の基板配線図です。これだけのものがぎっしりと詰まっているのですから驚きです。右は表面から見た基板ピンの配置図です。マイクエレメントの開口部(音響入力側)は、マイクのアイコンが印刷された面にあるので、ピンヘッダーをハンダ付けする際に表裏を間違えないように要注意です。
第8章『8.I2Sとサウンドモジュール』で述べたように、I2Sインターフェイスは3本の信号線とGNDで構成されています。これに加えて、この基板では電源入力やマイクの左右設定などができるようになっています。8本のピンの機能は次の通りです。
ピンNo. | 記号 | タイプ | 機能説明 |
① | SCK | 入力 | I2Sインターフェイスの基準クロック(BCLK) |
② | SD | 出力 | I2Sインターフェイスのシリアルデータ出力(SDATA) |
③ | WS | 入力 | I2Sインターフェイスのシリアルデータ・ワード選択(LRCLK) |
④ | L/R | 入力 | ライト/レフトのチャンネル選択。GNDに接続するとレフトチャンネルに、VDDに接続するとライトチャンネルにデータを出力。 |
⑤⑧ | GND | Ground | 電源GND、I2SインターフェイスのGND |
⑥ | +V(VDD) | 電源 | 電源1.8V~3.3V(0.1μFのデカップリング・コンデンサーは基板内で接続済み) |
⑦ | EN | 入力 | マイク・イネーブル。GNDに接続するとディス・イネーブルになり、パワーダウンモードになる。VDDに接続するとマイクはイネーブルになる。 |
ブレッドボード上に2つのADMP441基板を取り付けて、ステレオのマイク基盤を作成します。下の写真が完成したものです。左の①と右の①、左の②と右の②のように、④のL/R選択以外の端子は、左右それぞれの同じ機能の端子どうしを連結しています。④のL/R選択は、写真左のマイクはVDDに、右のマイクはGNDに接続しています。このようにして右側マイクと左側マイクを設定しているわけです。
シリアルデータを出力するSDバスラインは、100KΩの抵抗器でプルダウンしています。
次の配線図は、L/R 2マイク接続の応用例として説明書に掲載されているものです。上の配線はこれに基づいて行っています。やはり配線図はわかりやすいですね。0.1μFのコンデンサーは実装済みなので注意してください。
3.配線と音出しテスト
さて、いよいよRaspberry Pi Zeroにつないでテストの準備をします。
ヘッドフォンアンプとの接続は、すでに前回『8.I2Sとサウンドモジュール』で完了しています。またI2Sについては、PCM関係のGPIOピンに[Alt0]の機能を割り当て済みです。念のために、もう一度これらを整理しておきましょう。
GPIO18 : PCM CLK(PCM clock)
GPIO19 : PCM FS(Frame frame sync)
GPIO20 : PCM DIN(PCM data in)
GPIO21 : PCM DOUT(PCM data out)
GPIO12 : PWM0(Pulse with modulator)
GPIO13 : PWM1(Pulse with modulator)
この他に、マイク基盤のGNDとPi Zeroの空いているGNDピンをつなぎます。またマイク基盤の電源(VDD)は、Pi Zeroの3.3Vから供給することにします。
Pi Zeroの使用ピンと接続先は以下のようになります。
[[ Raspberry Pi ]] Usage ..... Device:Wire Color(Function) Mic:Purple(VDD) *3.3V 3V3 (1) (2) 5V GPIO2 (3) (4) 5V GPIO3 (5) (6) GND GPIO4 (7) (8) GPIO14 GND (9) (10) GPIO15 GPIO17 (11) (12) GPIO18 *CLK Mic:Yellow(SCK) GPIO27 (13) (14) GND GPIO22 (15) (16) GPIO23 3V3 (17) (18) GPIO24 GPIO10 (19) (20) GND GPIO9 (21) (22) GPIO25 GPIO11 (23) (24) GPIO8 GND (25) (26) GPIO7 GPIO0 (27) (28) GPIO1 GPIO5 (29) (30) GND GPIO6 (31) (32) GPIO12 *PWM0 Amp:Orange(Left) Amp:White(Right) *PWM1 GPIO13 (33) (34) GND *GND Amp:Black(GND) Mic:Orange(WS) *FS GPIO19 (35) (36) GPIO16 GPIO26 (37) (38) GPIO20 *DIN Mic:Red(SD) Mic:Blue(GND) *GND GND (39) (40) GPIO21 *DOUT |
回路はとてもシンプルなので特に問題ないと思いますが、参考までに写真を掲載します。なお回路図にない抵抗器やコンデンサー類は、ノイズを消去するために付加したものです。マイク基盤の電源とGNDの間の電解コンデンサー(0.22μF)、同I2Sシリアルデータ出力部の抵抗器(10Ω)を取り付けています。後で述べますが、プルダウンの100kΩを除いたこれらのコンデンサーと抵抗器は後ほど取り外します。
== 以下のテストの前に、ヘッドフォンアンプの音量を絞ってください! ==
それでは、さっそくテストしてみましょう。ヘッドフォンアンプの電源ラインに9Vの積層電池を接続します。続いて、Poderosaを立ち上げて次のコマンドを入力します。
$ arecord -D hw:1,0 -c2 -r 44100 -f S32_LE -t wav -V stereo -v | aplay |
イヤフォンを装着してヘッドフォンアンプのボリュームを上げてみましょう。実は、ここで「ブ~ン」というノイズが出たので、コンデンサーや抵抗器を取り付けたのが上の写真です。配線を見直してマイクの位置などを調整すると、ブ~ン音は気にならなくなり、追加したコンデンサーなどは取り外しました。ところが左のイヤフォンから、数秒おきに「カリカリ」と耳につく音が発生します。しかし、これもマイクの位置を変えているうちに解消しました。
さて、音は出ましたが音量が不足気味です。ボリュームを上げてみても限界があり、これを解決する必要があります。
4.ソフトウェアボリュームの設定
以前USBミニマイクの動作確認で試したように、ALSAが保持している音量制御情報をalsamixerコマンドで調整することができます。
$ alsamixer |
[F6]をクリックして、「サウンドカード選択」画面から[snd_rpi_simple_card]を選択します。ところが、「このカードには制御可能なミキサーがありません」とエラーが表示されます。
この問題を解決するには、ソフトウェアボリュームの追加が必要になります。
Adafruit社の情報ページ『Wiring For Mono Mic』から「Adding Volume control」の情報にしたがって設定します。nanoエディターでasoundrcファイルを作成して、以下の定義情報を書き込みます。
$ sudo nano ~/.asoundrc |
#This section makes a reference to your I2S hardware, adjust the card name # to what is shown in arecord -l after card x: before the name in [] #You may have to adjust channel count also but stick with default first pcm.dmic_hw { type hw card sndrpisimplecar channels 2 format S32_LE } #This is the software volume control, it links to the hardware above and after # saving the .asoundrc file you can type alsamixer, press F6 to select # your I2S mic then F4 to set the recording volume and arrow up and down # to adjust the volume # After adjusting the volume - go for 50 percent at first, you can do # something like # arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v myfile.wav pcm.dmic_sv { type softvol slave.pcm dmic_hw control { name "Boost Capture Volume" card sndrpisimplecar } min_dB -3.0 max_dB 30.0 } |
この定義情報を有効にするには、いちどarecordコマンドを実行する必要があります。次のようにコマンドを入力し、動作し始めたら[ctrl]+[c]で止めてください。
$ arecord -D hw:1,0 -c2 -r 44100 -f S32_LE -t wav -V stereo -v | aplay |
5.ソフトウェアボリュームのテスト
ソフトウェアボリュームがどのように設定されたか調べてみましょう。次のようにPortAudioのexampleフォルダーに移動して、pa_devs.cをコンパイル実行します。
$ cd $ cd portaudio/examples $ gcc pa_devs.c -lportaudio $ ./a.out |
以下の内容が表示され、#4にソフトウェアボリュームdmic_svが登録されていることがわかります。
Number of devices = 6 --------------------------------------- device #0 [ Default Output ] Name = bcm2835 ALSA: IEC958/HDMI (hw:0,1) Host API = ALSA Max inputs = 0, Max outputs = 8 Default low input latency = -1.0000 Default low output latency = 0.0016 Default high input latency = -1.0000 Default high output latency = 0.0348 Default sample rate = 44100.00 Supported standard sample rates for half-duplex 16 bit 8 channel output = 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 --------------------------------------- device #1 Name = bcm2835 ALSA: IEC958/HDMI1 (hw:0,2) Host API = ALSA Max inputs = 0, Max outputs = 8 Default low input latency = -1.0000 Default low output latency = 0.0016 Default high input latency = -1.0000 Default high output latency = 0.0348 Default sample rate = 44100.00 Supported standard sample rates for half-duplex 16 bit 8 channel output = 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 --------------------------------------- device #2 [ Default Input ] Name = snd_rpi_simple_card: simple-card_codec_link snd-soc-dummy-dai-0 (hw:1,0) Host API = ALSA Max inputs = 2, Max outputs = 2 Default low input latency = 0.0058 Default low output latency = 0.0087 Default high input latency = 0.0348 Default high output latency = 0.0348 Default sample rate = 44100.00 Supported standard sample rates for half-duplex 16 bit 2 channel input = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 Supported standard sample rates for half-duplex 16 bit 2 channel output = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 Supported standard sample rates for full-duplex 16 bit 2 channel input, 2 channel output = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 --------------------------------------- device #3 Name = dmic_hw Host API = ALSA Max inputs = 2, Max outputs = 2 Default low input latency = 0.0058 Default low output latency = 0.0087 Default high input latency = 0.0348 Default high output latency = 0.0348 Default sample rate = 44100.00 Supported standard sample rates for half-duplex 16 bit 2 channel input = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 Supported standard sample rates for half-duplex 16 bit 2 channel output = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 Supported standard sample rates for full-duplex 16 bit 2 channel input, 2 channel output = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 --------------------------------------- device #4 Name = dmic_sv Host API = ALSA Max inputs = 2, Max outputs = 2 Default low input latency = 0.0058 Default low output latency = 0.0087 Default high input latency = 0.0348 Default high output latency = 0.0348 Default sample rate = 44100.00 Supported standard sample rates for half-duplex 16 bit 2 channel input = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 Supported standard sample rates for half-duplex 16 bit 2 channel output = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 Supported standard sample rates for full-duplex 16 bit 2 channel input, 2 channel output = 8000.00, 11025.00, 16000.00, 22050.00, 32000.00, 44100.00, 48000.00, 88200.00, 96000.00, 192000.00 --------------------------------------- device #5 Name = dmix Host API = ALSA Max inputs = 0, Max outputs = 2 Default low input latency = -1.0000 Default low output latency = 0.0213 Default high input latency = -1.0000 Default high output latency = 0.0213 Default sample rate = 48000.00 Supported standard sample rates for half-duplex 16 bit 2 channel output = 48000.00 ---------------------------------------------- |
では、Windowsリモート デスクトップ接続でPi Zeroに接続し、alsamixerを起動してマイクの入力感度を設定してみましょう。LXTerminalを起動して「alsamixer」と入力し、ファンクションキーで切り替えながら設定します。下図は、設定画面の推移を合成したものです。
再生レベルは以前と同じ85に設定。録音は、[F6]で表示される「サウンドカード」選択から[snd_rpi_simple_card]を選択して、音量レベルを84あたりに設定します。
== もう一度、ヘッドフォンアンプの音量を絞ってください! ==
6.I2Sデジタル出力マイクの評価
イヤフォンを装着して、今度はソフトウェアボリュームdmic_svを使って入力するよう指示してみましょう。
$ arecord -D dmic_sv -c2 -r 44100 -f S32_LE -t wav -V stereo -v | aplay |
ヘッドフォンアンプのボリュームを少し(時計の針で40分の位置)上げると、十分な音量で再生できるようになりました。これで音量の問題は解決です。
ところが、少しボリュームを上げると左側にだけ「ジャリジャリ」音が混じります。これも配線の位置をいじると解消し、音質はまずまずです。デジタル信号線なのである程度ラフに構えていましたが、どうやらノイズには非常に敏感なようです。最終的な組立を行う際は、ハンダ付けで安定化を図ること、シールド線でノイズ混入を防ぐことなど、ノイズ対策を徹底することが必要になりそうです。
さて、I2Sデジタル出力マイクは期待通りの性能でした。離れた位置のテレビの音も拾えるし音質もスッキリしています。しかし、テーブルに食器を置いたり食器棚を開け閉めしたりすると、金属的な音が耳にキツいです。これらをどう緩和するかは、音声信号プロセッサーの大きなテーマですが、これはしばらく先のことになります。
ブレッドボード上とはいえ、デジタル聴力補助ツールのベースとなるプロトタイプが完成しました。次回は、音の遅延を回避してどのようなリアルタイムサウンド処理を行うのか、プログラム構造の検討に着手します。お楽しみに!