🎵

シンセ開発①:Raspberry Pi Picoで音を鳴らす

2024/07/22に公開

本記事は、私が開発しているデジタルシンセサイザに関する内容の一部です。
自作デジタルシンセのまとめ記事はこちら。

Raspberry Pi Picoでシンセを作る

まとめ記事の開発のきっかけから、Raspberry Pi Picoで音を出してみることにました。
まずは、開発環境を用意します。

環境構築

Visual Studio Codeと拡張機能のPlatformIO IDEを導入します。

1. VSCodeのインストール

https://code.visualstudio.com/download

2. PlatformIO IDEのインストール

拡張機能からPlatformIOで検索し、PlatformIO IDEをインストールします。
インストール完了後、必要であればVSCodeを再起動してください。

拡張機能からインストールするだけ

3. 新規プロジェクトの作成

アクティビティーバーのPlatformIOを選択し、PIO Home->OpenでPIO Homeを表示します。
Projectsタブでプロジェクトの作成・管理ができます。

Projectsを選択し、+ Create New Projectをクリックします。


Nameにプロジェクト名、BoardはRaspberry Pi Pico、FrameworkにはArduinoを選択します。

4. Arduino-Pico導入前の設定

Windowsユーザーの場合、Important steps for Windows users, before installingに記載されている通り、GitとWindowsで長いパスを有効化します。
https://arduino-pico.readthedocs.io/en/latest/platformio.html#important-steps-for-windows-users-before-installing

5. platformio.iniの書き換え

Arduino-Picoを利用するために、platformio.iniを以下のように書き換えます。
ビルド時にライブラリがインストールされます。

[env:pico]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = pico
framework = arduino
board_build.core = earlephilhower

6. Debug Probeを使う場合

Raspberry Pi Debug Probeは、UARTシリアルポートとCMSIS-DAPデバッグポートを備えたRaspberry Pi公式のデバッグプローブです。このデバッグプローブもRP2040が使われています。
このプローブを使えば、プログラムの書き込みとデバッグが簡単に行えます。


引用: https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html
Debug Probeを使う場合は以下のように2行追加します。

  [env:pico]
  platform = https://github.com/maxgerhardt/platform-raspberrypi.git
  board = pico
  framework = arduino
  board_build.core = earlephilhower
+ upload_protocol = cmsis-dap
+ debug_tool = cmsis-dap

システムを考える

Raspberry Pi Pico単体でシンセを作るか、他のマイコンを組み合わせるかを考えます。

RP2040のスペック

https://www.raspberrypi.com/products/rp2040/specifications/

  • プロセッサ: Coretex-M0+
    Arm系プロセッサを2つ搭載したデュアルコア、FPU非搭載のため浮動小数点の計算は遅い。
  • クロック数: 133MHz(オーバークロック可能)
  • RAM: 264kB
  • IO: UART、SPI、I2C、PWM、ADCをサポート
    PIOでI2S通信に対応。

GPIOピンが26本と多く、様々な通信プロトコルに対応しています。
デュアルコアなのでコア別に処理を書いたり並列処理したりできそうです。
波形生成でRAMを多く消費することを考慮し、機能別にPicoを用意します。
比較的安価なので制御用にPicoを1つ、波形生成用にPicoを2つ使います。

マスタースレーブ方式を採用

制御用のPicoから、I2C通信で波形を生成するPicoに命令を与える仕組みにします。
画像ではSPI通信をしていますが、I2Cの方が扱いやすかったので変更しています。

SPI通信の実験、データを受信するとLEDが光る

Pico Audio Packを使ってI2Sを理解する

https://www.switch-science.com/products/7380
Pico Audio Pack は PCM5100A を搭載したI2S音声基板です。
ヘッドホン出力とライン出力があります。
接続部分がピンソケットなので、ピンヘッダを付けてブレッドボードに差し込みました。

電源はPicoのVSYSピンと接続している

プログラムを書く

以下の記事を参考に、I2Sで音声出力をするプログラムを書きました。
https://zenn.dev/nanase_t/articles/0a60fc38c52d5d#コード

プログラムを実行する

Debug Probeを使う場合、ステータスバーにある矢印マークから書き込みができます。

チェックマークはビルドのみ、プラグマークはシリアルモニタを起動する。
使わない場合はまず、チェックマークをクリックしてビルドを実行します。
PicoをBOOTCELボタンを押したままPCに接続し、.pio/build/pico にあるfirmware.uf2
ストレージデバイスとして認識されたPicoにドラッグ&ドロップします。

プログラムを実行すると、Audio Packから音声が出力されました。

PCM5102Aで音声出力をする

https://akizukidenshi.com/catalog/g/g111836/
秋月電子で購入したPCM5102Aを使って音声出力をしてみようと思います。
PCM5102AはTexas Instruments社が提供するステレオDACです。

  • 解像度: 最大32bit
  • サンプリング周波数: 最大384kHz
  • PLL内蔵(外部クロック回路が不必要)
  • 電源は3.3V、Picoの3V3ピンから電源供給が可能。

https://www.ti.com/product/PCM5102A?bm-verify=AAQAAAAJ_____wCiZZAggY78NOogg5C1aAsTwXEDjeFmPYwYc2x7H0VdaNRz86GlL7yyraNPO-8DYFpCGNqgxn6HledCIOGyhLB1ila4dGroG_neq8Vx6BzMDH3TtUP-eK0fZHwhvq6Z0O4u59bTcecdZg6hpyIbgpA1fkO6TSW2tRXBjpQpWLvo2tX4WmHHZCFY5lR88K1OhHAdLBUGtBItPJisZ4cIwU2XWLgT1467Qiq2_izaj_uypae2poxU-_ZjoudD1MFbXR4fJ2ruH7brTx7NGzsd

DAC用の回路を組む

以下のサイトを参考に、PCM5102Aを動作させるために必要な回路を組みました。
https://bokunimo.net/blog/raspberry-pi/3123/#実装例
2つの波形生成PicoからPCM5102AでD/A変換し、パッシブミキサー的にmixして出力します。
電源周りが面倒なため、オペアンプは実装しません。
音声の増幅は、プリアンプなど別の機器を使用します。
最終的に、このような回路になりました。

ここまでくるとThe 電子工作という感じがする

音を出力してみる

https://youtu.be/TvJBrd_W67c
2機のDACから音を出力することができました。


次の記事
https://zenn.dev/saisana299/articles/ab1af5fe0bac74

Discussion