Pico三昧(19) ADCをちょっと触ろうとしたらPicoprobe消えていた。いつもの?

Joseph Halfmoon

今回マイクロフォンをPicoのADCに接続して実験しようと思い立ったのです。ビルドした後になって気づきました。前々回インストールして動作OKになっていたPicoprobe、認識されてません。なして?そういえば今週例のアレが走ってなかったか。しかたがないので今回はPicoprobe無で実験。Picoprobe復活は次回?

※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。

Windows updateの祟り?

いざ、ビルドしたオブジェクトをPicoprobeのSWD経由でPicoに書き込もうとしてopenocdでエラーになりました。調べてみると、前々回、しっかりと見えていた筈のデバイス「Picoprobe CMSIS-DAP v2(Interface 0)」が消息不明です。

このような状況、他のマイコン開発ツールでも何度か経験してます。正確にいえばラズパイをホストとしている場合でなく、Windowsホストに特有の現象。発生するのはいつも週の後半、Windowsアップデートが火曜か水曜に走った後。症状としては、Zadigでドライバを再設定しているデバイスが消えてしまう現象っす。勝手にドライバのアップデートがあるとなにか「祟り」があるのではないかと想像。過去数回のケースでは、再度ドライバを設定しなおせば復活してきました。でも今回はメンドクサイのでまた次回ね。デバッグするほどのコードでもないし。

ラズパイPicoへのマイクロフォンの接続

さて御存じのとおり、マイクロフォン単体をラズパイPicoのADC端子に直結するわけにもいきません(とりつけてもなんだか分からないっと。)でもま、よくしたものでマイコンADCに接続できるようにしたマイクロフォンのモジュールが販売されてます。中身はオペアンプで増幅するだけですが。今回使用したのは、Arduino用の以下のモジュールです。DFROBOT製。

Gravity: Analog Sound Sensor For Arduino

回路図を拝見するに、LM358(定番!)を2段で合計300倍に増幅しているみたいです。これでよわよわのマイクロフォンの信号がADCかけられるようになるっと。Picoに上記モジュールを取り付けた様子が以下に。

MicroPhone_DUT

 

なお、今回以下のドキュメントの後ろの方にある

Raspberry Pi Pico C/C++ SDK

Appendex A: App Notes の中の Attaching a microphone using the ADC という部分にあるサンプルコードを利用させていただいております。ここで使用されているのは以下のマイクロフォン・モジュールでした。多分似たようなもんじゃろうう?知らんけど。

SparkFun製 ICS-40180

今回の実験

今回はホコリを被っていたDFROBOTのマイクロフォンモジュールが、ラズパイPicoのADCに接続して「動くんだよね」という確認です。ついでにAttaching a microphone using the ADCのサンプルコード、ソフトウエアループでポーリングですが「サンプリング周波数」的なものを確認しておきたいです。

サンプルコードは以下のような「特徴」なので、音声波形をサンプリングできるような速度はまったく期待できません。

    1. ソフトウエアループの中でADCを読んでいる
    2. ADCの結果はループの中でシリアルポートに文字列出力している
    3. ループの末尾で10msecの待ちが入る

3があるので、絶対に100Hz以上の速度でサンプリングできるわけがありません。音声など無理。単にマイクロフォンを「サウンドセンサ」として使っているのみ。ドアが開いたぜ、ガッチャン、とか検出するくらいが関の山?

まあこのソフトウエアループを出発点にして、いろいろ手をいれても少し速いサンプリング速度に持ち上げたいという野望があるわけですが。

    • マイクロフォン・モジュールの出力信号は26番(ADC0)端子に接続。
    • AD読み取るところは、サンプルコードそのまま
    • ループの回転速度を測るために22番端子をトグルするコードを追加
CMakeLists.txtを作成

Attaching a microphone using the ADCには、CMakeLists.txtの例も掲載されているのです。前回折角 pico-project-generator をインストールしたので、それを使って生成してみます。

projGen

なお、最初PicoprobeのUARTを使うつもりだったので、Console over UARTにチェック入れてますが、Picoprobe使わんことになったので、後からUSBシリアルに変更してます。自動生成のCMakeLists.txt上は、0/1切り替えるだけでどちらへでも接続できるようになってますので、変更は簡単。

生成したCMakeLists.txtの一部が以下に。

CMakeListsBefore

みやれば、黄色のマーカ部分の下にadc用のライブラリをリンクするようになってません。そこだけは手動で追加してみました。こんな感じ。
CMakeListsAfter

ループ速度を測るための改造

初期設定部分に以下のピン22の初期化コードを加え、

#define TOGGLE_IO (22)

gpio_init(TOGGLE_IO);
gpio_set_dir(TOGGLE_IO, GPIO_OUT);
bool pin = false;
gpio_put(TOGGLE_IO, pin);

ループを以下のように勝手変更しました。Loop

これでピン26の信号をAD変換してUARTに垂れ流しつつ、ピン22をトグルする筈。

実行結果

まずはマイクロフォン・モジュールのAD変換値。静かにしていたときの出力。Quiet

続いて騒音発生したときの様子。マイクロフォンに向かってあーあーと「呼びかけてみた」だけ。Noisy

ホコリ被っていたけど、マイクは生きているみたい。

さてループの速度はいかに。ループの速度は結構安定してますな。ほぼ50Hzとな。samplingRate

50Hzは1周期20msec。でもトグルだから1周期に2回サンプリングが入っているハズ。つまりこの実体はほとんど10msecの待ち時間ってこと?uart出力が邪魔だけれども結構いける?何が。

Pico三昧(18) picotool有、pico-project-generator要導入 へ戻る

Pico三昧(20) Picoprobe復活、しかしなぜ「そこに」?動いたからまあいいか。 へ進む