guiメモ

技術寄りの雑記(予定)

ポータブルハイレゾUSB DACの試作

概要

CH32マイコンを用いてFRISKのケースに収まる大きさのUSB DAC開発ボードを作成しました。32bit/384kHzに(のみ)対応しています。

はじめに

CH32V305/307にはUSB-HS PHYが搭載されており、これを用いるとUSB周りの外付け部品なしでUAC2.0によりハイレゾ音源を再生できるようになります。今回は秋月電子で取り扱いが開始されたCH32V305FBP6を用いたシンプルなUSB DAC開発ボードを作成しました。

USB DAC開発ボードの作成

今回はプログラムの動作確認を行うために必要最小限の機能を備えることを目的とし、CH32V305FBP6にPCM5102Aを直接接続しただけのシンプルな構成を採用しました。

今回作成したUSB DAC開発ボードの回路図
あまりにもシンプルな回路なので、持ち運びしやすいように仕上げることとしました。具体的には、FRISKのケースに収まるように基板を設計しました。
完成した開発ボードの外観
蓋を開けたときの様子
開発ボード単体の写真
ケーブル類を装着したときの様子

プログラムの準備

公式githubにUSB Audioのサンプルは執筆時点で公開されていませんが、解説記事とともにサンプルプログラムを公開されている方がいるため、こちらを参考にプログラムを改変していきます。
今回作成した回路のクロックは16MHzであるため、まずはUSB周りのクロックの設定を変更します。こちらは先に示した記事にある通りにch32v30x_usbhs_device.c内にあるUSBHS_RCC_Init()関数の内容を次のように分周比が2となるように変更します。

RCC_USBHSPLLCLKConfig( RCC_HSBHSPLLCLKSource_HSE );
RCC_USBHSConfig( RCC_USBPLL_Div2 );
RCC_USBHSPLLCKREFCLKConfig( RCC_USBHSPLLCKREFCLK_8M );
RCC_USBCLK48MConfig( RCC_USBCLK48MCLKSource_USBPHY );
RCC_USBHSPHYPLLALIVEcmd( ENABLE );
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_USBHS, ENABLE );

次にI2S周りのクロックの設定を変更します。system_ch32v30x.c内にあるmyI2S_SetSysClock()関数の内容を次のように予め用意されてある16MHz向けのものに変更します。

#if 1
    //384K 32bit MCK DISABLE HSE 16M
    u32 temp=0;
    //HSE
    temp=RCC->CTLR;
    temp|=RCC_HSEON;
    RCC->CTLR = temp;
    while(RCC->CTLR & RCC_HSERDY==0);

    temp=RCC->CFGR0;
    temp&=(u32)~0x3FF0;//AHB APB2 APB1
    temp|=(u32)0x3D0002;//PLL-16 HSESource PLLSource
    RCC->CFGR0=temp;
    RCC->CFGR2=0x10000|0x40|0x0A00|0x04;//DIV2-5 PLL2-12 DIV1-5

    temp=RCC->CTLR;
    temp|=(1<<26);
    RCC->CTLR=temp;
    while( (RCC->CTLR & (1<<27)) == 0 );//PLL2READY

    temp=RCC->CTLR;
    temp |= (1 << 24);
    RCC->CTLR=temp;
    while( (RCC->CTLR & (1<<25)) == 0 );//PLLREADY
    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08);
#endif

#if 0
    //384K 32bit MCK DISABLE HSE 24M
    u32 temp=0;
    //HSE
    temp=RCC->CTLR;
    temp|=RCC_HSEON;
    RCC->CTLR = temp;
    while(RCC->CTLR & RCC_HSERDY==0);

    temp=RCC->CFGR0;
    temp&=(u32)~0x3FF0;//AHB APB2 APB1
    temp|=(u32)0x3D0002;//PLL-16 HSESource PLLSource
    RCC->CFGR0=temp;
    RCC->CFGR2=0x10000|0x40|0x0600|0x04;//DIV2-5 PLL2-8 DIV1-5

    temp=RCC->CTLR;
    temp|=(1<<26);
    RCC->CTLR=temp;
    while( (RCC->CTLR & (1<<27)) == 0 );//PLL2READY

    temp=RCC->CTLR;
    temp |= (1 << 24);
    RCC->CTLR=temp;
    while( (RCC->CTLR & (1<<25)) == 0 );//PLLREADY
    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08);
