2021/08/14(土)パーツの整理と部品調達の話

パーツケースを3つ整理

Twitterにも書きましたが、パーツを整理していました。

parts01.jpg
parts02.jpg

左はオーディオコネクタケースで、右が端子類と3端子レギュレーターケースなのですが、種類の違うものが混ざっててわかりにくかったので、左にはオーディオ類のみ、右にはレギュレーター+スイッチ類として入れ替え。

もう1つ端子類のみのケースも含めて3ケースの入れ替え作業をしていたら、3時間もかかってしまいました。

どうして人類は余計にパーツ類を買ってしまうのだろうか……。


この部品選別と破棄は定期的に行っていて、その結果が、定期的におとずれる記念ヒットプレゼントなのですが、次回分がすでに結構溜まって困っています(苦笑)

部品調達の話

当方で頒布しているキットとかの原価率ですが、もちろんキットにもよりますがそんなに高くはないです。部品の調達価格を下げるのは簡単で、DigikeyやMouserで買い物したことある人ならすぐ分かると思いますが、大量に買うことです

例えば、キットを50セット作るのにコンデンサが350個必要だったとしてDigikey等の価格を見ます。すると500個を超えると単価が安くなることがわかります。予備も含めてぴったりの数だけ調達というわけにはいきませんし、こういうときは「えいやっ!」と500個買います。

当然、キット製造後に150個あまります。

試作程度では150個も要りませんので、これが余剰在庫になります。部品の種類が増えれば増えるほどこの余剰品は増加します。そして余剰品は最終的に処分されることが多く、そうなると単なる「原価」以外に無駄な「費用」が発生していることになります。

物を製造して売るということは、なかなか難しいものです。

キット頒布中のリスト

「今何を頒布しているのか」自分でもよくわからなくなることがあるので、トップにリストで書くようにしました。そこにこっそり「op-dbuf3のスペシャル完成品」をリンクしたのですが、瞬殺されました。

最近はキットを作るという方は一昔前より減ってるらしいですね。aliexpressとか見れば完成品として様々なものが売られてますし、わからなくもない感はあります。

本題

長々と書いてきましたが、本題はこれ。

carbon_resistor.jpg

秋月のカーボン抵抗が1Ω~1MΩまで、ほぼE6系列で買ってあるのですが、今ではチップ抵抗がメインになり不要になってしまいました。

活用できる方(欲しい人)にセットで差し上げたいと思いますので、希望される方はサイドバーのアドレスにメールください。希望者がありましたので、募集終了しました。

PCM2704 DAC Ver2 - DC直結・出力オペアンプレス

はてブ数 2021/08/05

PCM2704 DAC(Ver1)キットを再販にあたり、大幅強化してみました。

PCM2704-v2.jpg

概要

委託しているPCM2704DACが2019年2月から在庫切れになっていて悩んでいました。

初期設計(Ver1.0)から10年以上が経過し、ハイレゾが普及しつつあるこの時代にPCM2704はチップの制限上48KHz/16bitまでしか再生できません。再販するにはある程度まとまった数を作る必要がありますが*1、不良在庫を抱えたくありません(苦笑)

しかしながら再販の要望も複数頂いており、どうにか応えたい。

それならばいっそのこと「音質に全振りしたVer2を作ってしまおう」というので作られたのがこのDACです。

*1 : 少数ずつ作っていると原価が全く見合わなくなります

回路図と部品表

pcm2704-v2.png

