2021年5月17日月曜日

Raspberry Pi PicoでUSB-DAC(I2Sボードをつけて音出し)

前の投稿でRaspberry Pi PicoをUSB-DACにするソースコードをコンパイルし,ボードに書き込んで,パソコンでUSB-DACとして認識させるところまでできたので,今回は最終的に音出しまでします.

まず,I2S-DACボードはこれを使いました.Raspberry Pi Picoに足の配置が合わせてあり,そのまま挿すことができます.ボードの裏には,Raspberry Pi Picoの絵が描いてあり,挿す向きもわかります.Raspberry Pi Picoに足をはんだ付けしますが,足が曲がって付かないように,Raspberry Pi PicoとI2S DACボードの両方にピンを挿した状態ではんだ付けします.

実際に動かすには,ソースコードの書き換えが必要でした.この製品のページ

You can use Pico Audio Pack with the I2S audio examples provided by Raspberry Pi in their experimental examples (usb_sound_card and sine_wave_i2s). You'll need to #define PICO_AUDIO_I2S_DATA_PIN and PICO_AUDIO_I2S_CLOCK_PIN_BASE to 9 and 10 respectively to tell the examples which pins are being used for the audio data.

とあります.具体的にこれらの値が定義されているファイルは

pico-extras/src/rp2_common/pico_audio_i2s/include/pico/audio_i2s.h 

です.このファイルを以下のように書き換えます.


#ifndef PICO_AUDIO_I2S_DATA_PIN
//#warning PICO_AUDIO_I2S_DATA_PIN should be defined when using AUDIO_I2S
// https://shop.pimoroni.com/products/pico-audio-pack
#define PICO_AUDIO_I2S_DATA_PIN 9 // 28
#endif

#ifndef PICO_AUDIO_I2S_CLOCK_PIN_BASE
//#warning PICO_AUDIO_I2S_CLOCK_PIN_BASE should be defined when using AUDIO_I2S
// https://shop.pimoroni.com/products/pico-audio-pack
#define PICO_AUDIO_I2S_CLOCK_PIN_BASE 10 // 26
#endif


実際に使っているピン番号は12, 14, 15なので,なぜこの番号なのかは謎です.この後,pico-extrasをbuildしなおします.その上で,pico-playgroundをbuildしなおします.

pico-playground/build/usb_sound_card/usb_sound_card.uf2をRaspberry Pi Picoに書き込むと,ボードが再起動して,音がこのボード経由で出せるようになります.

I2Sボードの方はPCM5100Aで32bit, 384kHzまで出力できるのに,Raspberry Pi PicoがXMOSと違いソフトウェアで処理を実行しているので,16bit, 44.1kHz/48kHzしか出力できないのは残念です.

ただ,ソフトウェアでUSBから入力した信号をI2Sに出力しているので,ここで信号処理が色々できると面白いと思います.ソースコードの公開されているUSB-DACって,物がないので,自分でいじるには貴重はハードウェアではないでしょうか.

2021年5月15日土曜日

Raspberry Pi PicoでUSB-DAC(I2Sボード無しでbuild,installまで)

Raspberry Pi PicoでLチカの続きです.

Raspberry Pi PicoからI2S信号をI2S-DACに出力すると,Raspberry Pi PicoのUSBがパソコンに対してslave側なので,パソコンのUSBに外付けしてUSB-DACとして使えるのでは?という話です.



この商品の記述に,「カスタムUSBサウンドカード」って書いてあるので,いろいろ探してみた所,こういうソースコードを見つけました.ざっと眺めてみると,どうもUSBとI2Sを両方使っているので,USBオーディオデバイスとしてパソコンから認識されて,I2Sに信号を流し込めるっぽいです.

このページをみると,pico-playgroundはpico-extras内のライブラリを使っていると書いてあります.

まず,pico-sdkやpico-exampleディレクトリのあるディレクトリで以下ようにライブラリとexampleを取得します.

