パタカカウンターとは?

あんまり歯科医療については書かないつもりなんですが、マイコンとリンクする部分が多かったので記事にしてみます。歯科関係じゃない人のほうが多いと思いますので、単に何を作ったかというと特定の発音「ぱ」「た」「か」を早く言って秒間何回言えたかを計測する機械をつくりましたよって記事です。

なにそれ?役に立つの?楽しいの?

まぁ、歯科医療者、高齢者介護に携わる方などは、ちょっと興味あるかもしれないですがニッチな代物ですw。ちなみに製品がでてますが買うと4.5万ぐらいしたりします。音をカウントするだけなので自作できるかなぁと思い作ってみました。もしかしたら、早口ゲームとかにも応用できるかもしれません

上のMax4466という比較的高性能なマイクモジュールを利用してESP32の内臓ADCで音の分析を行います。


Max4466を使ってみる

音声分析といえば高速フーリエ変換(FFT)です。音声周波数で分解することで何が発音されたかを調べるとか、特定の音を検知するのに用います。このMAX4466でもFFTを行ってみると結構正確に計測することができました。下のサイトを参考にしました。

最初は「パ」「タ」「カ」を周波数で分離して認識してカウントしようと思ったのですが、どうも万人に利用するには結構厳しく、高速で発音するものをカウントするには向いていないものでした。

というわけで、MAX4466からくる波形データからダイレクトにカウントする方法に切り替えました。なので「パ」「タ」「カ」の発音をカウントというか、なんでもカウントできます。


コードディング環境・必要部材

開発環境はVSCode + PlatformIOでフレームワークはarduinoです。ソースはmain.cppだけなのでArduinoIDEでも簡単にイケると思います。利用するライブラリは

  •  jchristensen/movingAvg@^2.3.1
  •  marcoschwartz/LiquidCrystal_I2C@^1.1.4

です。利用機材は

  • ESP-WROOM-32 Dev Module
  • MAX4466(上のリンク)
  • 1602 LCD I2Cアダプタ付き
  • LED 2個と制限抵抗330Ω程度LEDによります
  • プッシュスイッチ(リセットボタン)
  • 電源スイッチ(適当に)
  • マイクの筒になる配管(TS継手ソケットTS-S30)
  • マイク固定部(Fusionで設計後3Dプリント)
  • ユニバーサル基板、ネジ類、コードは適宜

です。部材は、MAX4466以外は太古から使い古された安定したものばかりです。1602LCDは最近ではI2Cモジュールが組み込まれたものもありますし、3.3Vでも表示OKなものもあります。ロジック電圧は3.3VでOKなものがほとんどですが表示、バックライトでは5vが必要なことが多いです。USBから電源をとる場合はESP32のVInに接続しないとダメです。新規購入から始める人は3.3Vですべて完結できる製品を選ぶべきです。うちには5V在庫が大量にあるので無理くり使いますw。

今回、ポータブルで使う為乾電池4本(6V)を電源として利用しようと思っています。ESP32の開発ボードに搭載されているレギュレーターは大体AMS1117-3.3と思いますので発熱の問題を考えなければ12VまでOKです。なのでEPS32のVInに1V程度高い6Vを入れても問題はないでしょう。1602LCDのI2Cモジュールは6VまでOKとのことですがマージンがありません。5Vに降圧するか、ダイオードを1つ接続してマージンを取るのがいいかもしれません(Ni-MH1.2v×4はの場合は電圧不足かも)。ちなみに部品点数多くしたくないので、行儀悪く直で接続しましたが動きましたw。行儀よく行きたいのであればLDOレギュレータを検討してみてください。ESP32とI2Cアダプタを接続する場合もLLCを使うのが行儀がいいです。


コーディングと完成

コードは毎度おなじみGitHubに丸投げです。

流れとしては以下の通りです

  1. おおよそ2000μ秒(1500μs+計測時間)毎に5回サンプリングして平均値でMAX4466から信号を取得
  2. 値が正の数を取るようにベースラインにて反転させる
  3. 発音を検知するH_VALUEと発音が終わるL_VALUEを検出してカウントを行う
  4. 移動平均が安定するまで20カウントまでは最大値を記録しない

コード自体は難しいことは一切していないです。スイッチのチャタリングがひどいので使うスイッチによると思いますが適当にDelayかけてください。

実際組み立ての方が大変です。コード中にあるピンアサインに各種コードを接続します。電源の引き回しなんですが、LCD(I2C)のVCCは6vを与えていますが、ほか(MAX4466等)のVCCには3.3vを与えています。アマゾンのコメントにありましたが、MAX4466は大変壊れやすいらしいので注意が必要らしいです(なんの?w)。回路図は気が向いたら書きます

投稿者 まる

Twitter : @dinagon Instagram : @d_dinagon フォロバします!!最近、ESP/Arduinoいじりすぎでアプリ開発が進んでない。歯医者なのに歯のことはあまり触れませんw

Amazon プライム対象