#endif

次にmain.c内にGPIOの設定を行う関数MyGPIO_Init()を作成します。

void MyGPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure={0};
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET);
    GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);
    GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);
    GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_RESET);
}

このとき、同じくmain.c内にあるI2S_DMA_Init()関数にてI2S周りの設定が記述されていますが、今回はMCLKを出力しないため、該当する部分をコメントアウトします。

//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//    GPIO_Init(GPIOC, &GPIO_InitStructure);

最後にmain.c内にあるmain関数内の内容を次のように書き換えてプログラムの準備は終了です。ここでは不意にプログラムがコケたときのために、無限ループ内に1秒周期でLEDが光るようにしています。

int main(void)
{
    NVIC_InitTypeDef  NVIC_InitStructure = {0};
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();

    MyGPIO_Init();
    I2S_DMA_Init();

    USBHS_RCC_Init( );
    USBHS_Device_Init( ENABLE );

    NVIC_InitStructure.NVIC_IRQChannel = USBHS_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    SetVTFIRQ((u32)USBHS_IRQHandler,USBHS_IRQn,1,ENABLE);

    while(1)
    {
        Delay_Ms(500);
        GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);
        Delay_Ms(500);
        GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);
    }
}

感想

基板を起こしたことを除くとサンプルプログラムをほぼそのまま動かしたような形になりましたが、あっさりとハイレゾ対応のUSB DACが作れてしまいました。主要部品が秋月電子で揃えられるという手軽さのインパクトを強烈に感じますがいかがでしょうか。
サンプルプログラムでは32bit/384kHzにのみ対応しており、また不意に不調となる場合があるため、USBの勉強をしながら適切な割り込み処理や様々なレートに対応できるようにしたいです。

補足

44.1kHz系のレートに対応できるか検討したところ逓倍率の上手い設定が無いらしく厳しいみたいです。USB-HS使用時には外部からそこそこ精度の良いクロックを供給しなければならず、これと両立させようとすると本稿で示した48kHz系のみとなってしまうようです。I2S専用のクロック入力を受け付けるようなモデルの登場を期待したいです。

秋月お楽しみ袋2023 6月

はじめに

秋月電子秋葉原店の2階店舗の開店と共にお楽しみ袋の販売がされたため、また懲りずに買ってしまいました。平日であったためか、人は休日よりも少なめで選びやすかったです。今回のお楽しみ袋は特別仕様になっており、お楽しみ袋を買うとトートバッグと使いきれない量のチャック袋が付いてきました。

秋月電子の名が刻まれたトートバッグ。お楽しみ袋を購入すると手に入る。(単品での購入も可)

大物

大物枠として恒例のACアダプタが入っていました。ACアダプタ以外ではROHMのマトリクスLED表示器のようなものも入っており、創作意欲を掻き立てらてます。この表示器のようなものの仕様はネット上を簡単に検索しても出てこなかったため、飼い慣らすのに苦労しそうです。また、中にはドリルビットも入っており、売価が1000円なのでこれだけでほとんど元を取れている計算になります。

ACアダプタ等の大物たち

小物

小物類はいつものお楽しみ袋と同様の傾向なので写真のみでお送りします。