部品記号部品名使用部品型番備考
U1,U2低ノイズ3端子レギュレータ(3.3V)ADP150AUJZ-3.32Ver1.4はADP150専用
U3USB DAC 16bit/48kHzPCM27041PCM2704Cでも可(確認済)
U4DCDC反転チャージポンプMAX889RESA1LTC660から変更
Q1, Q2低ノイズPNPトランジスタBC859C, 21522SA1015とかでも可
X112MHz TCXO 2.5ppmFT3HNBPK12.0-T1112MHz-TCXOなら何でも
L1コイル 100uH/40mA-12012チップ使用
R1-R9チップ抵抗各種-11608チップ使用
R51-R54薄膜チップ抵抗 1KΩ-4高音質チップ抵抗
R55-R56薄膜チップ抵抗 5.1KΩ-2高音質チップ抵抗
C1-C8積層セラコン 0.1uF-12012チップ使用(X7R)
C9積層セラコン 10uF-12012チップ使用(X7R)
C10-C18フィルムコン 0.1uF-92012/ECPU使用
C21-C32高分子コンデンサ 6.3V 820uFA750 or PSF12470uF以上
C51-C54PPSフィルムコン 1000pFECH-U1H102JX54高音質フィルムコン
J1USB Bメス基板コネクタ1-
J24極ステレオミニジャック-1-

設計方針と改良点

Ver1.4の問題点

Ver1.4の回路はある種の完成系で、これを改良するとなると大きな決断をせざる得ません。大きな決断というのは、何かを犠牲にしてでも音質を一番良くするということです。

Ver1.4の出力LPFにはいくつかの欠点がありました。

pcm2704-Ver1.4-LPF.png

  1. 出力抵抗がないため、使用できるオペアンプが限られる。
  2. 電源電圧が±4V程度しかないため、使用できるオペアンプが限られる。
  3. ベッセルフィルタ構成が良くない。*2

他にもオペアンプ電源が安定化されていないとか色々あるのですが、とにかくすべての原因は半ば強引にオペアンプでLPFを動作させていることにあります。ここは設計当時の「価格(回路規模)を抑えて音質を狙う」ために妥協した部分です。

Ver2.0での改良点

抵抗とコンデンサだけのシンプルなパッシブLPFのほうが(ほとんどのケースで)音質は良くなります。これは当たり前のことなのですが、なぜオペアンプが必要だったのでしょうか。

それはPCM2704の出力に含まれる出力オフセット(+1.64V)をキャンセルするためです。オフセットがなくなれば、音質低下の最大要因である出力カップリングコンを排除できます。このために多くのことが犠牲になっていました。

これをどうにか解決できないかと検討と試行錯誤を繰り返し、オペアンプを使わずに出力オフセットをキャンセルする方法を思いつきました。

pcm2704-v2-LPF.png

オフセット分をマイナス電圧で引き下げる作戦です。オフセットを+1.64V、マイナス電源を-4.2Vとすると、R56は次のように求められます。

{\rm R56} = \frac{{\rm R52}+{\rm R54}}{1.64} \times 4.2 = \frac{4.2(1+1)}{1.64} \fallingdotseq 5.12{\rm K\Omega}

この5.1KΩは音質に関わるので(RT0603等を持っていないと)簡単には変更できません。よって、出力オフセットはR3の値で調整するのですが(50Ω増やすと出力電圧が+20mVぐらい変化する)、左右同時にしか調整できません。

とはいえ、USB電源電圧が5.00~5.05V付近ならば、コンデンサのエージング後にオフセットは20mV程度に収まるかと思います。

Ver2の特徴

Ver2の欠点

音質は最大限進化させてものの、これはこれで欠点があります。

  • 出力電圧レベルが小さく、約1.3Vppしか出せない。

これが音質のために犠牲になった部分です。PCM2704は出力電圧範囲が元々小さめなところに、パッシブLPF&オフセットキャンセルの回路を詰め込んだことが原因です。これは諦めるしかありません。

1Vppあれば最低限問題は起こらないと思いますが、そういうものだとご理解ください。

音質比較

手持ちのDACと比べてみました。

セルフ魔改造PCM2702 DACとの比較

常用している魔改造PCM2702ですが、今回のPCM2704-v2の圧勝という悲しい結末になりました……。

慌ててPCM2702を再改造するものの、再改造してもこのPCM2704-v2のほうが良いようです。*3

msBerryDACとの比較

