SSブログ

RP2040で音の再生実験 [DCCデコーダ]

 お台場のヴィーナスフォートが来年の3月で閉店ということで、12/29に見納めに行ってきました。若い頃はよく行きましたが、近ごろは、外国人観光客も増え、また子供向けの施設でもないような気がしたため、足が遠のいていました。まあ、中はあまり変わっておらず、記憶を思い出しつつ適当に360度カメラで写真を撮っておきました。
 で、本題ですが、やあさんさん、なごでんさんと次期DCCデコーダに向けて話し始めていて、Raspberry Pi Pico RP2040でDCCデコーダー作るときにちゃんと音が出せるかどうかの確認を始めました。
 今まで使っていたDIYデコーダに使用していたATMega328P(1Core,8bit,8MHz,32kbyte)に比べ、raspberry pi Picoに搭載されているRP2040は2Core、32bit、125MHz,Flash2MByteとそれぞれのスペックがCore2倍、CPUビット数4倍、動作クロック15倍、メモリ62倍と、掛け算すると今までの約7000倍の可能性があることになります。(ほんとか?)
 今まであった制約は、
・効果音は、メモリが足りないので長時間のクオリティの高い音をでファイルが入れられない。(頑張って8kHzで4秒ぐらいだった)クロックが低いため、同時発音数を一音に限った。
・モーター疑似音も、音の長さが取れず、大きさの調節が難しく、和音も出せず、結果として音が残念になっていた。
 です。
 今回RaspberryPicoで、ArduinoIDEでコンパイルでき、ライブラリも使えるものは使えるらしいということで、適当なスケッチを作り、音を出してみました。
 あとで大体忘れるので、過程も書いておきます。
 やあさんさんの記事を参考に環境構築します。
 具体的には、RP2040開発環境をArduinoIDEに入れます。
「ファイル」→「環境設定」
追加のボードマネージャで
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
を指定して、
Raspberry Pi Pico/RP2040をインストール。1.9.9を入れました。

ArudinoにRaspberryPiPicoを認識させる方法ですが、最初のおまじないとして、
①リセットボタンを押しながらUSBケーブルを挿して、PCにPicoをストレージとして認識させる。
(このときCOMポートとしては認識しない。)
②この状態で、スケッチを書き込むと、IDEから認識されるものがCOM4(Raspberry pi pico)のような表記となり、この後は認識されています。
次からは、何も考えずにスケッチは書き込めるようになりました。
Comポートをシリアルモニタとかで開きっぱなしにしていると、書き込み時にエラーが出ました。

 次に音を出すための割込みですが、今までのモノはATMega328P専用で作っていて当該bitをいじってやっていましたので、そのまま流用できません。RP2040のタイマー割込みを確認すると、二つあるそうです。

高レベルAPIのpico_timeとhardware_timerの2種類が用意されているようですが、

https://raspberrypi.github.io/pico-sdk-doxygen/group__hardware__timer.html#details
https://raspberrypi.github.io/pico-sdk-doxygen/group__pico__time.html#details

なんか、スケッチを動かすと、comポートが認識されなくなり、どうやらちゃんと動かないです。

ということで、RPI_PICO_TimerInterruptを使います。
https://www.arduino.cc/reference/en/libraries/rpi_pico_timerinterrupt/
私の時は、RPI_PICO_TimerInterrupt 1.1.1でした。
ソースは以下のようです。
https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
とりあえず、これで割り込みができるようになりました。

 次に音をどう出すかですが、流行りので行くとI2Sで出す!だと思うのですが(それ用のPIOとかも世の中のライブラリにあるようですし)、まあ、デバッグとかも考えると、PWMで出して、LPFかけて、アンプで増幅していいか?ということにしました。
 具体的には、基板のA0端子からPWMを出して、それを昔作ったアンプ基板386でLPF+増幅して、スピーカーから出すことにしました。アンプ基板386は12V必要なので、PicoとGNDだけ共通にして、別電源から12V供給しています。
 で、今回の実験環境はこんな写真になります。
DSC03566.jpg

 スケッチはこちらになります。
https://desktopstation.net/wiki/lib/exe/fetch.php/timer_test5.zip
 スケッチの操作方法は0~6 をSerialで送信すると、その音がなり、cで音を消します。

 スケッチで使用している音源は、
https://desktopstation.net/sounds/mp3.html

・サウンドパック・日本版 R3 (Mar 20, 2014)
・185系 特急踊り子 (2021/5/31)
から拝借して、Wav変換して使用してます。

 動画は以下です。





コメント(0) 

今年もそろそろ終わりですね・・・。

 お久しぶりです。
 ここ。数年、仕事が忙しくて、何か、人生いまいちです。
 それはさておき、
 Desktopstation様で、プレゼント付きのDCCアンケートしていますので、ぜひお答えいただいたらと思います。
 年末年始は、電子工作をしようかと思っています。多分。

コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。