インテグレーションを考える!の巻き(後編) 2020.5.14

(前編はこちら)

INTEGRATION UNITも完成(と思う)なので、それぞれの基板を組み合わせて行きましょう。

構成は

 SRC4137 → DIV5142-2WAY → DAC4499(4chモード) → DAC4499-IV(OPA)

としています。この中で、PICを搭載しているものはすべてフルファンクションモードのSLAVE MODEにして
INTEGRATION UNITに接続しています。信号の流れる順番に接続しています。
すなわち

   [UNIT1] SRC4137
   [UNIT2] DIV5142-2WAY
   [UNIT3] DAC4499

としています。
 基板間の接続はすべてリボンケーブルをつかえば楽ですが、適当な長さのものがなかった(長いものばかり)ので、
ラッピングワイヤで接続しました。それほど本数は少ないので配線にはさほど時間はかかりません。それに、DAC4499のCH2側
についてはDATA線だけの配線でいいので1本です(LRCK、BCK,MCKはCH1から供給されるため)。

 
 DIV5142からDAC4499の接続はラッピングワイヤーで済ませました。
 

組みあがりました


前からの全景です。


後ろからの全景です。


基板の配置はこんな感じです。

表示も問題なく、得られることが確認できました。


SRC4137選択時の画面になります。


DIV5142-2WAY選択時の画面です。


DAC4499選択時の画面です。

やっぱり
FRONT PAGEなら表示内容に特徴があるので、どの基板とつながっているかがわかりますが、
それ以外だと結構似たりよったの表示なので、覚えていないとどの基板かわからなくなります。
やっぱり2桁LEDをとりつけて、どの基板かわかるようにしました。

液晶の上に2桁LEDを配置しました。”2”なのでDIV5142-2WAYが接続されています。

いろいろと改良点も

接続する基板を切り替えるときにLCDに一旦は接続するUNITの番号が表示されますが、
結構短くて見逃してしまう場合があります。注意していればいいのですが・・・・・。
かといって、この表示時間を長くすると切替に時間を要することになるので、かなり相反するテーマです。
ということで、個人の好みに合うように表示時間を設定できるようなメニューを追加したほうが良さそうです。

メニュー画面の追加と改造 2020.5.16

接続ユニットを変更した場合の、ユニット番号の表示時間が短いので、表示時間を調整できるように
メニューを追加です。100ms〜5sの間で変更できるようにしました。100msだったらゼロとほぼ同じですが・・・。

切替時のユニット番号の表示時間を調整できるようにしました。

ついでに
 赤外線リモコンを押したときの、スイッチのON時間も範囲を広げて、かつ連続的に変更できるように
しました。これが何の役にたつかはわかりませんが・・・・、多分つかうことはないような気もします。

赤外線リモコンのON時間も調整できるようにしました。


接続先ユニットの整理 2020.5.17

さて、ここからはINTEGRATION UNITに接続可能な基板とその制御CPUについて整理していきましょう。

現時点での対応基板は下記に整理しています。

対応基板(2020.5.17時点)

対応基板 制御用PIC 追加事項
SRC4137 SRC4137 Slave v1 ソフトでの初期化メニュー追加
DAC4499 DAC4499 Slave v1
DIV5142(4WAY) DIV5142 Slave v1
DIV5142(2WAY,1WAY) DIV5142-2W Slave v1 1WAYで使用できるように20〜20000Hzを越える場合は
THRモードを追加
SRC4137(DAIのみ) SRC4137DAI SLAVE v1 ソフトでの初期化メニュー追加

製作資料(接続先ユニット:Slave):SlaveUnitsManual.pdf
製作資料(Integration Unit) ; IntegrationUnitManual.pdf

接続先として往年のDAC9018S、DAC9018Dも改造済みなのですが、表示がSC1602(16×2文字)なので少し寂しいため、
表示の拡充と、コンソールで調整できる電子ボリューム機能の追加を検討中です。
 あと、手元にあるDAC基板は軒並み対応させていこうかと思案中です。

