Raspberry Pi Pico W でFFTアナライザー

更新日 2024.03.13 登録日 2023.09.17
*

Raspberry Pi Pico Wを買ったので、ラジオペンチさんの ラズピコでFFTアナライザーを作る をWEBサーバーにしてHTMLでのWEB表示機能を追加してみました。 PCやスマートフォンの大きな画面でスペクトラムを確認できます。専用のアプリは必要ありません。

波形データの送信にはWebSocketを使っています。WebSocketの通信は手抜きでEndian処理をしていません。そのためBig EndianのCPUでは正しく波形が表示できません。いまどきそんなCPUは少ないと思いますしPentiumやARM系のAndroidであれば使えますので大丈夫でしょう。波形の描画にはHTML5のCanvasを使っています。FFTの基本機能はマルチコアのCORE0で処理し、WiFi機能はCORE1で処理するようにしています。ピークホールド機能は都合により省略しました。

開発環境は Arduino IDE 1.8.19 + Raspberry Pi Pico/RP2040 by Earle F. Philhower, III version 3.4.0です。

結果的にWEB表示が出来るようにはなりましたが、WEBタスクがデータのサンプリングに干渉するようで、特にDMAを使わない低速サンプリング時にデータの乱れが発生します。マルチコアであってもバスを共有してますから。データの送信完了時間も不定で、このままではどうしようもありません。計測器としては元のままの方が良いと思います。大きな画面で見たい時だけこちらを使ってみるのが良いでしょう。まあ、こんなことも出来るという参考になれば幸いです。ESP32でも同じようなことが出来ますが、A/Dコンバーターがいまいちなのであまりお勧めしません。

ソースコード

PiPicoFftAnalyzerW101.zip 2024.03.13 update
ライブラリ arduinoFFT 2.0.0 更新対応

PiPicoFftAnalyzerW.zip ライブラリに arduinoFFT 1.6.1 利用

WebTask.inoの
const char* ssid = "XXXX";
const char* pass = "YYYY";
に使用するWiFiアクセスポイントのssidとpasswordをXXXXとYYYYに記入する必要があります。ソースコードを少し変更すればAPモードにすることも可能です。

WebSocketsのライブラリはライブラリマネージャーから検索できるものではなく、以下を使いました。
Links2004/arduinoWebSockets

Pi Pico用にも変更無しでコンパイル出来るように自動的にpre-defineを見てWEB機能を外すようにしてあります。

Arduino Mbed OS RP2040 Boards 3.1.1 でもコンパイルできますが、CPUがPi PicoのみでWEB表示は出来ません。

操作方法

先ず起動する前にArduino IDEのシリアルモニターを開いておきます。プログラムが開始してWiFiアクセスポイントに接続成功したらIPアドレスを取得してシリアルモニタに表示します。そのIPアドレスをWebブラウザのアドレスバーに入力すればWEBに接続できるはずです。
例えばシリアルモニタに、
WiFi Connected. IP = 192.168.1.128
と表示されたら、Webブラウザのアドレスバーに192.168.1.128と入力します。

mDNSを使うようにしたので、ホスト名 picowfft.local で接続できるはずです。ブラウザによっては http://picowfft.local にしないと駄目なものもあるかもしれません。

FASTボタンで高速サンプリングに、SLOWボタンで低速サンプリングに変更出来ます。

類似プロジェクト

(2023.10.22 update)

ESP32を使った同じようなものを見つけました。

Episode 570: Making a WiFi Connected Audio Spectrum Analyzer with ESP32

こちらはデータをバイナリではなくJSONで文字列にして送っていたり、グラフ描画にChart.jsを使ったりと一味違います。また、周波数軸を対数目盛にしているようでこの辺の仕組みは良く理解できていません。周波数の目盛が少しずれているような気がします。

また、データのサンプリングにESP32のI2SでI2S_CHANNEL_FMT_ONLY_LEFTを使った場合のバグに対応していないので、変なノイズが入ります。この場合、データの順番が0,1,2,3...ではなく1,0,3,2...のようになってしまうので順番を入れ替える必要があります。波形の表示が無いので気が付いていないみたいです。このバグが最近のチップで修正されているかどうかは定かではありません。


<=Arduinoで電子工作に戻る
<=Siliconvalley4066番地に戻る
ゲストブックへ
siliconvalley4066@yahoo.co.jp