🎹

RP2040で電子楽器(になる予定)の基板を作ってみた

2022/09/26に公開

RP2040 で電子楽器になる予定の基板を自作して頒布を行ったので、そのレポート記事になります。

作った基板

RP2040 と PCM5102A を組み合わせた I2S 出力基板です。幅 100mm、奥行き 77mm で秋月電子では「B基板」と呼ばれるサイズです。端子類は左と上部、操作類は右と下部にまとめました。リフローの手間を考え、基板下面(裏面)には一切の部品がありません。

基板構成

  • SoC: RP2040
  • DAC: PCM5102A
  • 電源: USB Type-C (PD対応)
  • ディスプレイ: OLED (白黒 128x64ピクセル、I2C接続)
  • ストレージ: QSPI Flash 16Mbits (2MB), MicroSDカードスロット
  • ボタン: タクトスイッチ、BOOTボタン、RESETボタン

きっかけ

かつて、FM音源を鳴らす目的で YMF825 (YMF825Board) を使っていました。これを使った自作基板も考えていましたが、ステレオ構成ではボードを2枚以上使う必要があり、頒布すると高額になってしまいます。

そこで、FM音源から一旦頭を離し、矩形波やのこぎり波などの図形的な波形から生成できることを目標に考えることにしました。10年ほど前にソフトウェアでシンセサイザを作ったことはあるので、それをハードウェアデバイスとして作ろうという試みになります。

STM32F303K8

当初は STM32F303K8 をターゲットに開発を始めました。この SoC には次に示す数々のメリットがあったためです。

  • FPU が使える
  • DSP命令 (SIMD命令) が使える
  • 12bit DAC が内蔵されている
  • 水晶振動子が不要など、SoC 周辺回路をシンプルにできる

どれも音を鳴らすには有利な特徴になります。特に DSP 命令や DAC 内蔵は大きく、デジタルフィルタを実装できる上、DAC を外部に持たない分だけ回路をシンプルにできる強みがあります。デジタルフィルタをハードウェア機能を使って実現できることは、減算方式シンセサイザ を実装できる可能性も広がります。

しかし、以下の理由により採用を見送りました。

  • 実装サンプルが少なく、日本語ドキュメントも少ない
  • SoC 単価が高価
  • SoC の供給が不安定
  • プログラム書き換えに ST-LINK が必要

特に致命的だったのは「実装サンプルが少ない」という点です。

この SoC の性能の 100% をシンセサイザとして使おうとすると、コントロール部-シンセサイザ部 というマスタ・スレーブ型の構成が考えつきます。主と従の間には通信が必要になりますから、SPI なり I2C なりの方式を使うことになります。

ところが、STM32 で SPI の スレーブデバイス を使うサンプルが非常に少なく、日本語ドキュメントになると皆無に近い状況でした。自力でドキュメントを辿って 解読を試みました が SPI、I2C、UART のいずれもうまくいきません。1バイトだけ受信できたが2バイト目以降が欠けてしまうなど、ついに安定的な通信を達成できませんでした。通信を目的として開発をしているわけではなかったため、断念に至りました。

また開発以外の面でも強い懸念があった SoC でした。コロナ禍に起因する半導体不足もあり、SoC 自体が入手難で価格も高騰する期間もありました。回路をシンプルにできるとはいえ、SoC が安定的に入手できなければ意味がありません。

RP2040

STM32F303K8 を諦める少し前から Raspberry Pi Pico を使い始めました。発売直後はノータッチだったのですが次に示すメリットがあることがわかりました。

  • デュアルコア
  • 300MHz までオーバークロック可能
  • USB コントローラ内蔵
  • PIO により I2S 対応
  • SRAM が 264KB もある
  • 安価

特に I2S に対応できる点は魅力的でした。DSP や FPU 命令は持っていませんが、デュアルコアや簡単にオーバークロック可能な点はデジタルフィルタを捨ててもメリットになる可能性がありました。また、公式で RP2040 を使った回路を自作する場合の マニュアル も用意されていたり、RP2040 を Arduino プラットフォームとして動かすなどのサンプルが豊富に手に入るため、回路設計に難は全くありませんでした。

外部にクロック源、QSPI フラッシュ、DAC IC などは必要ですが、SoC 単体で130円前後と機能の割に入手しやすく、供給不足という話も聞きません。Raspberry Pi Pico W といった後継ボードにも RP2040 が使われていますので、突然供給が止まるという懸念もないでしょう。

ところで RP2040 は RAM が 264KB もあります。STM32F303K8 では 12KB でしたから、安定的に再生できるバッファを十分確保でき、DPCM などの波形メモリとしても十分量あります。デジタルフィルタが使えない分、別方向の音作りができる可能性があります。

もう一点、大きな特徴は USB コントローラを内蔵していることです。USB デバイス化できることはもちろんですが、プログラム書き換えに特別な回路が一切不要である点が強みです。これは まずデバイスだけ作って、ファームウェアは後日公開して利用者各々で書き換えてもらう という方法を採れます。プログラム書き換えは基板をPCに繋いで BOOT ボタンと RESET ボタンを押し、ファームウェアをUSBフラッシュメモリと同様にドラッグアンドドロップするだけです。実際に今回の頒布ではテスト用のファームウェアしか間に合わなかったため、この方法に絞ることができました。