まずは対応基板は5種類ですがリリース準備中。

リリースしました。


DAC4795-1.5とは接続できるか? 2020.5.22

Integration Unitの特徴としては、もともとLCDやスイッチを搭載していない基板であったとしてもPICが乗っていて、
端子が外に1本でもでていれば、ソフトさえ書けば接続できる点にもあります。例えばDAC4497-2なんかは
シンプルファンクションモードでのみの動作になり、各種の設定はジャンパーポストで行います。まあ、ジャンパーポスト
は一回設定すれば、多くは弄ることはないのですが、フィルターの設定などは稼動中でも色々と変えたい場合がでてきます。
こういうときにIntegration Unitと接続できるようになれば、簡単に設定できるので便利かもしれません。

ということで、まず題材としてDAC1794-1.5を用意しました。

なぜDAC1795-1.5か?
これは、単に基板の箱を物色していて目についたからです(笑。
というか、DAC1795-1.5に搭載されているPICは18Pinの小容量なものなので、これに搭載できるかどうかの
確認もありました。
 PICを使い出した頃の18PinのPICはPIC16F819(2kW)でしたが、最近では容量が大きくて高速な
PIC16F1827(4kW)を主に使っています。それでも28PinのPICで主につかうPIC16F1938(16kW)、PIC18F26K20(32kW)に
比べると容量は1/4あるいは1/8です。32kWのPICでさえ容量がギリギリになる場合もあるのに、PIC16F1827で足りるか?
という感じもありますが、これでも動くようだと他にも色々なところに使えそうです。
 本当は18PinのPICで容量の大きなもの、すくなくとも8kW程度のものがあれば十分なのですが、残念ながらないんですよね〜。

ということでPIC16F1827でチャレンジです。

まずは、元基板jは動くかな?
 久しぶりの電源投入なので、動くかどうかの確認をしておきましょう。

元基板が動くかどうかを確認です。


動きました。よかった〜。

すこし基板を改造
 DAC1795-1.5の各種パラメータの設定端子の入力は集合抵抗をつかってプルアップが行われています。
今から思えば、なぜこの抵抗をを入れたかがわかりません。というのも、PICには内部でプルアップできる端子があるので、
それを使えば、プルアップ用の抵抗は必要ありません。DAC1795-1.5も、内部プルアップが可能な端子を使っているので、
わざわざ外付けする必要はなかったのですが・・・・。おそらく、まだPICを使い込んでいなかったから知らなかったのでしょうね。

で、このプルアップ抵抗を外す作業が必要です。おそらくあっても問題ないはずですが、念のための処理です。
で、なぜプルアップ抵抗を外すかですが、このプルアップ抵抗はDAC1795-1.5の5Vラインにつながっています。
一方、Integration Unitのプルアップ抵抗は3.3Vラインにつながっています。となると、Integration UnitにDAC1795-1.5の
5Vラインからプルアップ抵抗を伝って5Vの電位が、3.3Vで動作するPICに作用することになりかねません。
まあ、10〜50kΩの抵抗を伝って5Vが加わっても壊れるとは思いませんが、すこし気持ち悪いのでプルアップ抵抗を
取りはず事にしました。プルアップはIntegration Unitのみで十分です。

 
まずはDAC1795-1.5に取り付いている集合抵抗をとりはずします。裏面から暖めると簡単に取れました。

プログラム作成!

 さて、プログラムをカキカキです。もとのプログラムを流用してというより、ほぼ一からつくるような感じです。
そして、ちょっと気を抜いて冗長なコードを書こうものならすぐにメモリーオーバをしてしまいます。
すこし書いてはコンパイルして容量を確かめて、また書いて確かめて・・・の繰り返しです。結構ストレス溜まるな〜。

で、ようやく完成しました。なんとかROM容量は99%に納まりました。というか無理やり納めました。
またRAMも最大で48%の消費です。もともと384byteしかありませんが、LCDのイメージだけでも80Byte使いますし、
通信に関連する部分で結構な数の変数が必要になるので、あまり余裕はない感じです。

しかし、プログラム容量に気を使いながらの作成は結構疲れます。ふう〜。・


なんとか納まりました。というか、無理やり納めました。

動作確認!

途中、何度も動作確認しながらプログラムを作成しているので問題はないはずですが、最終確認です。

1)シンプルファンクションモート
 なにも設定をしなければ、従来モードと同じように動きます。1点変更したのは、エンファシス機能を削除しました。