去年まで頒布していたラズパイ用 384kHz/32bit DACです。PCM2704-v2の勝ちでした……。

「それはさすがにまずい」ので、msBerryDACを改造して C1/C2 を 10nF→1nF に変更しました。

C1/C2改造msBereyDAC > PCM2704-v2 > ノーマルmsBerryDAC

というわけで、DACはチップの性能もさることながら回路設計が重要というのがよく分かる結果になりました。

*3 : 完全に余談ですが、PCM2702は出力インピーダンスが高いため、出力オペアンプレスは少々難しくなってます。そのため出力オペアンプLPFを簡単には除去できませんでした。

まとめ

  • PCM2704 DACの出力電圧範囲を妥協して、音質を進化させた。
  • 使用している部品も進化させた。

キットの購入は委託先から。このDACは再販しない可能性があります。

2021/07/26(月)D級ヘッドホンアンプと出力フィルタと負帰還

Twitterにも書きましたが、D級ヘッドホンアンプ Ver2 / pwm-hpa2をいじっていました。

出力フィルタの意味と役割

pwm-hpa2_1ch.png

D級である限り、出力フィルタは避けて通れないものです。この出力フィルタ(L5/C5)は、高周波のスイッチノイズを除去するために入れていますが、再生音を良くするためというよりは、余計なノイズ(電波)を巻き散らかさないためという意味合いが大きくあります。

第2世代と呼ばれるD級アンプは、原理的に「LCフィルタを入れなくても十分に放射ノイズ(EMI)が少ない」ことが利点として挙げられています。TPA3110D2なんかもそれです。

ノイズの問題を一旦おいておけば、L5があったほうが良いか、無いほうがよいかは難しい問題ですが、うまく動作させられるならばL5は無いほうが良さそうです。実際、TPA3110D2アンプの音が良いのは、そういう点も影響しています。

出力フィルタの影響をなくしたい!

フィルタを無くすというわけにはいかないものの、フィルタの後ろからフィードバック(負帰還)をかけて出力フィルタの影響を少なくするということは可能です。*1

D級アンプICですと、フィルタ前のフィードバックをやめることはできませんが(ミックスした負帰還になる)、自作回路ならL5の後ろからのみフィードバックすることは可能ですので、試してみました。

まず通常動作時です。(1)がL5の手前で、(2)がL5の後の波形になります。32MHzでスイッチしており、出力ではこのスイッチノイズが減っています。

pwm-hpa2_lpf1.png

次にL5の後ろからフィードバックをかけた波形です。

pwm-hpa2_lpf2.png

発振周波数が下がり、出力に±5Vのsin波が出ていますが(おそらく共振と思われる)、音質はこのほうが良い感じでした。

まとめ

AB級アンプで同じことをすると発振します。(自励式)D級アンプは元々発振させるものですので、どうせ発振させるのならフィルタの後ろから負帰還かけても良いんじゃない? という実験でした。

このまま使うのは躊躇しますが、もうひと工夫すれば pwm-hpa2 を更に進化させる可能性もありそうです。

2021/06/18(金)壊れたホットプレートと近況

Twitterすらろくに書いていないことに気づいて、たまにはブログも更新しておこうという。

壊れたホットプレート

GP6000/GP9000の鍋型ホットプレート。

GP6000_1.jpg
GP6000_2.jpg

どこが壊れたかというと、温度調整用のサーモスタットが壊れて、常にオフになりました。

GP6000_3.jpg

しかもバイメタルが壊れたというよりは、バイメタルに使われている金属接点とバイメタルの接合部が壊れた(抵抗値が大きい)ようです。「はんだ付けして直してやる」と意気込んだものの、すぐに慌てて吸い取ったりしました。*1

修理部品のサーモスタットだけ売ってくれないか問い合わせてみたけど、当然無理でした……。

ここで思いついた

ホットプレートを改造して、リフロー装置にするのはみなさんおなじみですが、ホットプレートを改造すればホットプレートを修理できるんじゃないか?と(笑)

大容量リレースイッチとか、PTCサーミスタとか、5V電源はUSB 5V1A電源使えばリレーの駆動も楽だなとか、マイコンは慣れてるMSP430でいいかなとか、かなり真面目に検討したのですが……結局面倒くさくてやめました(苦笑)

というより、ホットプレートとして使用する場合は、使い勝手を考えると筐体内に収める必要があって、それをするのは結構な労力と気づいて買い直しました。

そして

壊れたホットプレートが余りました。電熱線は生きてて、サーモスタットをショートさせてあげれば使用できます。一度その方法で使用しましたが、電源の抜き差しが大変でした……。

つまりリフロー炉にはできそうというわけで、もし欲しい人いたらあげます。処分しました。

*1 : 熱源に使用する装置にはんだ付けは厳禁

近況

キットの品切れが長いこと続いてるので、いい加減再販しようかなと思い、どうせ再販するならと「PCM2704 DAC」を魔改造したり、TPA1517をオフセットで選別したりしてました。

pcm2704v2-test.jpg
tpa1517_check.jpg

詳細は後日記事にしますが、もう限界かと思っていたPCM2704 DACの音、更に良くなります。

あとATH-AD2000のプラグがめちゃくちゃ劣化してたので、交換しました。どうせなら4極に。

AD2000_plug-01.jpg
AD2000_plug-02.jpg

HPAキットとかずっと以前からGND分離4極を採用していますが(HPAmsBerryDACも)、実は4極端子のヘッドホンを持ってなかったので初めて試せました。

「音の分離がめっちゃくちゃ良い!」

……当たり前の感想でした(苦笑)*2

なんかヘッドホンのBTLが流行りみたいですね。BTLの一番のメリットって電源効率なのでGND分離で十分じゃないかと思うんですが*3、使ってる方の感想を聞いてみたい気もする。

マイコン触り

そういえば最近ESP32とかも触っているのですが扱いやすいですね。C++でマイコンファームが書けるとか何事ですか、という感じがする。ラズパイPicoといい、1000円以下でこのクラスのマイコンがごろごろ売られているのですから、すごい世の中になったものです。

Z80アセンブラを書いては紫外線で数分かけてEPROMを消していた時代が懐かしい。*4

*2 : 3極の共通GNDですと、ヘッドホンのインピーダンスにもよりますが、左右分離は80dBぐらいが限界(物によって60dBぐらい)ですので……。

*3 : 4回路分作るなら、2回路分作ってコスト倍にしたほうが結果よくなりそうというのもあり。

*4 : 今にして思えば当時すでにEEPROM搭載のPICが登場していたのになぜ誰も使わなかったのか。

RTSP(H264/H265) to MP4の超低遅延ブラウザ再生(配信)

はてブ数 2021/02/22プログラム::TCP/IP

カメラ等で使われるRTSPストリームはブラウザとすこぶる相性が悪く、以前はFlashを使って親戚のRTMPが再生されたりしていましたが、もはや過去のお話。

最近は、分割した MPEG4 ファイルを連続再生する HLS や MPEG-DASH が主流です。しかし、すべてを数秒に分割する仕組みのため通信効率が悪くなってしまいますし、どうやっても遅延の問題が避けられません。

かと言って WebRTC はP2P用に設計されていて、ブラウザ間ビデオチャットには向いていますが、配信等の目的に使うことは難しく、そもそもUDPが使えない環境では動作もしません。

そこで超低遅延(1秒未満)のストリーミング再生(配信)システムを構築しました。

更新履歴

  • 2022/09/05 WebCodecs正式版に対応。
  • 2021/04/29 H.265/HEVCに対応。
  • 2021/04/21 エラー内容をHTML上で表示するよう変更。
  • 2021/02/22 初版。

デモ

デモを設置しています