オーディオ用コンデンサなど
ブレーキ抵抗(?)やケーブルなど
10円はんだとサーミスタやケーブルが生えてるコンデンサなど
テープ入りの部品と見覚えのある部品たち
SMDのICたち。ロジックICが多め。
想像以上に大量に入っていたヒューズ
ロープロファイルピンソケット。筆者愛用なのでテンション爆上がり。
ロープロファイルピンヘッダ
振動モータ
大量に在庫しても微妙に困る値のフィルムコンデンサたち
積層セラミックコンデンサバリスタのようなもの
前出の写真に写りきらなかった積層セラミックコンデンサたち
マーキングから値が読み取れなかったクリスタル
圧着端子たち。地味に嬉しい。
ICソケットやコネクタたち
いつもの電解コン
LEDのようなものとケーブル類
仕分けしている途中で出てきた既出の部品たち
ディスク型のセラコンたち。仕分ける気力がここで尽きた。

感想

いつも通りのお楽しみ袋でした。秋月の名が入ったトートバッグが良いですね。

オペアンプの聴き比べ

概要

いい感じのオペアンプを複数用意したので、以前作成したUSB-DACのメインオペアンプを差し替えて聴き比べしてみました。
※筆者はオーディオのオの字も知らないような人間なので、冗談半分で本稿をご覧ください。

試聴条件

今回は以下のオペアンプの聴き比べを行いました。聴き比べ時にはオーディオテクニカのATH-R70xを使用しました。

  • NJM8901E(秋月DIP化変換基板使用)
  • MUSES8820D
  • MUSES8920D
  • OPA1655DR(秋月2回路化モジュール)

聴き比べ

NJM8901E

NJM8901E
安価なオーディオ用オペアンプです。今回はこのオペアンプを基準として比較します。低音があっさり目で聴きやすい音が出ますが、以降のオペアンプの音を聴いてしまうと少し物足りない感じがします。ピアノソロなどに合う感じがします。

MUSES8820D

MUSES8820D
バイポーラ入力でMUSES02Dの廉価版です。NJM8901Eと比べて低音がものすごく良いです。内臓まで響く低音が出ます。夕食後に聴き比べを行ったのですが、夕食が戻りそうになりました。ただ高音はもう一歩というところでしょうか。MUSES02Dを試したくなります。

MUSES8920D

MUSES8920D
1年ほど使用しているオペアンプです。恐らく私の耳はこの子の色に染まっています。NJM8901Eと比べて低音・高音共に良好な感じです。MUSES8820Dと比べて低音の量は出てる感じがしますが、内臓まで響く感じではなく、やや団子状(?)になっている感じがします。低音部に限ればMUSES8820Dの方が一枚、いや二枚上手に感じます。しかし、全体的なバランスではMUSES8920Dの方が良いように感じるため、使いやすいオペアンプという印象です。が、秋月でディスコン扱いになっているのが残念です。型番が変わって再登場するという話を見かけますが、どうなることやら。

OPA1655DR

OPA1655DR
今日秋月に行って買ってきたオペアンプです。f特は今回使用したものの中でずば抜けて良い一品です。音の傾向はMUSES8920Dの低音を改善したような感じで、中々好印象です。NJM8901Eから差し替えると音の変化に驚きます。ただ、低音はやはりMUSES8820Dの方が一枚上手のようで、こちらも内蔵まで響く低音までは出てこないみたいです。また、データシートのボード線図を見ての通りユニティゲイン周波数付近で位相が暴れており、音量を絞らないと時々発振してしまうじゃじゃ馬なので、扱いやすさではMUSES8920Dの方が良い感じです。この点に関しては、とりあえず10dBぐらい稼げば解決しそうなので後日改造します。

まとめ

本稿では4つのオペアンプを用いて聴き比べを行いました。MUSES02Dが欲しいです。

CH32マイコンの環境構築からHello worldまで

概要

中国製マイコンの一つであるCH32マイコンに入門してみました。CH32マイコンの最初の一歩として評価ボードを用いてシリアルでHello worldするまでのメモを残します。筆者の環境では特に躓く工程が無く、ファーストインプレッションとしては扱いやすいマイコンという感じです。

はじめに