いまのソースでエンファシスが入ったものなどないですから、なくてもいいでしょう。というか、このエンファシスが必要な
ソースにはお目にかかったことがありません。どうやらCS放送にはあったようですが、詳しくは知りません。


まずはシンプルファンクションモードでの動作確認です。

2)フルファンクションモード
 こんどはフルファンクションモードです。そのためにIntegration Unitを準備する必要があるのですが、先日作ったものはすでにDIV5142-2WとDAC4499と
一緒に組み込んでいるので、あたらに準備する必要があります。そのため、最近つくったPIC用のお勉強基板に仮にインストールすることにしました。
この基板はPICの機能を確認するためのものですが、いちいちブレッドボードに組み込むのも面倒なので、必要になりそうなI/Oを予め搭載したものです。
以前に1台作りましたが、液晶が小さいこともあり、先日20×4文字が表示できるLCDのものを新しく作りました。

PICのお勉強用の基板です。PIC_BENCHと呼んでいます。左が初号機、右が新作です。大きめの液晶をのせています。

DAC1795-1.5をフルファンクションモードで動かす、すなわちIntegration Unitとの接続設定は予約端子であったP6を使います。
そしてP5をGND接続(P2のGNDに接続)して、起動すればIntegration Unitとの接続モードになります。


P5をGNDに接続すればフルファンクションモードです。通信はP6を使います。



Integration Unit(右下)との接続の状態です。

表示は簡素です

表示は1画面のみの簡素なものです。というか、1画面しかメモリーの都合から組めませんでした。というのも、表示する文字が
ものすごくROMを消費します。なんせ、1画面全部の文字(80文字)でROMを2%もつかうわけですから、無駄遣いはできません。
できるだけ簡単に1画面に集約しました。
変更パラメータは
 @入力(SPDIF1,SPDIF2)
 Aアッテネータ(MUTE〜-0.0dB)
 Bアッテネータ方法(VRあるいはSW)
 Cフィルター切替(SHARP,SLOW)

です。新しい機能としては、スイッチでアッテネータを調整できるようにしました。また入力周波数を表示するようにしました。


DAC1795-1.5のフルファンクションモードでの表示画面です。

気になった通信ラインの電圧も最大で3.3Vですから3.3Vで動作するPICも問題なしです。


通信ラインの信号です。

DAC1795-1.5 v2に変更

これで完成です。PICのバージョンがほぼ10年ぶりにver2にあがりました。

PICもversionがv2になりました。


次は、DAC4497-2かな?


DAC4497-2です。これもIntegration Unitに接続できるようにしましょう。


いや!DAC179X-2.1をつないでみよう。 2020.5.25

DAC1795-1.5の改造が終わったので、その流れもあるのでDAC1795-2.1にとりかかりましょう。
こちらはDUAL MONO構成なのと、入力にDSDとPCMもあるのでその切替を考えると、プログラム容量は
さらにきついことが予想されます。
 案の状、すぐにオーバしてしまい、全体の見直しを何度も余儀なくされてしまいました。
DAC1795-1.5のときはPICを書き換えるたびに、ICソケットからはずしてライターで書き込んでいましたが、
まあ、それほど回数も多くなかったのでそれでもよかったのですが、DAC1795-2.1では、相当に頻繁に
書き直しが必要になりそうだったので、ICSPが使えるようにPICにライター用の端子をつけました。

