1,概要
SiPEED社が出しているMaixシリーズはAI実行可能なマイコンボードであり、このMaixシリーズにつなげて使用できるマイクアレイというのも、SiPEED純正で出ている。

このマイクアレイを使って音源方向を検知することができる。R6+1マイクアレイ、という名の通り7個のマイクが円形に並んだアレイであり、12個のフルカラーLEDも円周上に並んでいる。円周上に並んだマイクのそれぞれが拾った音から、音が来た方向を割り出すことができる。
できるんだけど……純正品にも関わらず、使い方の情報が少ない!少ないというかほぼ無い。
なので、ネットで色々調べた使い方について、自分用に記事としてまとめておく。
中身のコード自体は「Maix Bit と 6 + 1 マイクロフォンアレイで音源可視化」を参考にした。(参考というよりそのまんまだけど…)
2,ピンの繋ぎ方
マイクアレイは10本の線でマイコンボードと繋ぐ。各ピンがどの役割なのか、ピンの名前が書かれている。

また、接続は裏のピンヘッダに付属の線を繋ぐことで行う。

付属の配線を中央のピンヘッダに挿していけばいいんだけど、私は線をはんだ付けして左右に出すような感じにした。ピンヘッダに挿すと線が真下に伸びる感じになって、マイクアレイを置いても安定しない感じになっちゃうので……。
マイクアレイはマイコンボードのGPIOのどこにつないでも良い。他に自分が使いたいピンと被ってさえいなければどこでもいい。あとでどれをどれにつないだのかプログラム上で明記することになる。
役割のないGPIOピンならどこに繋いでもいいんだけど、シリアル通信用のピンとか、固有の役割があるピンには繋がないほうがいいと思う。
各ピンの役割については、https://qiita.com/uzuki_aoba/items/c82e0d72a738a1098b32を参考に。
3,プログラム
from Maix import MIC_ARRAY as mic #MIC_ARRAYのライブラリ from Maix import FPIOA import time from fpioa_manager import * from board import board_info from Maix import GPIO, FPIOA mic.init() Fpioa = FPIOA() Fpioa.set_function(6, fm.fpioa.I2S0_IN_D0);#MIC_D0 Fpioa.set_function(11, fm.fpioa.I2S0_IN_D1);#MIC_D1 Fpioa.set_function(8, fm.fpioa.I2S0_IN_D2);#MIC_D2 Fpioa.set_function(7, fm.fpioa.I2S0_IN_D3);#MIC_D3 Fpioa.set_function(15, fm.fpioa.I2S0_WS);#MIC_WS Fpioa.set_function(21, fm.fpioa.I2S0_SCLK);#MIC_CK Fpioa.set_function(20, fm.fpioa.GPIOHS28);#LED_CK Fpioa.set_function(9, fm.fpioa.GPIOHS27);#LED_DA while True: imga = mic.get_map() d = mic.get_dir(imga) a = mic.set_led(d,(0,0,255)) mic.deinit()
今回使うのは液晶ディスプレイが搭載されていないM1n moduleなので、参考にした資料にはあった画面に音源マップを表示させる機能は入れていない。記事末尾の参考資料に画面表示有りのものについてリンクを貼った。
これを実行すると、マイクが拾った音から音の方向を検知し、音が来た方向のLEDを光らせる事ができる。
マイクアレイの各ピンをMaixモジュールの何番ピンにつないだのかということを、Fpioa.set_functionで指定する。上のコードの例だと、マイクアレイのMIC_D0と、M1n moduleの6番ピンをつないだとき、このような記述にする。
マイクアレイの10本のピンのうち2本は電源(Vcc, GND)なので、それ以外の8本についてはそれぞれ上のように繋いだピン番号を明記しておく。電源は3.3Vに繋いでも一応動いたけど、SiPEED社が出してる回路図を見る限り5Vに繋いだほうがいいと思う。
上のコード22行目のdという変数は要素数12個のリストになっており、マイクアレイ上の12個のLEDのどれをどのくらい光らせるかという情報が入っている。マイクアレイの12時の位置にあるLEDを0番目として、以降時計回りに1,2,3番目……として、リストで数値が指定されている。音が来た方向には大体10前後の値が入り、他は0が入る。つまり、3時方向から音が来たら、リストの3番目に値が入る。実際には多少の検知ブレ(もしくは音の広がり)が反映されるので、3時方向から音が来たら3番目だけに値が入るということはなく、2, 3, 4番目に値が入る。入る値の大きさは均等ではなく、音の方向に応じた重みのようなものが反映されるので、たとえ2, 3, 4番目に値が入ったとしても、3時方向から音が来たのであれば(うまく動作していれば)3番目に入っている値が一番大きな数値となる。
4,参考資料
https://qiita.com/airpocket/items/a03c1309df36a6795ba5
https://qiita.com/uzuki_aoba/items/c82e0d72a738a1098b32
https://github.com/sipeed/MaixPy_scripts/blob/master/hardware/demo_mic_array.py