airpocketのアイコン画像
airpocket 2021年12月02日作成 (2021年12月09日更新) © Apache-2.0
製作品 製作品 閲覧数 2441
airpocket 2021年12月02日作成 (2021年12月09日更新) © Apache-2.0 製作品 製作品 閲覧数 2441

音源の方向を教えてくれるおしゃれでスマートなシルクハット

音源の方向を教えてくれるおしゃれでスマートなシルクハット

はじめに

Maix Bitを使って音源定位と可視化」の記事で紹介した装置「Sound Visualizer」ですが、片耳の聞こえない方から音の方向が判ることの価値を教えていただきました。
自分の技術が世のため人のために役立つならばと思いウェアラブル化を考えていたものの、技術的な課題が多く実現できていませんでした。
しかしながら、不完全でも形にしてみれば判ることもあるかと思い、ヒーローズリーグ2021の決勝にノミネートされたことをきっかけにウェアラブル化してみました。

その名も 「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日現在マルツさんが最安の様です。今回はカメラもディスプレイも使用しないのでボード単体でOKです。

6+1 Microphon Array

キャプションを入力できます
今回の主役、私もお気に入りのセンサーボードです。音の方向を検出することができます。
Switch Scienceさんが最安っぽいですが、マルツさんでMaixBitと合わせて買って、送料無料にするのがよさそうです。

振動モーター

キャプションを入力できます
アリエクスプレスで購入したφ12×3.4tのボタン型振動モーターを使用しました。このモーターでも振動が強すぎるくらいですので、より小型で低出力のものの方が望ましいです。

モバイルバッテリー

一番の重量物となるため、なるべく小型軽量のものが良いでしょう。

おしゃれな手作りシルクハット

頭部にセンサーが固定出来ればOKですが、今回はデバイス一式を仕込みたかったため容積を稼げるシルクハット型としました。
ウェアラブルデバイスは装着感とおしゃれさが重要ですのでもっとも時間と手間暇をかけて作りました。今回のプロジェクトではこれをおしゃれであると定義します。

ヘアバンド

キャプションを入力できます
ダイソーで購入したヘアバンドです。振動モーターを縫い付けて頭部に固定します。

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は180Ωを使用しています。

プログラム

MaixBitはMaixPyでコーディングしています。

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. 装着感、おしゃれ度の向上が望ましい
    今回のシルクハット型デバイスは、パーティなどにも装着していきたくなるほど十分におしゃれですが、より小型、軽量であることが望ましいケースもあるかと思います。眼鏡/ゴーグル型、補聴器型、ヘッドホン型、ネックレス型など最適な形状のデバイスを選択する、もしくはシーンに合わせて選べるようにするのが望ましいかと思います。

次のステップはさらに難易度が上がりますが、さらに開発を進めていきたいと思います。

2
airpocketのアイコン画像
電子工作、プログラミング、AI、DIY、XR、IoT M5Stack / Raspberry Pi / Arduino / spresense / K210 / ESP32 / Maix / maicro:bit / oculus / Jetson Nano / minipupper etc
ログインしてコメントを投稿する