唯一の懸念は DAC IC です。RP2040 で I2S を使う場合、MCLK 信号を出力できないため PLL を搭載した DAC を使う必要があります。これについては 別記事 にまとめました。PLL 搭載 DAC の場合はかなり数が限られ、入手性も考えて PCM5102A を使うことにしました。TI社の販売方針により IC は今後入手が難しくなりますが、千石電商の実店舗ではかなり在庫数があり、1個あたり610円程度で入手できました。

回路設計

これまで回路として設計したことがないのは RP2040 動作回路、DAC 回路、USB 回路のみでした。その3つに絞って個別に検証、設計を行いました。

RP2040 の回路構成については前述のとおり公式の マニュアル がありますのでこれに従います。今回は ADC を使わないのでこれ周辺の回路は省略できます。また、他社製の RP2040
ボードで Seeed XIAO RP2040 など回路図が公開されているものがありますので、それも参考に設計をしました。

DAC 回路は PCM5102A のデータシートに掲載されている通りの回路にしました。アナログ GND を分離できるため、デジタル側とはフェライトビーズを使ってノイズの低減を試みました。

USB 回路で考慮したのは 27Ω のダンピング抵抗と、PD から 5V を引き出すための 5.1kΩ 抵抗のみです。

基板設計

回路は素直にできたのですが、問題は基板設計です。

まず RP2040 の回路部分は QFN-56 のフットプリントを作るところから考えます。RP2040 の場合は SoC パッケージ下面(裏面)に GND ランドがあり、基板の下面側に大きなスルーホールを設けない限りは物理的に手はんだできません。

一方でリフローの場合は、はんだペースト量が多いと浮き上がりが発生して周囲のピンの接触不良が発生します。これを避けるにはパッドオンビアを使って不要なはんだをビアに流す構造にすればよいのですが、パッドオンビアは製造コストが非常に高く、今回はスルーホールにして解決することにしました。
それでも GND 部分のはんだペースト量が多くなってしまいます。そこでメタルマスクを十字のスリット状にし、中央のスルーホール部ははんだペーストが乗らないよう、スリットの太さでペースト量が絞れるようにしました。

DAC 回路の基板設計ではアナログ GND のベタをデジタル部と分離し、物理的な距離を置くことだけを注意しました。

USB 回路では 27Ω のダンピング抵抗をなるべく RP2040 に近接させること、さらにノイズ対策で D+, D- の配線の間に GND ベタを挟むようにしました。

また今回も基板外観にこだわり、いなださん にイラストを描いていただきました。ご多忙の中、素晴らしいイラストをありがとうございます。

製作

今回も基板とメタルマスクを外注しました。

はんだペーストの印刷まではよかったのですが、ペーストのフラックスが揮発・劣化しているせいか、以前のように綺麗に仕上がりません。こちらの記事 に紹介されている方法でジェルフラックスを混合させて改質を試みました。使用したジェルフラックスは サンハヤトのHD-F25 です。完全復活とまではいきませんでしたが、粘度が低くなって印刷もしやすくなりました。基板レジストが白色のため、フラックスの汚れが目立ちやすくなっているのかもしれません。

また、ペーストの劣化もあって SMD 部品がズレてしまったり、RP2040 に至っては接触不良が起こったりと多難なリフローになってしまいました。部品のズレは Adafruit の プリヒーター で、接触不良は前述のジェルフラックスとはんだごてを使ってピンポイントでリタッチ(再加熱)していきます。今回はペースト劣化により多量にはんだボールが発生したため、顕微鏡も覗きながら丁寧に除去していきます。

リフロー、補修が済んだら一度目の短絡チェックです。5V と GND の短絡がないか、RP2040 のピンどうしが短絡していないか、USBのピンも含めて調べていきます。実際に USB の D+, D- の短絡がありました。

リード部品を取り付け前に、USB として PC に接続することは可能なので、一枚ずつ火入れ(電源投入チェック)をしていきます。今回は無事に全台の確認がとれました。接続に成功するとこの時点で RP2040 がリムーバブルディスクとして認識され、プログラム書き込みができる状態になります。

最後にリード部品を手はんだで取り付け、再度の短絡チェックをして完成になります。今回は電解コンデンサを使っているので、テスタのプローブで 5V と GND を 逆に 接続させるとほんの一瞬だけ導通します。これが正しいプローブの接続で導通してしまうと、電解コンデンサの逆接箇所があるサインになります。

予め用意したテストプログラムを書き込み、MicroSD カード、OLED の表示、DAC からの出力、タクトスイッチが無事に動作すれば完成です。

今後

9月25日のイベントに向けて8台ほど製造ができたので頒布を行いました。しかし今回はテストプログラムのみで単調なテストトーンしか鳴りません。今後は本体アップデートと楽曲データを私が作り、導入は購入者自身でしていただくことになります。

お気づきかもしれませんが、今回製作した基板は Raspberry Pi Pico の機能とほとんど同じです。VBUS や ADC を使うための回路は存在しませんが、代わりに DAC, SD, OLED, タクトスイッチがついています。つまり、ピンアサインさえ合わせれば Raspberry Pi Pico 向けに書かれたプログラムがそのまま動きます。内蔵LEDに至っては GPIO25 と同じにしてあるので、Blink スケッチが無修正で動きます。

基板をどのように使うのかは完全に自由ですので、プログラムを自作して使ってみたい方のために アプリケーションノート を書こうかと思います。そちらのほうで、技術的な注意点などは記述しようかと思います。半分は自身の備忘録の役割ですが、OLED も MicroSD カードスロットもタクトスイッチもあるので、頑張れば 小さなゲーム も作れるかもしれません。

Discussion