RaspberryPi Pico で 高度Lチカ 音の光出力

銭湯の料金1回分で買えるRaspberryPi Pico、恐ろしい能力を秘めていました。
専用ICチップ無しにSPDIFで音楽を光送出するのにも使えるPIO機能の装備は、
他の廉価マイコンボードに真似ができません。
Example Programとして用意されている、Sine波出力プログラムを
https://github.com/raspberrypi/pico-playground/tree/master/audio/sine_wave

アレンジして、好みの楽曲のWAVファイルから、高度Lチカによって光再生する
Cソースコードを生成し、コンパイルして書き込む手順をここに公開します。

表面実装タイプのボード1枚のまま、何も増設せずに再生できるように、Flash
2MBの範囲(10秒程度繰返し)で書き込めるサンプルプログラムとします。
Example ProgramのSine波の代わりにWAVファイルから取り出したPCMデータの
先頭から10秒程度を与える形のソースコード生成をツールで支援してくれます。

ソースコード生成のためにPythonプログラムを用意しています。
母艦はWindowsでもMacでもOKですが、ここではPico親類のRaspberry Pi3Bや4B
での操作例をハードコピーしています。

用意すべきWAVファイルは、16BitモードでMonoにフォーマット変換したリアルPCM
のものです。Stereoでの実装は、まだ少しチューニングが必要なようです。

1)ツールによるソースコード生成
(cmd)python3 uf2convWav.py -o sine_wave_spdif.c  -C 入力WAVファイル名
次の uf2convWav.py を実行することで、ソースコード sine_wave_spdif.c
が生成されます。
https://mori1-hakua.tokyo/test/uf2convWav.txt (拡張子変更)

2)Pico開発環境のセットアップ
クイック・セットアップとして紹介されている手順で整備します。
https://www.raspberrypi.org/blog/how-to-blink-an-led-with-raspberry-pi-pico-in-c/
blink.uf2 を作って書き込んでみるのは、いい予行演習になりますね。

3)sine_wave のアレンジ
2)の「cd pico/pico-examples」の代わりに「cd pico/pico-playground」と
入力し、お定まりの手順を実行し、配下のaudio/sine_wave に移動します。
mkdir build
cd build
cmake ..
make
次に、CMakeLists.txtのadd_executable(sine_wave_spdif sine_wave.c)を、
add_executable(sine_wave_spdif sine_wave_spdif.c)に替えます。
また、同じディレクトリ内に、1)で生成したsine_wave_spdif.cを追加します。

4)コンパイルしターゲットファイル作成
再び、buildディレクトリで、
cd build
cmake ..
make
によって、配下のaudio/sine_waveディレクトリに出力されたuf2ファイルを
確認します。(Flash2MBを超えても、平気で書き込むので要注意です)

5)Picoボードへの書き込み
Blinkプログラムと同様の方法です。
PicoボードのBOOTSELボタンを押したまま、母艦からのUSBケーブルを接続し、
次のCopyコマンドを実行します(ケーブル抜差しを避けるにはRUN端子を使う)。
cp build/audio/sine_wave/sine_wave_spdif.uf2 /media/pi/RPI*

6)オーディオ装置への光入力
Picoボードに5Vを供給、光デジタル入力のあるオーディオ装置で、入力形式を
PCMと設定し、光ケーブルの一方をPicoボードのLEDに近づけます。
GPIO12をGNDに落とせば、用意した楽音とサイン波とを交互に切り替えることが
出来ます。
なお、オーディオ装置の初期ボリューム設定には、十分に留意してください。

カテゴリー: RaspberryPi パーマリンク

RaspberryPi Pico で 高度Lチカ 音の光出力 への2件のフィードバック

  1. fujii のコメント:

    先駆者が、映像を投稿していますね~。
    これです。

  2. fujii のコメント:

    次の修正を施せば、GPIO12のボタンの代わりに、BOOTSELボタンを判断できる。

    1)CMakeLists.txtのspdifの先頭に、次の追加をする
     set(PICO_EXAMPLES_PATH ${PICO_EXAMPLES_PATH} CACHE PATH “Path to the PICO EXAMPLES” FORCE)
     add_subdirectory(${PICO_EXAMPLES_PATH} pico_examples)

     target_link_libraries(sine_wave_spdif PRIVATE
         pico_stdlib
         picoboard_read
         pico_audio_spdif
        )

    2)sine_wave.spdif.cに1行追加し、RESET_btnへのgpio3行をコメントにする
      extern bool __no_inline_not_in_flash_func(get_bootsel_button)();
     if文とwhile文の条件を変える。
      (!gpio_get(RESET_btn)) → (get_bootsel_button())
    3)pico-examplesのpicoboard/button/button.c からmain() を抜いたbutton_read.c を
     作って置いておき、CMakeLists.txtに次を加える。
     add_library(picoboard_read
        button_read.c
       )
    # Pull in our pico_stdlib which pulls in commonly used features
     target_link_libraries(picoboard_button pico_stdlib)
     target_link_libraries(picoboard_read pico_stdlib)

    Connected.
    BOOTSEL BUTTON accepted
    Specified music
    BOOTSEL BUTTON accepted
    Sinewave sound
    BOOTSEL BUTTON accepted
    Specified music
    BOOTSEL BUTTON accepted
    Sinewave sound

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です