PICにICSPができるように端子を取り付けました。
これで作業効率があがります。


 今回はプログラム容量以外にもI2C通信のところで躓きました。というのも、動作クロックを8MHzから32MHzに
上げたのですが、CS8416のI2C速度が100kHzしかないことに気づかず、うまく通信ができません。もちろん、
クロック的には100kHz以下になるように定数設定していたのですが、クロック以外のタイミングで若干仕様オーバ
するとろろがありました。以前は8MHzで動かしていたので、特段問題にはならなかったのですが今回は32MHzに
増速させたので、エラーが発生したようです。
 さらに、I2C通信がでれば「I2C ERROR:」が表示されるはずだったのですが、元のプログラムがI2Cエラーが発生
したらCPUをリセットする仕様になっていたのに、またこれに気づかず。おかしな挙動するな〜と頭をひねって、色々
とチェックする羽目に・・・です。
 まあ、原因がわかれば対処も早いです。
 でも、やっぱり苦労するのはプログラムがギリギリなので、ちょっとデバッグのコードを入れようとしたら、
とたんにメモリーオーバになってしまうことです。

ようやく完成!
 なんやかんや苦労しましたが、完成しました。
 

DAC1795-2.1とも接続できました。

動作をまとめておくと下記になります。
従来モードでの起動:JP3 オープン
  PCMでのフォーマット選択は不可。I2Sに固定。
  JP5でフィルター切替。

Integration Unit接続:JP3 ショート
  接続端子:P9(DSD選択端子)

追加機能は電子ボリュームでのSW操作ですね。

画面はこんな感じです。


ちょっと脇道・・・小型のIntegration Unitを作ってみよう。 2020.5.26

Integration Unitを作っていて、装置のパネルとして組み込むことを前提にした場合は、視認性を考えて液晶が大きいほうが
いいのですが、小さいケースに入れたい場合には20×4文字の液晶では大きすぎる場合があります。
もっと小型にできれば、小さいケースに入れることもできるし、簡単に机上で調整するのにも場所をとりません。
ということで、小型のグラフィック液晶(OLED)を使ってみることを考えることに。
 簡単な方法は現状のプログラムを用いて、表示部分のみをOLED対応に変更すれば簡単ですが、折角小型にするなら
