2022年03月26日

音方位センサ

 ー昨年から断続的に開発してきた音方位センサがやっと形になってきたため、紹介したいと思います。音方位センサは直径4cmの円形基板に4つのMEMSマイクを搭載したセンサで音源の方位を音の時間差から計算してLED及びI2C、UARTで結果を出力する基板です。主な用途として小型の首振りロボットの頭に搭載することで声で頭の向きを変えたり、声でカメラの向きを変更して撮影するといった用途を想定しています。

 基板自体の開発は20年12月に完了していたものの、ファームウェアのアルゴリズムが安定せず、リリースできずにいました。断続的にアルゴリズムの検討、処理の見直しを実施し、最終的にGCC-PHAT(Generalized Cross-Correlation. PHAse Transform)方式である程度、安定して方向検知できるようになりました。GCC-PHATの原理の詳細については多くの論文や資料があるため、こちらでは述べませんが、音の方位を検出する原理として、少し離れたマイクから同時に音をサンプリングすることで、マイク同士の距離の差によって音が到達する時間差から方位を検出します。180度片側の場合、2つのマイクで角度を検出できますが、前方か後方か分かりません。平面の場合、3つ以上あれば360度の方位を検出できます。本センサは1つ冗長ですが、マイクを4つ搭載しています。

ssl_algo.jpg


 まず、ハードウェアの構成として、どのような種類のマイクを使用するかという問題があります。基板の実装密度を高め、より高感度、音の感度が周波数によらずフラットなMEMSマイクを採用しました。MEMSマイクの中でもアナログマイクとデジタルマイク(PDM)のどちらにするかについては、アナログの場合、外付けでアンプが必須で環境によって増幅率が変更な必要な場合があります。デジタルの場合は外付けのアンプが不要な代わりにソフトウェアで処理が必須となります。部品数を減らし、環境にロバストなデジタルMEMSマイクを選定しました。

 微小な音の遅延を測定するため、4つのデジタルMEMSマイクを同時にサンプリングする必要があります。STM32L4シリーズ等ではPDMデジタルMEMSマイクを容易に処理可能なDFSDMを搭載していますが、多くのマイコンはそのような機能を搭載していません。汎用性等を考慮し、今回はSPIを用いて実装しました。4つのMEMSマイクをSPIで同時サンプリングする場合、SPIのクロックを4つで共通にして、SPIの1つをマスタ、残りの3つをSPIスレーブとして実装し、DMA転送することで4つのMEMSマイクの同時サンプリングを実現しています。RAMが十分あり、SPIを5つ搭載しているSTM32F411を選定しました。

sds1.jpg

sds2.jpg


 実際にスマートフォンから水の音を出して方向検知するデモ動画を紹介します。




 GCC-PHATアルゴリズム単体に加えて、誤検知をより防止するため、周波数帯を数kHz前後にフィルタし、音の変化が大きい場合(音のアナログ値の標準偏差)にのみ角度出力することで比較的安定して方向検知できるようになりました。一方で手を叩く音やモノを叩く音のような瞬間的な音の場合、音の反射等の影響が大きくなり、誤検知が多くなります。UARTやI2C通信周りの実装を今後行い、コード、回路図含めて公開後、提供開始したいと思います。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2022年03月12日

PIC32 ウォッチドッグタイマ

 今回はPIC32マイコンのWDTの設定方法を紹介します。WDT(ウォッチドッグタイマ)は名の通り、MPUの動作を見張る番犬です。WDTを有効化するとMPUに異常な処理が発生した場合や意図しない処理の無限ループに入ってしまった場合に異常としてMPUをリセットさせることができます。PIC32マイコンにはWDTの他にDMT(デッドマンタイマ)も搭載されています。目的と用途が異なるため、ここでは詳細は省略しますが、WDTはスリープ等からの復帰にも使用でき、汎用的でざっくりとした時間間隔での監視が可能です。一方、DMTはスリープ復帰には使用できませんが、設定した命令数(処理)に対して細かく監視間隔を設定できます。DMTは少し特殊な用途となるため、今回はWDTのみ紹介します。

 WDTの動作原理として、監視の時間間隔を予め設定し、監視を開始します(WDT_Enable)。そのあと、コード上で定期的にWDTカウントリフレッシュ関数WDT_Clearを呼び出します。正常な場合は予め設定した監視時間よりも前にWDT_Clear関数で正常に動いていることをWDTに知らせます。何かしらの異常が発生した場合は予め設定した監視時間になってもWDT_Clear関数による知らせがWDTにないため、監視時間を超えた時点でWDTが強制的にMPUのリセットを実行する仕組みです。正常動作にも関わらず、監視時間に達してリセットされてしまうということがないように、ある程度余裕のある監視時間を設定すべきです。ただ、余裕にしすぎると万一、異常な状態になった場合にリセットがかかるまでに時間を要することになるため、バランスを見て設定する必要があります。例えば、長い処理ではリフレッシュ関数を所々に予め入れておくといった対応が想定されます。

Harmoney3のProject GraphのSystem項目から設定することができます。


wdt0.jpg

WDTの設定については特に分かりずらく、WDTのパラメータ設定はDEVCFG1から設定します。WDTPSのパラメータを変更することでリセットまでの監視時間を変更することが可能です。

wdt1.jpg

 一方、WDTの有効、無効はDEVCFG1とは別のWDTの項目にチェックを入れることで自動的にWDT関連の関数ライブラリコードが生成されるようになります。WDTPSのパラメータの設定を秒数としてWDT項目から確認することができます。

wdt2.jpg

 パラメータ設定DEVCFG1と有効可否設定WDTが分かれているため、初めてだと戸惑いました。WDTの有効、無効は他のペリフェラル機能と同様にAvailable Componentsに項目を入れた方が直感的で分かりやすいと思いました。
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする