作成者別アーカイブ: Eleken_imported_by_old_blog

USB バージョンを取得する (VC++)

PC に接続されている USB デバイスのバージョンがどう認識されているか
(ハイスピードの USB2.0 なのか、USB1.1 なのか…等)
知りたいことがあります。
これを取得する直接的な API はないようですが、
Microsoft の WinDDK に含まれる usbview サンプルが参考になります。

USB バージョンを調べるには、ルートハブからデバイスを走査していき、
DeviceIoControl 関数を使って USB_NODE_CONNECTION_INFORMATION_EX 構造体の情報を取得して、
デバイスディスクリプタの bcdUSB を見るというのが確実な方法だと思います。
bcdUSB には BCD で USB バージョンが入っています。

USB デバイスの VID と PID から USB バージョンを返す C++ のクラスをつくりました。
-> ダウンロード
CGetUSBVersion::GetUSBVersion(pid, vid) を呼び出すことで、
USB バージョンが BCD で帰ります。
(たとえば 2.0 なら 0x200)
取得失敗で負の値が帰ります。

なお GetRootHubName などの一部の関数は、WinDDK のサンプルから引用しています。

(メモ)I2C 絶縁回路


ADC などの I2C デバイスを絶縁させて動作させたい場合があります。
I2C は双方向バスなので、インタフェースに少し工夫が必要です。
上記はフォトカプラを使用した簡易的な I2C 絶縁回路で、
クロック 1kHz 程度なら問題なく動作します。
(なおクロックストレッチは対応せず)
回路定数は重要であり、フォトカプラの CTR も 100% 以上必要でしょう。
東芝 TLP521-GR が適当です。

TTL IC で自作する Atari Pong(4)

* ものは完成しているのですが、執筆が間に合っていません…

4 枚目はゲームコントロール回路、サウンド出力回路です。参考にした回路図には少し誤りがあるので、原本を参照したほうがよいかもしれません。右下の SW はゲーム開始ボタンです。

オリジナルの回路にはアンテナ入力があるのですが、役割がよくわかりません。この信号と /SRST 信号は Tr で組まれたラッチ回路の入力となっており、客が近づいたら ATTRACT モードになるという動作でいいのでしょうか?今回はこの部分も TTL IC に変更しています。また、オリジナルのオーディオ出力には DC 成分が残りますので、10uF でカップリングしています。

IC のデカップリングキャパシタですが、IC 1 列ごとに 3.3uF のタンタル C、フリップフロップに別途 0.1 uF のセラミック C を乗せています。少し足りないかとも思いましたが、この程度で十分のようです。ただし、使用した IC は半分以上 74LS なので、スタンダード 74N を使用するなら、もう少し多く載せたほうが良いかもしれません。

TTL IC で自作する Atari Pong(3)

3 枚目はボール位置のカウンタ、ボール速度の計算回路を載せています。
毎度美しくない配線ですが、このほうが後のデバッグに都合良いのです…

Pong の回路の面白いところは、上下左右に動くボールの「位置」を 74161 (同期式カウンタ…オリジナルでは Fairchild 9316 ですが) によって演算させていることです。どういう仕組みなのかというと、例えば次のフレームでのボールの縦位置は現在位置の ± N とするためには、ディスプレイの縦幅が 252 ラインなので、74161 のプリセットを 4+N (>0) とした modulo 256-(4+N) のカウンタ回路を構成します。このカウンタを水平同期信号でフリーランすると、カウンタがプリセットされるタイミングの V 位置 y(t) として y(t) = y(t-1)+N となるわけです。(説明を理解するより回路を見た方が早いでしょう)

ボールの垂直速度、水平速度は動的に変わってゆきます。垂直速度はボールがパドルに当たった位置によって変化するので、ボールの移動角 度が変わることになります。水平速度もゲームが進むにつれて高速になります。これらの工夫により、Pong というゲームは素朴ながらゲーム性が高くなっているわけです。

TTL IC で自作する Atari Pong(2)

基板 1 枚目

やはり 1 日がかりの作業となってしまいました。1 枚目の基板にはクロック(14.31818 MHz の 2 分周)を含む、映像タイミング生成回路を中心に乗せています。

ケーブルによる配線は基板の表面を這わせています。裏面を Point-Point で配線した方が表面からの見栄えが良く、配線スピードも速くなるのですが、配線ミスが見つけにくくなります。難しいところです。今回は表面での配線で統一しようと思います。

基板間の配線は L 型ピンヘッダを使用して、マザーボード経由の配線もしくはフラットケーブルによる配線を考えています。一昔前ならカードエッジコネクタでしょうが、今はそのほうがコスト大です。

このユニバーサル基板では、パターンの制約から、DIP IC を乗せて使うとあまりスペース効率が良くなりません。パターンカットすればこの 2-3 倍の IC を乗せることができるのですが、配線が窮屈になりすぎて不都合です。この点、サンハヤトの IC ユニバーサル基板は良くできているのですが、少し高価です…

TTL IC で自作する Atari Pong (1)

去年から ロジック IC をたくさん収集していましたが、そろそろ消費するフェーズかなと思います。冬休みということもあり、Atari のアーケードゲーム Pong を作ろうと考えました。

本稿の題名は「TTL IC で自作する Atari Pong」としましたが、オリジナルの Pong は 74 シリーズの汎用ロジックで組まれているので、サービスマニュアルの回路図を元に製作することにします。サービスマニュアルや回路図は archive.org 等で手に入りますが、このページ(Dan B’s Video Game Tech Page)に清書済みの PDF があるので、参考にさせてもらいます。

製作にあたって設けたルールは以下の通りです。

  • 使用する IC は 74N、74LS (+555) に限る
  • 配線には UEW を使わない
  • チップ部品を使わない

製作にはおおむね 60 個程度の TTL IC を使用しますが、ほとんど手持ちストックの中から揃えることができました。ただし、ストックの都合で、以下の IC は別の IC で代用することにします。

  • 7425 -> 7432 (+7404)
  • 7450 -> 74LS51
  • 74107 -> 7473, 74LS113
  • 9316 -> 74LS161
  • 7483 -> 74LS283

 
ストックから集めた IC

今回は以下のようなユニバーサル基板を調達しました。「新印 8.5CM*20CM」と書かれており、ロジック IC の実装に便利そうです。これ 1枚に 16 個程度の IC が楽に乗せられるので、複数枚を用いてモジュール構成とします。


IC 向けユニバーサル基板

以下次回。

ニキシー管テスタのその後

以前紹介していた TR-6364 マルチメータですが、
電源ケーブル欠品という問題がありました。

特殊な規格のコネクタのようで、どうしてもケーブルが手に入らなかったので、

写真のように、普通のメガネコネクタに付け替えてしまいました。
(ちなみにこれはマルツで購入したもの)

これで、電池動作に加えて、内蔵トランスからの動作ができるようになりました。
電池動作との動作の違いは、内部動作が電池電圧直結から安定化 +15V になることで、
これにより
・AC-DC 変換部分オフセットの安定化
・内部 DC コンバータのピー音の解消
などのメリットがありました。


実は半年前に改造・調整していたのですが、
今動かしても ACV レンジでちゃんと 0 が出ます。
よかった。

自作VFD電卓 その3

クロック回路の設計


TMS1030/1031 にはクロックドライバが無いので、
1 ピン(CK) にクロック信号を入力する必要があります。
周波数は 100k – 200kHz ほどで、14V p-p (Vdd-Vgg) の振幅が必要です。

当時の製品では、Tr 2石のマルチバイブレータでクロックを生成させているケースが多いのですが、
部品点数と消費電流が気になるので、今回は CMOS インバータによる発振回路を作ります。
こういう高電圧系の応用に CMOS の 4000B / 4500B は便利です。

 
4584B (シュミットトリガインバータ) を使った発振回路は、図のようになります。
4069UB を使うことも考えましたが、その場合貫通電流の影響で、
消費電流が 図の回路に比べて 10 倍ほどになってしまいます。
出力の 1k は保護用で、接続先のピン配置がまだ確実ではないので入れたのですが、
そもそも 4584 の出力 Z がそれくらいあるので、無くても同じかもしれないです。


