◆まえがき
◆仕様
帯域:100, 200, 500, 1k, 2k, 5k, 10k, 20k, 50k, 100k,180kHz
感度:-80db (1Vpp=0dB)
入力インピーダンス:約120kΩ
FFTの仕様 サンプル数:256、窓関数:ハニング、ライブラリ:ArduinoFFT.h
波形表示:128x16画素(上部)、スペクトル表示:128x48画素(下部)
◆回路図(クリックで別窓に拡大)
・配線し易いように前回の記事に対しピンアサインを変更。
◆ソフト
内容についてはこのカテゴリの過去記事参照。
◆実装
・外観
秋月のポリカケース(117-中)に入れました。
入力端子はBNCなので各種アダプタがそのまま使えて便利です。
表示のOLEDはSH1106(1.3インチ)を使いましたが、ソフト修正でSSD1306(0.96インチ)も使えます。
・内部
モジュール間はコネクタで分離出来るように作りました。
・基板を外した状態
銅箔テープは入力端子への誘導ノイズ対策です。
基板は3mmのプラビスにダイソーのアイロンビーズをナットの代わりに差し込んで固定しています。
・基板
Picoは直付けしても良かったのですが、ピンヘッダとソケットを使って取り付けました。
寝かせて取り付けられている黒い電解コンデンサはC1で、誘導ノイズを出来るだけ減らすためにGNDに接続したスズメッキ線で抑えています。
・基板を抜いた状態
Picoのソケットの内側のコンデンサはC11とC12です。
・基板裏面
秋月のC基板(の互換品)を少し切って使いました
・使い方
この写真のようにモバイルバッテリーで使うと便利です。
オシロの10倍のプローブもとりあえず使えます。但しアッテネーションは約1/60(約 -35dB)で周波数補正していないので高域で感度低下があります。
◆まとめ
構想から完成まで1月くらいかかってしまいましたが何とかまとめることが出来ました。FFTアナライザーは持っていれば何かの時に役に立つと思います。
◆エラーやご注意など
アンチエイリアシングフィルターが無いので、折り返しノイズがそのまま見えるので要注意。
Picoの入力ピン(GP26)に手を近付けると誘導ノイズを拾ってバックグラウンドのレベルが少し上がります。金属ケースで作れば良かったです。
ADコンバーターのフルスケールを超えた電圧を入力すると、画面表示がめちゃくちゃになります。たぶん内部的にオーバーフロー割り込みが発生し、その処理を適切に行っていないためだと思います。幸い、この現象は入力レベルを下げると復旧します。
素早くレンジボタンを操作すると反応しないことがあります。ボタン操作を受け付けるとOVERのLEDを点灯させているので、このLEDを見ながら操作すると確実です。
- 関連記事
-
blogを拝見、居酒屋ガレージ店主様と同様、「こりやなんとしても作らねば」とばかりに、早速pico基板を購入。
悪戦苦闘(?)、やっとの思いでシリアルポートを認識させ、Blinkと内臓センサ温度計は動作するようになりました。
そして肝心のFFTに挑戦、Fft AnalyzerV062をコンパイルすると
/U000 feff does not name a type とあえなく撃沈。
エラーメッセージの意味も分かりませんが、もしかして選択したボードが間違っているのでしょうか。
Raspberry Pi Pico には何種かあるようですが
Mbed OS Boards
Mbed OS RP2040 Boards
Raspberry Pi PR2040
の3つは試してみました。いずれもうまくいきません。
御面倒ですがアドバイスをお願いします。
記事を読んでいただいたありがとうございます。
>/U000 feff does not name a type
の意味は判りませんが、ライブラリが入っていない気がします。
なお、念のためにこの記事にリンクを置いたプログラムをダウンロードして使ってみましたが、こちらでは正常に動きました。
ボード設定は、IDEのメニューから辿ると、
Arduino Mbed OS RP2040 Boards → Raspberry Pi Pico
です。
この記事のプログラムはDMAを使っているのでちょっとレベルが高いので、まずは以前の記事に掲載したバージョンを試された方が良いと思います。
動作確認して頂いた方もいらっしゃいます。
https://plaza.rakuten.co.jp/v62000/diary/202207020000/配線は変えなくてもレンジ切り替えが出来ないだけで動作確認はできます。
早速の御教示ありがとうございます。
全くの初心者で怖いもの知らず、arduinoFFT.hは探して入れたのですが、hardware/adc.h と hardware/dma.h はなんぼ探しても見つからなくて、コンパイルして今までのArduinoのファイルなしのエラー表示が出なかったので、それでよいものと勝手な解釈をしていました。(ArdunoFFT.h を入れないと従来のファイルなしの表示が出ました)
すみません、hardware/adc.h 、 hardware/dma.h のDL先を教えてください。お手数かけます。
すみません、勘違いしていました。
hardware/adc.h と hardware/dma.h をライブラリマネージャーを使って入れたと思っていたのですが、先ほど確認したらそういう項目がヒットしませんでした。たぶんボードの定義あたりと一緒に最初から入っているのだと思います。
ということで、ライブラリが入っていないのでは?というコメントは的外れなものでした。
そんなことで、何でコンパイラが通らないのか原因が判りません。前のコメントに書いたようにもう少し簡単なバージョンのプログラムで問題の有無を確認するのが良いと思います。
ご教示のようにスケッチを20220617_PiPicoMultiRangeFftAnalyzer.inoを使ってコンパイルしてみました。やっぱりエラーが」出ます。
"exit status 1
ボードRaspberry Pi Picoに対するコンパイル時にエラーが発生しました。"
の表示です(ボードは Arduino Mbed OS RP2040 Boards )
私のパソコンのAruino本体が色々いじって古いArduinoやらライブラリーなど、ごちゃごちゃしていますの、一度整理して挑戦してみます。
naoさん了解です。
表示関係が正常に動くことを確認するため、スケッチ例に入っている U8g2→full_buffer→GraphicsTest.ino
が正常に動くことを確認すると良いと思います。
下記の行のコメントを外せば動きます。(今やってみました)
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
今晩は。
細かいことで済みません。
ようやく時間ができましたので貴殿のスケッチを拝見しました。
さて、dma_chanという変数についてなのですが…。
まず、グローバル変数として17行にuint dma_chanとして定義されています。
そして、463行、void dmaadc_setup(float clock_div)関数中にも同名でローカル変数として定義されています。
そもそもこの関数中で得た値を他の関数で利用するのが本来の狙いではないかと思います。
たまたま、ADC0以外にDMAチャンネルが使われていないので、グローバル変数も、こちらのdmaadc_setup()関数中のローカル変数も値がゼロとなり、問題が起きていなかった、ということではないかと思います。
vabenecosiさん、コードを見て頂いてありがとうございます。
グローバル変数の dma_chan の値を初期化しないで使ってました。これで動いているのは運が良かったということですね。
なお、ローカル変数とグローバル変数で同じ名前が使われていても相互に干渉しないので影響は無いのではないかと思いますがどうでしょう。もちろんやらない方が良いですが。
もちろん影響はないのですが。
というよりも、本来はこのvoid dmaadc_setup関数で得たこの値を他の関数でも利用するつもりであるのが(つまり「影響を与えたい」ということ)、そうはならないということです。
本当に問題が全く起きないとは限りませんから、直しておいた方がよいと思います(例えばDMAの転送が全部終わっていないのに、同じチャンネルをアサインしようとしたらどうなんでしょう?そんなことは起きないとは思いますが)。
ちょっと問題が起こりそうな例として挙げたものが悪かったですね。
通常はDMAを中断する場合(そして再初期化する場合)はまず動いているDMAを止めるはずですね。
余談ですが、そんな場合は私はDMAのCSR(Control Status Register)の該当ビットを直接操作しています。
DMA disable: CHx_CTRL_TRIGレジスタのビット0をゼロにする
DMA abort: CHAN_ABORTレジスタに0xffffffffを書き込む(全チャンネル中断)
Arduinoで使うc/c++ sdk的記述ではおそらく以下の関数を使うのかな?
dma_channel_unclaim (uint channel)
dma_channel_abort (uint channel)
問題のタネを残しておくと、プログラムを再利用するときなどに嵌りそうなので次に改版する時に直しておきたいと思います。
ちょうど連絡が取れているのでお話しますが、居酒屋ガレージ日記さんが新しいパルジェネのソフトを公開されています。
http://igarage.cocolog-nifty.com/blog/2022/08/post-c07c42.html具合が良さそうなので
https://twitter.com/radiopench1/status/1563453143295602688?s=20&t=-m8K6WJUA2SlGQYJTB6RWAスイッチ追加や配線変更が必要ですが入れ替えを予定しています。
当方のブログにも居酒屋ガレージ日記さんからコメントを頂きました。
私の方のものはddsを付けたり、クロックを変えたりというヘンタイ改造をしてしまっているので残念ですが簡単には試せないのですよ。
先日はお手数をかけ申し訳ありませんでした。
U8g2lib.hライブラリをさがし、zipファイルを自分で解凍librayフォルダーへ押し込んでいましたが、上手くいかず、
netの”U8g2のインストール方法”という頁に習い、ライブラリマネジャからu8g2をインストールしたところ、U8g2lib.hがインストールされました。
その結果、FFTアナライザをコンパイルすることができました。手許の04gateを使った誂え向き(?)波形の良くない発振器から入力、
ちゃんと表示されています。
今回は私の初歩的なミスで、いらぬお手数をかけ、失礼いたしました。ノイズを抑えケースに入れるよう挑戦してみます。ありがとうございました。
naoさん、レポートありがとうございます。このような製作記事を書いていると、うまく動いたという連絡が一番嬉しいです。
ライブラリは保存する場所が昔とは変わったりしたので、Webの古い情報を見て設定すると思い通りにいかないことがあったと思います。ライブラリマネージャーでやるのが安全です。
はじめて書き込みさせていただきます。
年末年始休みで、色々なHPを拝見していたところ、素晴らしい作品の数々に、時間を忘れて見入っていました。
しばらくぶりに何か作ってみたくなり、部品箱を漁るとATmega328は有りますが「Raspberry Pi Pico」は有りません。
しかし、よく見ると何時買ったか覚えていない同じCPUを使った「Seeed Studio XIAO RP2040」が有りました。
本日はブレッドボード上ですが、公開して頂いているプログラムを一部書き換えるだけで、OLED(SH1106)に表示して、スイッチ操作までは確認できました。
このままではノイズが多いようなのですが、このボードは、カバー内にUTDFNサイズのレギュレータが入っているようで、素人にはバイパスするのは無理そうです。
どちらにしろ、入力回路等の部分が出来上がったら、ご報告させていただきます。
パオさん、情報ありがとうございます。
XIAO RP2040ならコンパクトに作れて面白そうですね。このブログが多少なりともお役に立てているなら嬉しいです。
以前、XIAO RP2040で組み立てていたと連絡させて頂きました。
やっと、完成しましたので報告です。
ブログも始めましたので、公開させて頂きました。
https://me-yoh.com/これからも、よろしくお願いします。
パオさん、完成おめでとうございます。そちらの記事拝見しましたが、スリムに作られていて格好良いですね。
残留ノイズの件ですが、パイピコは電源にスイッチングコンバーターを使っているのでノイズが大きいのですが、XIAOのボードはシリーズレギュレーターだったと思うので同じ問題は起きない気がします。
ノイズが入る原因はいろいろあるのでアドバイスは難しいですが、私のスペアナではOLEDの電源のGNG側の電流パスがノイズの原因になっていたことがあります。
FFTアナライザを組み立ててノイズに困っていたところ、アドバイスどおりにOLEDにコンデンサを追加したりの対策をしたら改善しました。
ありがとうございました。
Raspberry Pi Pico Wを買ったので、WEBサーバーにしてHTMLでのWEB表示機能を追加してみました。御参考まで。
凄いことをやられたんですね。
プログラムを拝見しました。
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
で切り替えて機能追加しているんですね。
大きな画面で見たい時に便利dしょうね。今後何か作る時に参考にさせていただきます。
後で飛び易いようにURLを見える形で書いておきます。
http://harahore.g2.xrea.com/RaspberryPiPico/RPPicoFFTAnalyzer.html