git clone -b master https://github.com/raspberrypi/pico-extras.git
git clone -b master https://github.com/raspberrypi/pico-playground.git

ここの,pico-playground/apps/usb_sound_card/がそれっぽいです.


まずは,pico-extrasからbuildします.

cd pico-extras
git submodule update --init
mkdir build
cd build
export PICO_SDK_PATH=../../pico-sdk
cmake ..
make

これでpico-extras以下が全てコンパイルできした.


次にpico-playgroundをbuildします.

cd ../../pico-playground
mkdir build
cd build
export PICO_SDK_PATH=../../pico-sdk
export PICO_EXTRAS_PATH=../../pico-extras
cmake ..
make

これでpico-extrasが全てコンパイルできました.


Raspberry Pi PicoのBOOTSELボタンを押しながらUSBケーブルでMacに接続すると,RPi-RP2という外付けストレージとして認識されます.

pico-playground/buildの中のファイルapps/usb_sound_card/usb_sound_card.uf2をRPi-RP2の中にコピーすると,RPi-RP2がアンマウントされ,Raspberry Pi Picoが再起動してプログラムが動きます.このとき,Raspberry Pi Picoは外付けUSBストレージとして認識されません.画面の一番上のオーディオボリュームをクリックしてみると,無事にオーディオ出力デバイスとして認識されているようです.


また,/アプリケーションズ/ユーティリティ/Audio MIDI設定.appを起動してみると,48kHzと44.1kHzが使えて,初期値が48kHzのオーディオデバイスとして認識されていることがわかります.



Raspberry Pi Picoに足をはんだづけするのを忘れたのと,I2S DACボードを家に持って帰ってくるのを忘れたので,とりあえず今日はここまでです.

続きはここで.

Raspberry Pi PicoのSDKをmacOSでセットアップしてC言語でLチカ

Linuxの動かないRaspberry Pi,Raspberry Pi Picoの開発環境をmacOS (Catalina 10.15.7)上に構築します.



以下のページを参照してmacOS上を構築しました.

https://fukuno.jig.jp/3116

以下のようにSDKをインストールして,コマンドラインからサンプルプログラムblinkをbuildしました.


brew install cmake
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc

cd ~/
mkdir pico
cd pico

git clone -b master https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update --init
cd ..
git clone -b master https://github.com/raspberrypi/pico-examples.git

cd pico-examples
mkdir build
cd build
export PICO_SDK_PATH=../../pico-sdk
cmake ..

cd blink
make


いつものように,まずはLチカから動かしてみます.Raspberry Pi PicoのBOOTSELボタンを押しながらUSBケーブルでMacに接続すると,RPi-RP2という外付けストレージとして認識されます.
上のコマンドラインでbuildしてできたblink.utf2ファイルをRPi-PI2の中にコピーすると,RPi-RP2がアンマウントされて,プログラムが動きます.



引き続きこのページで,Raspberry PiをUSB-DACにしてみます.

SONY SpresenseでLチカ(LEDチカチカ)on macOS

 今さらですが,SONY Spresenseボードを購入しました.このページでは,macOSでLチカ(LED点滅)するまでをメモしておきます.

参考にしたページは以下の2ページです.

https://developer.sony.com/develop/spresense/docs/introduction_ja.html

https://developer.sony.com/develop/spresense/docs/arduino_set_up_ja.html


1. 遮光シールの貼り付け

まず,Spresenseボードを開封すると,同じ袋の中に黒いシールが入っています.


これを以下のように貼り付けます.

2. シリアルポートの確認

macOSでは(2021/5/14現在, macOS Catalina 10.15.7),SpresenseボードをMacにUSBケーブルで接続したとき,Spresenseボードの青いLEDが点灯し,
コマンドプロンプトで「ls -ltr /dev」 というコマンドの出力が以下の赤枠のようになっていれば,認識されています.

このうち,「cu.SLAB_USBtoUART」を使います.

3. Arduinoのセットアップと起動

