airpocket が 2021年12月02日23時41分32秒 に編集
初版
タイトルの変更
音源の方向を教えてくれるおしゃれでスマートなシルクハット仮
タグの変更
MaixBit
MaixPy
マイクアレイ
メイン画像の変更
本文の変更
# はじめに 「[Maix Bitを使って音源定位と可視化](https://elchika.com/article/af968c98-a6d0-41fa-8e09-291c43eddd40/)」の記事で紹介した装置「Sound Visualizer」ですが、片耳の聞こえない方から音の方向が判ることの価値を教えていただきました。 自分の技術が世のため人のために役立つならばと思いウェアラブル化を考えていたものの、技術的な課題が多く実現できていませんでした。 しかしながら、不完全でも形にしてみれば判ることもあるかと思い、[ヒーローズリーグ2021の決勝にノミネートされたこと](https://civictech-hl2021.peatix.com/)をきっかけにウェアラブル化してみました。 その名も **「Sound Direction Indicator」** そのままですね。英語にするとカッコいいと思っています。 # 完成品    シルクハットの頭頂部にマイクロフォンアレイを仕込んでいます。 ハットの屋根は開閉式で、屋根裏部分にマイコンボードとバッテリーが入っています。 このデバイスは、マイクロフォンアレイとMaixBitで音の方向を検出、12方向の位置情報に合わせてシルクハット内の振動モーターを動作させて使用者に伝達します。 振動モーターは伸縮性のあるヘアバンドに装着しており、頭部との密着性を上げるとともにそれぞれの振動を絶縁して振動方向を認識しやすくしています。 方向データは12方向で取得していますが、実装の都合上モーターは6個使用となっています。 0,2,4,6,8,10時方向から音を検出した場合はそれぞれの方位に配置した振動モーターを動作、1,3,5,7,9,11時方向から音を検出した場合はその両サイドのモーター2個を振動させることで、方位を表現しています。 # 使用部材 今回使用した部材です。 ## MaixBit  前回も使用したK210搭載のマイコンボードです。小型でGPIOも多いので、Maixシリーズでは一番使いやすいかと思っています。徐々に入手しにくくなってきていますが、2021年12月1日現在[マルツさん](https://www.marutsu.co.jp/pc/i/33134818/)が最安の様です。今回はカメラもディスプレイも使用しないのでボード単体でOKです。 ## 6+1 Microphon Array  今回の主役、私もお気に入りのセンサーボードです。音の方向を検出することができます。 [Switch Scienceさん](https://www.switch-science.com/catalog/5713/)が最安っぽいですが、[マルツさん](https://www.marutsu.co.jp/pc/static/guide/delivery)でMaixBitと合わせて買って、送料無料にするのがよさそうです。 ## 振動モーター  アリエクスプレスで購入したφ12×3.4tのボタン型振動モーターを使用しました。このモーターでも振動が強すぎるくらいですので、より小型で低出力のものの方が望ましいです。 ## モバイルバッテリー 一番の重量物となるため、なるべく小型軽量のものが良いでしょう。 ## おしゃれな手作りシルクハット 頭部にセンサーが固定出来ればOKですが、今回はデバイス一式を仕込みたかったため容積を稼げるシルクハット型としました。 ウェアラブルデバイスは装着感とおしゃれさが重要ですのでもっとも時間と手間暇をかけて作りました。今回のプロジェクトではこれをおしゃれであると定義します。 ## ヘアバンド  [ダイソーで購入したヘアバンド](https://jp.daisonet.com/collections/accessory0228/products/4900662636226)です。振動モーターを縫い付けて頭部に固定します。 ## 200Ω半固定抵抗×6個  振動モーターの出力制御に使用します。 安価な振動モーターを選定したことも一因かと思いますが、モーターごとに出力のばらつきが大きく、この抵抗で出力調整しています。 ## 2N2222トランジスタ×6個  TO-92パッケージを使用し、振動モーターのスイッチングに使用しています。 ## 基板やコネクタや配線適量 今回は1枚のユニバーサル基板上にMaixBitやモーターのスイッチング回路を配置しています。 場所の節約のため、配線には主にφ0.1 UEW線を使用しました。 # 回路 ## Maix BitとMic Arrayとの接続は前回と同じです。 |Maix Bit| Mic Array| |:---:|:---:| |PIN23|MIC_D0| |PIN22|MIC_D1| |PIN21|MIC_D2| |PIN20|MIC_D3| |PIN19|MIC_WS| |PIN18|MIC_BCK| |PIN17|LED_CK| |PIN15|LID_DA| |3V3|VIN| |GND|GND| ## モーター駆動回路  モーターはトランジスタでスイッチングしています。 R1は470Ωを使用しています。 ## プログラム MaixBitはMaixPyでコーディングしています。 ```python from Maix import MIC_ARRAY as mic from Maix import FPIOA from Maix import GPIO from board import board_info from fpioa_manager import fm import lcd import utime from Maix import utils #heap mem使用量確認及び設定用 utils.gc_heap_size(1000000) #heap mem確保量の設定。画像処理は行わないので増量不要 lcd.init() mic.init() Fpioa = FPIOA() # reconfigure pins after mic.init() to match your wiring # mic array のインスタンスを初期化後、通信用PINを定義 Fpioa.set_function(23, fm.fpioa.I2S0_IN_D0); Fpioa.set_function(22, fm.fpioa.I2S0_IN_D1); Fpioa.set_function(21, fm.fpioa.I2S0_IN_D2); Fpioa.set_function(20, fm.fpioa.I2S0_IN_D3); Fpioa.set_function(19, fm.fpioa.I2S0_WS); Fpioa.set_function(18, fm.fpioa.I2S0_SCLK); Fpioa.set_function(17, fm.fpioa.GPIOHS28); Fpioa.set_function(15, fm.fpioa.GPIOHS27); #モーター制御用PINの定義 IO30-35を使用 fm.register(30,fm.fpioa.GPIO0) fm.register(31,fm.fpioa.GPIO1) fm.register(32,fm.fpioa.GPIO2) fm.register(33,fm.fpioa.GPIO3) fm.register(34,fm.fpioa.GPIO4) fm.register(35,fm.fpioa.GPIO5) PIN0=GPIO(GPIO.GPIO0,GPIO.OUT) PIN1=GPIO(GPIO.GPIO1,GPIO.OUT) PIN2=GPIO(GPIO.GPIO2,GPIO.OUT) PIN3=GPIO(GPIO.GPIO3,GPIO.OUT) PIN4=GPIO(GPIO.GPIO4,GPIO.OUT) PIN5=GPIO(GPIO.GPIO5,GPIO.OUT) Motor = [PIN0,PIN1,PIN2,PIN3,PIN4,PIN5] Motor[0].value(1) utime.sleep_ms(1000) Motor[0].value(0) while True: imga = mic.get_map() #mic arrayから16x16pixelの音源マップを取得 dir = mic.get_dir(imga) #音源マップから音の方向を計算 mic.set_led(dir,(1,1,1)) #音源方向のLEDを点灯。0-255の値で色と明るさを設定。 preset = [0, 0, 0, 0, 0, 0,] #モーターのオンオフ情報を初期化 #音の方向情報をモーターのオンオフ情報に変更 if dir[0] > 1: preset[0] = 1 if dir[1] > 1: preset[0] = 1 preset[1] = 1 if dir[2] > 1: preset[1] = 1 if dir[3] > 1: preset[1] = 1 preset[2] = 1 if dir[4] > 1: preset[2] = 1 if dir[5] > 1: preset[2] = 1 preset[3] = 1 if dir[6] > 1: preset[3] = 1 if dir[7] > 1: preset[3] = 1 preset[4] = 1 if dir[8] > 1: preset[4] = 1 if dir[9] > 1: preset[4] = 1 preset[5] = 1 if dir[10] > 1: preset[5] = 1 if dir[11] > 1: preset[5] = 1 preset[0] = 1 for num in range(6): Motor[num].value(preset[num]) utime.sleep_ms(200) #モーター起動にある程度時間が必要なため、200msecの稼働時間を確保。 mic.deinit() ``` # 最後に 前回のSound Visualizerの製作から1年ほど経ってしまいましたが、ようやく進化させることが出来ました。概念実証試験としてはおおむね成功となり、新たな課題の掘り起こしが出来ました。 得られた課題は次の通りです。 1. 自分の声に反応してしまう この問題が想定できていなかったのは大きな手落ちですが、当たり前と言えば当たり前。自分がしゃべるとぶるぶる震えます。音声認識技術などを用いて、自分の声には反応しない様にすべき。 2. 方向の伝達はもっと解像度を上げるか、下げるかのどちらかが良い 音源を正確に伝えたいならば、振動モーターの数を増やしてより細かな方位を伝えたい。NeoPixelの様に、モーター一個一個にICを併設した振動モーターアレイの様なデバイスがよさそう。 一方で、後方からの自動車接近時の危険予知などを想定したシーンでは、視界の外の音のおおよその方位を伝えるだけも十分に機能を発揮できそう。たとえば、右後ろ/真後ろ/左後ろ、程度の分解能でもOKか。 3. 音の種類によって振動を変えるなど、情報量の向上が望まれる 現在は振動のON/OFFのみ制御しているが、音の大きさにより強弱をつける。もしくは音の周波数に合わせて振動の周波数を変えるなどが出来れば、より情報量を増やせるかも。 4. そもそも振動モーターが最適か? 振動を様々にコントロールできるハプティックデバイス、低周波治療器のような電気刺激、温度刺激、振動ではなく肌を軽く押さえるだけ、など、もっと最適な提示方法があるかも。 5. 振動絶縁 デバイス(シルクハット)の剛性が高すぎると一つのモーターを動かしただけでハット全体が震えて振動方向が判別できなくなる。ヘアバンドだけの方が判別しやすい。(ただしおしゃれ度が低下する) 6. 装着感、おしゃれ度の向上が望ましい 今回のシルクハット型デバイスは、パーティなどにも装着していきたくなるほど十分におしゃれですが、より小型、軽量であることが望ましいケースもあるかと思います。眼鏡/ゴーグル型、補聴器型、ヘッドホン型、ネックレス型など最適な形状のデバイスを選択する、もしくはシーンに合わせて選べるようにするのが望ましいかと思います。 次のステップはさらに難易度が上がりますが、さらに開発を進めていきたいと思います。