ここまでの基板写真です。

ドライバ回路の設計

この IC にはディスプレイのドライバ回路もなく、単にオープンドレイン出力となっているだけで、
定格などは資料が無いため不明です。
VFD を駆動するために、外部 Tr によるドライバ回路が必要です。


これは、上図のような単純な回路で十分です。
図中 グランド記号で示されている電位は、VFD のカットオフ電圧なので、
Vgg より低い電圧です。
2SC2021 は ROHM の汎用トランジスタですが、外形が FTR なので高密度実装が可能です。


ここまでの基板写真です。
抵抗などはチップ部品を使っているので、部品面に実装してあります。

IC の生存確認

ここまででの実装で、もし IC が生きていれば、
少なくともプルダウンされたグリッド出力には信号が出力されるはずです。
というわけで…

動作かくにん!よかった
製造後 40 年あまりにして、IC にはじめて電源が入れられたわけです。

自作VFD電卓 その2

電源回路の設計

TMS1030 を使った VFD 電卓の製作です。
乾電池2本で動作させるための電源回路を設計します。
まず、動作に必要な電位レベルを書き出してみます。

VFD の駆動に必要な電圧は、アノード電圧 Va, グリッド電圧 Vg,
フィラメント電圧 Vf の 3 種類です。
(前回はフィラメントを VFD 付属資料に引っ張られてヒーターと呼んでいました)
通常 Va = Vg として駆動、その値は 12V – 30V ほどです。
大型の VFD になると、フィラメントは交流で駆動させる必要がありますが、
今回のものは直流でも問題なさそうです。


今回使用する VFD (ITRON DP95A4)は、定格等詳細は不明なので、
実験によりこれらの値を推測する必要があります。

フィラメント電圧は、大きすぎると VFD の寿命が極端に縮まってしまいます。
かといって、小さすぎると VFD が点灯しません。
フィラメント(発光部分の手前にある細い電線)自体が発光しないで、
VFD の アノード、グリッドに電位を与えた上でセグメントが発光するような値にセットします。
今回の VFD では 1.6-1.8V 程度が丁度よさそうです。

定電圧駆動が望ましいのですが、乾電池 2 本動作なので、1.9V 動作まで電圧低下をみると、
レギュレータの設計がちょっと面倒です。
簡単ですが、アクティブ駆動は見送り、抵抗で電圧制限することにします。
50Ω 程度の抵抗と直列に繋ぐことで、丁度良い電圧幅に落ち着きました。

アノード、グリッド電圧は、十分に発光する適当な電圧に設定します。
じつは最初は経験から 26V で駆動させていたのですが、あらためて実験すると、
もう少し低い値でもよさそうなので、今回は 18V としました。
この高電圧は、スイッチングコンバータで昇圧させて生成します。


TMS 0130 の定格は 14V で、ドライブ段は pMOS のオープンドレインとわかっているので、
Vss を Va, Vg とする必要があります。
この電源電圧(Vgg, Vdd)は、VFD 用に生成した高電圧から降圧させて作ります。
あとで アノード、グリッド電圧を上げることを考えると、リニアコンバータより、
効率の良いスイッチングコンバータとした方が都合よさそうです。




設計した電源回路の構成図と回路図、写真を示します。
プローブをひっかけるために方々配線が伸びているので、
あまり綺麗じゃないですね。

こういう多出力の電源システムを構成するには、多巻線トランスを介したコンバータに
するほうが簡便で、商品化された大抵の電卓でもそうなっています。
しかしながら、手元に適当なコアがないので、通常のインダクタで設計できる
ブースト型・バック型の DC-DC コンバータとしました。
2系統のスイッチング・フィードバック経路が必要になるので、専用 IC を使わずに、
制御はマイコン (ATtiny13A) にさせることにします。

この回路で 初段 2.0V -> 26V (13倍)@ 35mA(Vss-Vgg 間) の出力が可能です。

ただこの条件は極端な duty 比率となるため、ブーストコンバータとしては
かなり厳しい条件になります。
この後の実験では、Vss-GND は 18V で行っており、
上記回路図の回路定数もそのようになっています。

次回につづく