SGから取り外したプログラマブル・アッテネータをArduinoから制御する。

2020/05/04  7M4MON

1.概要

 SGから取り外したProgramable Attenuator(329H10778)を解析してArduinoから制御しました。

2.ハードウェア

329H10778を開けると下記写真のようになっていました。


テスターでピン配置を解析すると下記のとおりとなっていました。


60dBの切り替えリレーには12Vの記載があったので、電源は12Vで内部の緑の部品でリレーを動作させていそうな感じです。
リレーに直接12Vを加えたところ、極性を反転させないと戻らないことから、緑の部品はHブリッジ回路を構成しているようです。
8〜15ピンは緑の部品の2ピンでプルアップされているので、2ピンに5Vを加えました。
DIPスイッチでパチパチやると、ATTが切り替わっており、考えが正しいことが分かりました。

マイコンはArduino Pro mini (WAVGAT) を使用しました。後述しますが、ATMEGA328Pではないみたいです。
各ポートの制御は、I2Cバス対応の8ビット I/O エクスパンダ、PCF8574Aと 8chトランジスタアレイ TD62083APG の組み合わせ。
PCF8574Aはウィークプルアップのオープンドレイン出力です。PCF8574Aと組み合わせると0.8V程度だったので外部で2.2kΩでプルアップしています。
3端子レギュレータで12Vから5Vに落としていますが、電流は0.6A程度あるので4.2Wほど電力損失があり、使用しているとまぁまぁ熱くなります。
(電流はそれほど上下しないので 4.7Ω, 3W程度の抵抗を入れれば消費電力を分散できそう)

制御用にロータリーエンコーダを使用していますが、これは「クリック安定点でのB相出力が規定できない」タイプでした。


一般的には1クリックの間にA相、B相が1周してどちらかの立ち上がりまたは立ち下がりエッジでもう片方の出力を読めばよいのですが、
今回は世にあるライブラリではうまく行かないので、A相を割り込みポートに入れてエッジ(両方)を検出、その時のB相とA相の関係でCW/CCWを決める処理を実装しました。
つまり、A相のエッジの直後にB相を読み取り、一致していればCCW、不一致ならCWです。


3.ソフトウェア

シリアルポートに入力があった場合やマニュアルでの変更決定操作があった場合は、PCF8574Aのポートをセットして329H10778を制御します。
と、ここでシリアルポートのデバッグを行っているとき、9600bpsと設定しても2400bpsで送ってくることに気づきました。
内蔵クロックに切り替わってしまったかな?も思ったのですが、ATMEGA328Pの内蔵クロックは8MHzなのでなんか変です。
そういえばチップには WAVGATの印字があり、もしかしてATMEGA328Pじゃないのかも?
購入ページを見たところ Fake IC らしい!偽チップだったのか!


うーん、ポートの初期化をいちいち書かないと動作が変なのはこのせいか…
と諦めムードだったのですが、購入ページを再度よく読んで、記載されていたドライバを入れれば正しい速度になりました。
https://github.com/ericvb/Arduino-WavGat-Drivers
ちなみに、ボードの選択は「WAVGAT Pro mini」では駄目で「WAVGAT UNO R3」が正解です。

制御のコードはgithubに公開しましたのでご自由にどうぞ。


ついでにPCから制御できるアプリも作ってみました。

 


4.かかった費用(アッテネータ別)

 7000円くらい

5.感想