銭湯の料金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に落とせば、用意した楽音とサイン波とを交互に切り替えることが
出来ます。
なお、オーディオ装置の初期ボリューム設定には、十分に留意してください。
先駆者が、映像を投稿していますね~。
これです。
次の修正を施せば、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