小さい18PinのPICに載せてみることにチャレンジです。また、完全に手段が目的と化しています(笑。

懸念はOLEDでの描画速度
 OLEDはいつも使っているキャラクターLCDとは異なって、インターフェイスがI2Cになっています。結線が少なくて済みますが、
反面通信に時間がかかります。まずはOLEDが使えるかどうかの最大のポイントは、文字を描画する速度がプログラムサイクル
の中で納まるかです。具体的には、Integration Unitのループサイクルは1msであり、そのうち接続UNIT(基板)との通信に360us
が費やされます。残り640usの間に文字が書き込めるかです。そこで、簡単なプログラムを書いて1文字の描画時間を測定したところ
約500usでした。ということは、すくなくとも1ループサイクルで1文字はかけそうです。
 もともとのプログラムでは1ループサイクルで接続UNITから2文字分のデータを読み取り、キャラクターLCDに2文字を書き込む
ことにしています。接続UNITから2文字分のデータを読み取りは仕様として変更することができないので、OLEDへの書き込みは1ループサイクル
では1文字とします。そのため、書き残しが発生してしまいますので、PICの中に文字バッファーを持たせて、2ループサイクルで2文字分
を書くことにします。そのため、画面全体のリフレッシュレートは半分になってしまいますが、12.5Hz程度なので問題ないでしょう。

まずは動作確認テスト
 上記の数値はあくまで理想的な状態なので、実際に文字の読み書きが間に合うかをブレッドボードに簡単に組み込んでテストです。
結果は、予備時間を120us確保した状態で、1ループを回すことができました。すなわち、1文字の描画速度は色々な処理を含めても
1000-360-120=520usということになりました。
 

まずは動作さの確認をブレッドボードで行いました。

 基本的な動作は確認できたので、ソフトを仕上げます。といっても、PICの容量が小さいので必要最小限の機能だけを組み込みです。
それでも接続できる基板UNITは4つとしました。あと、スイッチの配列のソフト変更も2パターンだけ入れています。
なお基板UNITからのタイムアウトは100msで固定です。機能はこれだけです。UNITの切替はSW5で順繰りに行います。

小型のユニバーサル基板に組みましょう!
 まずは動作時間に問題がなさそうなので、小型のユニバーサルに組んでみましょう。最初に回路図を描いておきます。
回路図といっても、簡単なものです。必要な抵抗はプルアップ抵抗のみです。ダンピング抵抗(51Ω)は要らないと思うのですが、
念のため入れておきました。あわせて、基板のレイアウトも清書です。備忘録代わりです。


このような回路と部品配置で製作しました。

ハードウエアの出来上がり!

部品点数はさほど多くありませんし、抵抗もすべてチップ抵抗を用いたので小さい基板に納めることができました。


部品面の様子です。


半田面の様子です。

動かしてみよう!
 試しに、DAC9018SとDAC179X-2.1を2台接続してテストです。
消費電流はPICとOLEDをあわせても15mA程度なので、DAC9018Sから3.3V電源を供給します。ちょうど光受信モジュールのところに
3.3Vの出力があるので、そこから取り出します。

2つの基板を接続してテストです。


こんな感じで表示されます。

表示は小さいですが、十分に視認できますのでちょっとした組込みに便利そうです。

使用部品:PIC16F1827
液晶OLED::秋月の0.96インチ 128×64ドット有機ELディスプレイ(OLED) [P−12031]
タクトスイッチ:5個
抵抗 : 51Ω×4個(なくても可)、1〜2kΩ×6個
コンデンサ:10uF×1、0.1uF×1
PICのバイナリーはここに(2020.5.26版)


PiDAC9218を接続できるようにする!20205.27

小型のIntegration Unitを作った主な目的は、PiDAC9218の制御用に考えています。
小型の基板に大きなIntegration Unitでは不釣合いなので、できるだけコンパクトに!です。

PiDAC9218Pに使っているES9218Pは設定できるパラメータが数多くあります。それらを変えたときの音の変化を楽しむのも
オーディオの楽しみです。しかしながら、PiDAC9218Pには変更できるパラメータはフィルターのみです。他はデフォルトあるいは
もっとも出力の大きくなるように設定しています。というのも、設定のためのジャンパー端子が限られているためです。
本来は、RaspPiのI2Cにつなげて制御できるようにすればいいのでしょうが、常にVOLUMIOが立ち上がっている状態で、
さらにWIFIでの操作環境でどうやったら設定が変えられるかがわかりません。ということもあり、おもむろに外部から定数を
変更できる基板を設けたかったわけです。

プログラムは難航・・・・・
 変更できるようにしたいES9218のパラメータをピックアップすると、約10個ほどありました。それらにすべて対応できるように
するには、プログラム的には問題ないのですが、いざ小容量のPICに押し込むのがかなり難航です。
1個追加したらプログラム容量がオーバしてしまい、全体を見直してプログラムコードの短縮を図り、また1個追加したら
またオーバして・・・・の繰り返しです。でも、最終的にはすべて押し込むことができました。また、プログラムにしても、
自画自賛ではないですが、相当に冗長性の少ない引き締まったものになっていると思います。作成者とは正反対ですが(笑。
でも、今回色々と工夫したプログラムやコードの考え方は今後色々と生かせそうです。


今回作ったIntegration Unit MINI と PiPA9218とはほぼ同じサイズです。


完成!
 プログラムが完成したので、動かしてみましょう。PiDAC9218との接続はAUX端子を使います。
ここからは3.3Vの出力がでているので、そこから電源供給もできます。電流もたいしたことありませんから、
搭載したレギュレータのADM7154でも大丈夫です。


Integration Unit MINIと接続しました。


接続はPiDAC9218のAUX端子を使います。

プログラムの概要を整理しておきましょう

設定できるパラメータは10個あります。

・MAIN VOL
 DAC部のボリューム −0.0〜−127.5dB 0.5dBステップ

・ANALOG VOL
 アナログ部のボリューム −0〜-24dB 1dBステップ

・AMP MODE
 アンプの動作モードです。下記から選択。
 core on
 LowFi
 HiFi 1Vrms
 HiFi 2Vrms

 
・HP BIAS
 ヘッドホンアンプのバイアスカレントの設定
 LOW
 HIGH

・FILTER
 ディジタルフィルターの選択
   #0 linear phase fast roll-off filter
   #1 linear phase slow roll-off filter
  #2 minimum phase fast roll-off filter
  #3 minimum phase slow roll-off filter
  #4 apodizing fast roll-off filter type 1 (default)
  #5 apodizing fast roll-off filter type 2
  #6 hybrid fast roll-off filter
  #7 brick wall filter
・LOCK SPEED
 DPLLのロックスピードです。
 #0(SLOW) 〜 #15(FAST)

・BW I2S/DoP
・BW DSD
 DPLLのバンド幅
 #0 DPLL OFF
 #1 (LOWEST) 〜 #15(HIGHEST)
 
・Dop Logic
  Dopロジックの有効・無効の設定
  Disable
  Enable

・Bypass THD
 THD Compensatin Logicの有効・無効の設定
 Disable
 Enable
あれ、Bypassの綴りが間違ってる(笑。修正しとこ!


・INITIALIZE
 パラメータの初期化(初期状態でRasPiと接続できるような
 パラメータ設定になっています)。 

コネクタをとりつけよう!

Integration Unitと接続基板(UNIT)との通信はいわゆる垂れ流しなので、活線状態での接続が可能です。
すなわち互いに接続したいときに接続できます。データを途中から拾っても、既定のフォーマットにしたがっていなければ
無視されるだけなので問題ありません。ただし、PiDAC9218以外の基板は、PIC内部でプルアップがある端子と接続しているので、
とくに何の処理も必要はないのですが、PiDAC9218はプルアップのない端子を通信につかっていますので、
無接続状態時にノイズを拾わないようにプルアップをしておきます。
単に外来ノイズを抑えるだけなので、100kΩ程度の抵抗をVCC(3.3V)と通信端子間に接続です。
長い線で通信を行うためには、もっと低い抵抗が必要ですが、低いプルアップ抵抗はIntegration Unit側に入っているので、
PiDAC9218側は軽くプルアップです。

PiDAC9218の通信端子にはノイズ防止のプルアップ抵抗を入れました。


Integration Unit側にコネクタを取り付けました。ピンソケットを切り出して使いました。


ピンソケットだけだとピンが抜けるので、小さい変換基板を流用して固定です。


これでパラメータ調整時のみ接続して使えるようになりました。
電源は入れっぱなしです。


PiDAC9218は通常はRaspberry Piに接続して使うのですが、RasPiがLINUXで動いているため
電源の入り切りがとても面倒です(時間がかかる)。Integration Unitとの接続に、いちいち電源を
切っていたのではかなり不便だったところですが、回避できたようです。

 さて、またRaspberry Piに組み戻しましょう。

すこし仕様をまとめておきます。
使用PIC:PIC16F1827
対応DAC:PiDAC9218P
機能:10個の音質にかかわるパラメータの調整が可能。
    初期状態で音量最大に設定しているので、従来PICと同様にそのままRasPiに接続可。
    (ただし、基板上のジャンパーポストは使えません)。
PICのバイナリーはここに(2020.5.27版)


(つづく)