様々な部品屋からSTM32マイコンを始めとした各種マイコンの在庫が消えたり値段が跳ね上がったりと、マイコンを扱うホビイストにとって厳しい状況が続いています。そんな状況下において安価でそこそこの性能を有する中国製マイコンに白羽の矢が立つのはある意味自然な流れではないでしょうか。
そんな中国製マイコンの一つにCH32シリーズがあります。このシリーズにはArmコアを積んだCH32FシリーズとRISC-Vコアを積んだCH32Vシリーズがあり、型番が瓜二つのSTM32マイコンと比べてクロック周波数が高いことや何しろ安価であることが魅力的なマイコンになっています。
そこで、今回はCH32Vシリーズの現状で一番強いCH32V307の評価ボードを入手して入門することにしました。CH32V307には何とUSB HS PHYが搭載しており、少しレベルの高い電子工作ができる気がしています。

評価ボードの入手と下準備

CH32V307の評価ボードには幾つか種類があり、今回は下の写真に示すような外部にWCH-Linkを取り付けるタイプを選びました。理由はNucleoライクな評価ボードと比べて安価であったことと、WCH-Linkが別個で入手できると自作基板に組み込んだ時に使い勝手が良いと考えたためです。

購入したCH32V307評価ボードセット (左: WCH-Link、右: 評価ボード本体)

Hello worldをする分には特にはんだ付け等の準備は不要ですが、オンボードLEDを用いてLチカする場合やUSBコネクタを利用する場合は簡単なはんだ付けが必要になります。これは、Nucleoボードと異なりオンボードLEDはマイコンの特定のピンに接続されていないためピンヘッダ等が必要になり、またUSB-CコネクタのCCピンのプルダウン抵抗がデフォルトで付いていないためです。回路図はgithubにて公開されています。

ピンヘッダを取り付けた後の評価ボード

評価ボードの裏面に5.1 kΩの1608Mチップ抵抗を取り付ける(R8, 9, 20, 22)

ピンヘッダとチップ抵抗を取り付けたら評価ボードの下準備は完了です。

環境構築

CH32マイコンにはMounRiver Studioと呼ばれるEclipseベースの開発環境が用意されています。特に会員登録等せずにインストールすることができます。STM32をSystem Workbench for STM32(SW4STM32)で開発したことがある方なら操作感が近いのですぐに慣れると思います。

テストプログラムの実行

MounRiver Studioを開き、File→New→MounRiver Projectを選択します。

プロジェクトの新規作成

するとマイコンを選ぶ画面が出てくるので、評価ボードに搭載されているCH32V307VCT6を選びます。また、プロジェクト名を適当な名前に設定します。ここではHello worldにしています。

使用するマイコンの型番を選択し、プロジェクト名を設定する

Finishを押すとプロジェクトが作成されます。作成したプロジェクトのUserフォルダにmain.cが配置されています。

プロジェクト作成後の画面 (main.cの内容を表示)

特にプログラムを改変せずにBuildします。Project→Build Projectを選択します。

Build

PCにWCH-Linkを、WCH-Linkに評価ボードをそれぞれ接続します。筆者の環境ではPCにWCH-Linkを接続する際にUSB3.0の端子に接続するとうまく認識しないことがあったため、USB2.0の端子に接続することをお勧めします。接続後に評価ボードの左下のUSBコネクタ付近にあるPWR LEDが点灯したら準備は完了です。Run→Runを選択すると評価ボード上のマイコンにプログラムが書き込まれます。

プログラムの実行

TeraTerm等のターミナルソフトでWCH-Linkのシリアルポートを開き、評価ボード右上にあるRESETボタンを押すと文字列が表示されます。ボーレートはmain.cの記述から察せる通り115200です。

ターミナルソフト上の表示

サンプルプログラムの動作確認ができたので、プログラムの簡単な改変に移ります。main.cのmain関数を以下のように書き換えます。

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);

    while(1)
    {
        Delay_Ms(1000);
        printf("Hello, world!\r\n");
    }
}

Delay_Ms関数で1秒間待ち、文字列Hello, world!を送りつけるプログラムになっています。先と同様の手順でBuildし、マイコンに書き込んで1秒毎にHello, world!が表示されたら成功です。

コンニチハ

まとめ

本稿ではCH32マイコンによりHello worldするまでの簡単な流れについて示しました。開発環境の構築は想像していたよりもずっと簡単で、STM32を触ったことがある人なら似た感触で開発できると思います。ただしライブラリなどの情報が少ないため、しばらくは手探り状態で開発することになりそうです。今後は簡単な処理はRP2040、少し込み入った処理はCH32、CH32でもキツい場合はSTM32のようなマイコンの使い分けをしようと考えています。

秋月お楽しみ袋2023

はじめに

今年も秋月電子通商(秋葉原店)の初売りで懲りずにお楽しみ袋を買ってしまいました。例により店前には袋を吟味している人がたくさん居ましたが、私はトラッキング電源の部品も購入したかったので吟味せずフィーリングで選びました。

お楽しみ袋の外観

大物

袋を見てまず目に入るのがこのソーラーモジュールでしょう。他の袋にも同様のモジュールが入っていた気がします。新品だと1枚900円するみたいです。

ソーラーモジュール
裏面には意味深な付箋が張り付けてありました。
ソーラーモジュールの裏面
ケーブル類やACアダプタも入っていました。2P-3PのACコードはアース端子が無いがちな自宅で重宝するので助かります(あまり良くないですが…)。ACアダプタも使えそうです。これだけで十分に元がとれてそうです。
ケーブル・ACアダプタ

小物

小物の方も見ていきます。まず袋入りの抵抗、謎のDCモータ、フォトリフレクタ、高周波アンプが出てきました。

抵抗・DCモータ・フォトリフレクタ・高周波アンプ
次に何かのキットの部品、ドットマトリクスLEDモジュール、FPGA×2が出てきました。ドットマトリクスLEDモジュールは以前秋月で売られていた記憶があり、取説が見つかりそうです。FPGAは256LUTと小規模ですがピン数が多いので遊べそうです。
何かのキットの部品・ドットマトリクスLEDモジュール・FPGA
チップLEDのようなもの、STMPRIMERで使う基板、RXマイコンボード、キャノンコネクタ、電池、クリスタルも入っていました。マイコンボードだけで2000円以上するのでお得感がすごいです。
チップLEDのようなもの・マイコンボード・他
テープ品は3種類ほど入っていました。ダイオードは1SV157でしょうか。今回のお楽しみ袋は高周波向けの部品が散見されるので、高周波回路にチャレンジしろというご神託かもしれません。
LED・電解コンデンサ・謎ダイオード
ソケット類です。PLCCソケットが入っているのは珍しいですね。
ソケット類
その他、バラで入っていたものです。写真②のチップ部品はMLCCやダイオード、SOT-23の何かでした。元気がある時にマーキングから気合で型番を特定したいです。
バラ入り部品①
バラ入り部品②

その他

何故かいつも入っているアナログチューナーや謎基板、謎プラスチックパーツなども入っていました。一体どこからアナログチューナーが湧いているのでしょうか。

その他の部品

感想

例年と比べて使えそうな部品が多く入っていました。今年は特に吟味せず選びましたが、恐らく当たりのお楽しみ袋でした。時間を見つけてこれらの部品で遊べればと思います。

USB-DACを作ってみた

概要

USB-DACを作ってみたので紹介します。筆者の住環境ではヘッドホンでの使用がメインになり、結果としてヘッドホンで使う分にはオーバースペックな物になりましたが、ちゃんと普段使いできる物に仕上がりました。
※筆者はオーディオのオの字も知らないような人間なので、用語や回路設計に関して間違っている箇所があるかもしれません。あらかじめご了承ください。

はじめに

今年に入ったあたりから『定本 トランジスタ回路の設計』などを読みながらアナログ回路(低周波回路)の勉強を少しずつ進めていました。一通り読み終えた後で何かを作ろうと思い、作例として幾つか取り上げられていたオーディオアンプの作成を決めました。当初は凝った回路ではなく、オペアンプにSEPPを接続しただけのシンプルな回路にする予定だったのですが、研究室に置いてあるトランジスタ技術のバックナンバーを隙を見つけては読み漁っている内にどんどん回路が肥大化していきました…

回路設計

今回作成したUSB-DACは主に電源回路とDA変換回路、そしてアンプ回路の3つから構成されています。それぞれ順に紹介します。

電源回路

今回は出力にクソデカカップリングコンデンサを用意するのが面倒だったので両電源で構成するDCアンプとしました。また、両電源は単電源のスイッチング電源に対してレールスプリッタ回路を用いて生成しました。
レールスプリッタは抵抗分圧で半々にした電圧をオペアンプ+SEPPで出力する方式としました。SEPPの各トランジスタにはざっくり電源電圧の半分の電圧が常に印加され、損失が気になるので2パラで構成しています。念には念をということで過電流保護回路も付けています。(Q2,3,6,7)また、出力に大きめの容量のコンデンサを付けていますが、これは正直不要であったかもしれません。このおかげで位相補償が若干複雑になっています。
スイッチング電源を使用する上でノイズの影響が気になるので、シリーズレギュレータ回路により安定化しています。シリーズレギュレータを組むにも様々な回路方式があると思いますが、今回は前述の『定本 トランジスタ回路の設計』にて紹介されているローノイズ電源回路を参考にしました。この回路を両電源で使用する場合、4558系のような出力が反転するオペアンプでは負電源の方で上手く動かないことがあり、これを避けるために適当なダイオードを入れてあげる必要があります。(回路図中のD9,10)
最後に、RCによる遅延回路により電源投入から遅れさせて出力リレーを駆動する回路も入れました。電源が24 Vなのでゲートが破壊されないよう、いい感じに分圧しました。ただ、この構成だと電源OFF時の保護ができないので改善する必要があります。

USB-DACの電源回路部

DA変換回路

DA変換部ではUSBからI2Sへの変換にアリエクで購入したCombo384を使用し、吐き出されるI2S信号をADuM1200を用いて絶縁し、PCM5102Aを用いてDA変換しています。念のため各電源入力部にはフィルタを入れていますが、フィルタの周波数特性的に有効に作用しているかどうかは不明です。
DACの電源は秋月で手に入る低雑音のシリーズレギュレータADP151AUJZ-3.3を使用しました。本稿で紹介しているUSB-DACの後にも一般的なシリーズレギュレータを用いて同様の構成で数台DACを作成しましたが、電源由来と思われるノイズが出力に混入してしまいます。どうやらADP151AUJZ-3.3がキーポイントになってそうです。

USB-DACのDA変換部

アンプ回路

アンプ回路はトランスリニアバイアスによる疑似A級アンプとしました。トランスリニア原理についてはトランジスタ技術2004年10月号、トランスリニアバイアスによるアンプはトランジスタ技術2019年5月号や2019年10月号に大変参考になる記事があり、実際にこれらの記事を参考にしながら作成しました。また、今月発売されたトランジスタ技術2023年1月号にもトランスリニア原理に関する記述があり、参考になると思います。
アンプ部の基板を左右で使いまわしたかったので、オペアンプの出力までをDA変換基板上に実装し、残りを別基板で実装しています。オペアンプによるNFBの配線が長くなり正直良くない設計なので、今後作る機会があれば改善したいところです。

USB-DACのアンプ部

組み立て

当初はいい感じの見た目のアルミケースを使用する予定でしたが、予算が厳しくなったので安価なアルミケースになりました。ケース下部にアンプ部以外の基板を、ケース上部にアンプ部の基板を配置しました。
I2S信号を引き回しているフラットケーブルが長いまま放置しているためか、サンプルレートを上げると正常に動作しなくなります。そのうち直そうと思いながらも特に困ることはなく、半年以上経って今に至ります。(このUSB-DACは4月に作成しています)

アンプ部以外の基板。Combo384絶縁基板(右上)、電源回路(右下)、DA変換回路(左下)
アンプ部については何も考えずに部品配置をしてしまったため、出力部分にあるアイソレータで使用しているインダクタの向きが抵抗にモロに影響しそうな配置になってしまいました。今後の改善点です。
アンプ部の基板

使用感

完成したUSB-DACの写真です。動作確認ではDA変換部のオペアンプにNJM4580DDを使用していましたが、本番用として気まぐれで用意していたMUSES8920Dに交換したら音質が良い意味で大幅に変化しました。本機を製作する前まではオペアンプで音質が変化することについて懐疑的だったので、この現象には正直ショックを受けました。前者のオペアンプがBJT入力であるのに対し後者のオペアンプはFET入力なので、オペアンプ直前にあるフィルタ回路の出力インピーダンスの影響を受けるのでしょうか。BJT入力のMUSES8820あたりとも交換して比較すれば良いかもしれません。

作成したUSB-DACの外観
動作中の写真。電源スイッチ(左上)には白LEDが付いており、動作中に点灯する。(写真では光の関係で消灯しているように見える)

まとめ

本稿ではUSB-DACの製作について説明しました。初めての製作だったので回路設計や基板設計にガバガバな部分が多々ありましたが、最終的には満足するものに仕上がりました。今後作る機会があるとすれば小型化やガバガバな部分の解消が主なポイントとなるでしょう。

小型PicoProbe基板を作った

2023年3月19日追記: 回路図にオリジナルのpicoprobeと相違があり、プログラムの修正が必要な回路となっています。詳細は回路設計の項で説明します。

概要

PicoProbeの小型基板を作成したので簡単に紹介します。

はじめに

RP2040を使った回路の入門をするために、小型のPicoProbeを作ることにしました。PicoProbeとはSTM32で言うところのST-Linkみたいなやつで、RP2040をSWDでいい感じにするやつです。

回路設計

RP2040周辺の回路は公式のハードウェアデザインを見ながら作りました。PicoProbeのピン配置などは公式のスタートアップガイドなどを参照しながら適宜設定しました。最終的に、回路図は以下のようになりました。フラッシュメモリ以外は秋月で手に入るはずです。

設計したPicoProbeの回路図

2023年3月19日追記: オリジナルのpicoprobeではGPIO4, 5のUART1を用いて通信するようになっていますが、本回路ではGPIO0, 1のUART0を使うものになっています。picoprobeのpicoprobe_config.h内にて定義されているPICOPROBE_UART_TX, PICOPROBE_UART_RXおよびPICOPROBE_UART_INTERFACEをそれぞれ0, 1, uart0に書き換えてからビルドする必要があります。本稿を参考にされる場合は気をつけてください。

組み立て

回路図を基にチャチャっと基板を設計して組み立てました。回路設計時にPicoProbe側RP2040の書き込み用に引き出したSWD関連の配線が基板設計時に邪魔になったので削除してあります。

完成基板(表面)

パスコンなどは全て裏面に配置しました。1608MサイズのMLCCではスペースが狭めなので1005Mサイズが良いと思います。

完成基板(裏面)

中華ST-Linkとの大きさの比較も行いました。電圧を固定化すれば中華ST-Linkよりも小さくできそうな感じでした。

中華ST-Linkとの比較

使用感

VSCode上で普通に使えました。USB以外で書き込めるようになると色々夢が広がって良いですね。

まとめ

本稿では小型PicoProbe基板について紹介しました。RP2040を使った初めての工作として取り組み易いので、これからRP2040に入門する方におすすめです。