Arduinoの公式サイト
から,macOS用のArduinoをダウンロードします.
上のようなページが表示されるので,そのまま上図の赤枠の「JUST DOWNLOAD」をクリックすると,ファイル「arduino-1.8.14-macos.zip」がダウンロードされます.このファイルをダブルクリックして展開すると,Arduinoのアプリケーション「Arduino.app」が展開されます.このファイルを「/Applications」フォルダーに移動してください.Arduino.appをダブルクリックして起動すると,以下のようなダイアログが表示されるので,
そのまま「開く」をクリックするとArduinoアプリケーションが起動します.

4. Spresense用のArduinoの設定

ArduinoをインストールしただけではSpresenseは使えないので,使えるようにします.メニューバーの「Arduino」→「Preferences...」を選ぶと,次のような環境設定ダイアログが開きます.赤枠で囲われた「追加ボードのマネージャーのURL:」にURLを追加します.
赤枠の右端のボタンをクリックして,「追加のボードマネージャーのURL」ダイアログを開きます.URL
https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/generic/package_spresense_index.json
を追加します.ブラウザ上で上のリンクを右クリックして,「リンクをコピー」して,ペーストすれば良いでしょう.OKボタンで「追加のボードマネージャーのURL」ダイアログを閉じ,「環境設定」ダイアログも閉じます.

次に,メニューバーで「ツール」→「ボード"(何かが表示されている)"」→「ボードマネージャ...」を選択します.
「ボードマネージャ」ダイアログが開きます.
上のテキストボックスに「Spresense」と書き込むと,上の図のようにSpresense Reference Boardが表示されるので,「インストール」ボタンをクリックします.インストールが終わったら,次の図のように「インストール」ボタンが消えます.
このダイアログを閉じます.

次に,Spresenseボードを選択します.次の図のように「ツール」メニュー→「ボード:"(何かが表示されている)"」→「Spresense Boards」→「Spresense」を選択します.
次にシリアルポートを選択します.「ツール」メニュー→「シリアルポート:"(何かが表示されている)"」→「cu.SLAB_USBtoUART」を選択します.
次に書込装置を選択します.「ツール」メニュー→「書込装置:"(何かが表示されている)"」→「Spresense Firmware Updater」を選択します.
このボードにはブートローダが書き込まれていないので,ブートローダを書き込みます.「ツール」メニュー→「ブートローダを書き込む」を選択します.
書き込みが始まると,次のようなダイアログが表示されます.
左下に表示されている,赤枠で囲われたチェックボックスにチェックを入れると「OK」ボタンがクリックできるようになるので「OK」ボタンを押してください.
Arduinoのウィンドウに「ブートローダの書き込みが完了しました.」と表示されたら,プログラミングの準備は終了です.

5. サンプルプログラムの書き込み・動作

次のようなプログラムを書き込むことにします.
以下からプログラムをコピペしてください.「ファイル」メニュー→「名前をつけて保存」を選択し,適当な場所に「LED1」という名前でプログラムのスケッチを保存することにします.

void setup() {
    pinMode(LED0, OUTPUT);
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
}

void loop() {
    digitalWrite(LED0, HIGH);
    delay(100);
    digitalWrite(LED1, HIGH);
    delay(100);
    digitalWrite(LED2, HIGH);
    delay(100);
    digitalWrite(LED3, HIGH);
    delay(1000);

    digitalWrite(LED0, LOW);
    delay(100);
    digitalWrite(LED1, LOW);
    delay(100);
    digitalWrite(LED2, LOW);
    delay(100);
    digitalWrite(LED3, LOW);
    delay(1000);
}
上の図の左から2番目にある「→」が書き込みボタンです.このボタンをクリックすると,ボードにプログラムが書き込まれ,ボードがリセットされてプログラムが動きます.

4個のLEDが順に点灯して,順に消灯するという動作を繰り返します.

プログラムはフラッシュメモリに書き込まれているので,パソコンからUSBケーブルを抜いて,モバイルバッテリーに繋いでも動作します.