rtsp:// で始まるURLを入力すると、RTSPをリアルタイムで変換を確認できます。残念ながら適当なフリーのRTSPソースがないため、各自ご用意ください(192.168.x.xxのアドレスで試す人が多いようですが、当然接続できません。グローバルIPを持ったRTSPサーバを指定してお試しください)。

  • Chrome および Firefox が推奨です。
  • 対応しているのは「H.264/avc1」か「H.265/hvc1(HEVC)」ストリームのみです。
  • デモはセキュリティのため以下の制限を加えています。
    • RTSPパスワード認証は使用不可に設定しています。
    • RTSP接続ポートは 554 のみに制限されています。
    • 再生時間は60秒に制限されています。
  • 「WebSocket Server Down」と言われた場合は、変換サーバの起動忘れなので、コメント or ご連絡ください。
  • デモですので、常識の範囲内でご利用ください*1

*1 : 外部から利用する等はやめてください。ログは取っていますので発見次第対処します。

仕組み

rtsp_to_mp4.png

RTSPサーバに接続して、リアルタイムでmp4に変換しています。コンテナ(フォーマット)を変換していますが再圧縮しているわけではないので高速に動作します。ffmpegを使っても同様のことが可能ですが、ffmpegでは変換過程で数秒程度の遅延が発生します。

ffmpeg -rtsp_transport tcp -i rtsp://<ip_address>/path -c:v copy -an -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof -f mp4 pipe:1

mp4に変換されたデータを WebSocket 経由でブラウザに送信し、受け取ったデータを JavaScript で MediaSource に入力し、VIDEOタグで表示しています。

let sourceBuffer;
const ms  = new MediaSource();
ms.addEventListener('sourceopen', function(evt){
	sourceBuffer= ms.addSourceBuffer('video/mp4; codecs=avc1.64001E');
});

const VIDEO = document.getElementById('video');
VIDEO.src   = window.URL.createObjectURL(ms);

const ws = new WebSocket('ws://example.com/');
ws.binaryType = "arraybuffer";

ws.onmessage = function(evt) {
	sourceBuffer.appendBuffer( evt.data );
}

実際はもう少し複雑ですが、フロントエンド(JavaScript)では難しいことはしていません。デモページ内のソースに、スクリプトが全部書かれていますので、興味のある方はご覧ください。

変換サーバは?

今のところ非公開です。興味のある方はメール等でご連絡ください。ライセンス等する予定です。

まとめ

  • 映像が目的だったため、今のところオーディオには非対応です。
  • H264の圧縮も伸張もしていないので、H264がらみの特許問題は起きないはずです。
  • Windows Media ServerやReal Serverがそうだったように、将来的にはRTSPが廃れるか、ブラウザがRTSPやRTSPライクな何かをサポートして状況は変化するように思います。

参考文献

  • html5_rtsp_player
    • WebSocket経由でRTSPサーバにアクセスし、JavaScript側でRTSP通信をしながらmp4を再構成しています。原理的には似ていますが、サーバ/クライアントでの処理分担が異なります。サーバはNode.jsで書かれていますが、30行程度のスクリプトでサーバを自作することも可能でした。
  • v4l2rtspserver
    • V4L2を使用した、RTSPサーバ。H264で出力をするためには、カメラがH264エンコーダーを内蔵しているか、V4L2対応のH264ハードウェアエンコーダーが必要。
  • fmp4streamer
    • V4L2(H264)なソースから、ブラウザで再生可能なH264ストリームを生成するソフト。やってることは一緒。ただ作り込みが甘いのか、試した限りだとリアルタイム性がいまいち。多少書き換えれば改善するかもしれもい。

メモ

Video4Linuxとffmpegを使用して、カメラからリアルタイムH265を吐き出す方法。

ffmpeg -f video4linux2 -i /dev/video0 -s 640x360 -c libx265 -pix_fmt yuv420p -fflags nobuffer -tune zerolatency -f rawvideo

これをそのままWebSocketで送信できれば、上記デモと全く同じ仕組みで、ブラウザ上にリアルタイムカメラ画像を取得可能。