2008年10月31日金曜日

混沌から秩序へ(ジャンパワイヤ)

秋月で購入したブレッドボードのジャンパワイヤは透明な整理箱に入って付属してきます。いろいろな種類が「そこそこ」分類されているわけなんですが、今まではあまり気にしないで必要な長さのワイヤを「当て勘で」ピックアップし、現物合わせをしながら使っていました。

しかし、最近はこの現物合わせが面倒くさくなってきて、何とかならないかと軽く悩んでおりました。

ふとワイヤの被覆の色と長さに対応関係があるような気がして全部皿の上にひっくり返して調べてみると…なんだ、長さが抵抗と同じカラーコードに対応しているじゃありませんか。つまりこういうことでした。

{被覆なし,赤,橙,黄,緑,青,紫,灰,白}={1,2,3,4,5,6,7,8,9}

イコールの右側の単位はグリッド長で、1グリッド=0.1インチ=2.54mmです。ここから上が10グリッド単位のもので、(さっきのものと重複しますが、長さがまるで違うので見た目で判別がつきます。)

{茶,赤,橙,黄, 緑}={10,20,30,40,50}

なるほど。こりゃ覚えやすい。それじゃあ、分類して入れておけば探すのがもっと楽になるはず…しかし、14種類もありますな。付属のプラケースは仕切りがいくつも入っていない。

さんざん考えてしまいました。100円ショップでピルケースのような仕切りのたくさんあるケースを買おうか、いやもったいないから何か仕切りを立てて使おうか…。

悩みぬいた揚句たどり着いた答えがこれです。通常ICを挿して保存するためのプラスチックフォーム(硬いスポンジみたいなもの)をついたての隙間よりも少し大きめに切って差し込むだけ。このケースでは1グリッドから10グリッドまできれいに仕分けして入りました。めでたしめでたし。

2008年10月15日水曜日

TinyでPONG!(概要)

これから製作例を紹介する「TinyでPONG!」は、非常に安価な8ビットマイコンATTiny2313ひとつでこの黎明期のテレビゲームを「安価に」模倣してみようじゃないかというプロジェクトです。

Tiny2313はプログラムメモリー(ROM)が2Kバイト、RAMが128バイトしかありません。RAMといっても当然VRAMではないので、そのまま映像出力ができるような仕組みは一切ありません。

しかも画面表示解像度は水平192ドット×垂直236ラインですので、VRAMで実現しようとすると1ドットあたり1ビットとして5,664バイトが必要になってしまいます。やはりVRAM方式では無理ということになります。

PONGの映像を出力するのと同時に水平・垂直の同期信号を作ります。テレビ側はこれらの信号に合わせて画面の上端と左端のタイミングをつかみます。この同期信号のタイミングをTiny2313内蔵のタイマ/カウンタで作り出します。

プログラムでは、前述のボール左端カウンタ、右端カウンタ、上端カウンタ、下端カウンタ、左パドル上端カウンタ、下端カウンタ…が変数として使われて、ハードウェアカウンタをシミュレートしているような格好になっています。

1「行」分の映像を出力するところは一番工夫したところで、非常に高速に、かつ、安定した速度で動かなければならないので、かなりトリッキーなことをやっています。AVRの汎用レジスタの数の多さを最大限利用しています。PONGの仕組みを模倣すると言っておきながら、この部分ではちょっとずるをしているのですが…VRAMを使わないことが一番の目的なのでまあ許してもらいましょうか。

パドルは10KΩのボリュームで制御します。ボリュームの位置を検出するのに電圧を直読できるA/Dコンバータがほしいところでしたが、あいにくこのマイコンには内蔵されていません。そこで、簡易A/Dコンバータをソフトウェアで実装してあります。コンデンサを決まった電圧に充電しておいて、ボリュームの抵抗で放電させ、電圧が一定レベルまで下がったときまでの時間を測ります。抵抗が小さければ素早く放電され、抵抗が大きければゆっくり放電されます。詳しく計算すると分かるのですが、抵抗値とこの放電時間は比例します。つまり、ボリュームはBカーブ(=直線)であればそのままBカーブとして使えるのです。

サーブをするためのボタンは電源ボタンを兼ねています。電池を入れるとすぐには映像は出てきません。サーブのボタンを押すと初期画面が現れます。映像が出ているときはいつでもサーブのボタンを5秒以上押し続けることにより電源を切ることができます。

そのほかにも音が出たり、ソフトで電源ランプ(LED)の輝度調節をしていたり、さまざまなことをやっています。

プログラムのソースコードを公開する予定ですので、詳しくはそちらをのぞいてみてください。

2008年10月14日火曜日

なぜPONGなのか(4)

ここまで来てやっと「なぜPONGなのか」がお話しできます。

PONGは今や当たり前となっているコンピュータ+VRAM+ソフトウェアの方式とは構造をまったく異にしています。

テレビがスキャンビームを左から右に、上から下に振って絵を描き出すその仕組みを直に利用しています。テレビ画面はもとから2次元ではなく、織物をほどいて時間軸方向に引き伸ばしたものを、逆の手順をたどって織り上げたものです。今まさにスキャンビームが通るその瞬間を捕まえて輝点を打つ、そのタイミングが画面上の座標に対応します。その瞬間を捕まえるのに多数のカウンタとコンパレータが活躍するのです。

ゲームの進行もコンパレータでの一致検出とカウンタの計数方向の反転だけで実現されています。動物に例えると条件反射あるいは脊髄反射的といえましょう(図らずも同じ「反射」ですね…)。そこにはソフトウェアのソの字もありません。

現代人にとっては、ゲームとしては単純すぎて、遊ぶにはすぐに飽きてしまいますが、コンピュータではなく「デジタル回路」と「テレビジョン技術」の学習としては実によくできた教材になるのではないでしょうか。

2008年10月13日月曜日

なぜPONGなのか(3)

PONGの話に戻りましょう。

実はPONGゲームはまだマイコンが普及してなかったころに作られたものです。その前の年にインテルが世界初のマイコンi4004(4bit)を発表したばかりのころ。マイコンを採用しようという概念は当然なかったでしょう。仮に採用したとしてもメモリーも高価で、たった数キロバイト程度でも使えません。

「VRAM→画面の仕組み」の力を借りずして、どうしてテレビにゲームの画面を映し出すのでしょう?これには前述のOSDの話と関係があります。

テレビはアナログの映像信号1本--時刻とともに上がったり下がったりする電圧が一組あるだけ--で面の情報を映し出します。そのためにスキャンビームが画面を走査(スキャン)するのです。最上部の左端から右端へ、右端に到達したら次の行へ。横書きノートに口述筆記をするのと同じでです。ノートと違うのは最下行に到達したら次のページにめくるのではなく、左上に戻ることです。

幸いPONGは複雑な図柄は必要ありません。画面上の1つの「行」に注目すると、一番たくさんの種類の図柄を描く場合は、①左のパドル、②左のスコア(数字2桁)、③ボール、④センターライン、⑤右のスコア、⑥右のパドルの6種類だけです。

テレビのスキャンビームが左端にあるタイミングは、信号を出す側にとって分かりきったこと。③ボールの位置にスキャンビームが到達したその瞬間、映像信号を叩き「白」を出します。ボールの横幅を過ぎたところで今度は「黒」を出します。

OSDの話ではマイコンのプログラムループでこのタイミングをとっていました。しかし実はこれらはハードウェアだけでできるのです。

ビームの水平位置を示すカウンタを、画面の左端でゼロリセットしてからカウントアップの状態にし、カウンタが出力する値をコンパレータ(比較器)で検出し、映像信号を「白」にセットします。コンパレータへのもう一方の入力値はこの場合はボールの左端の位置です。また別のコンパレータを使って、ボールの右端を検出したら「黒」をセットします。

こうして6つの要素について次々と上記と同様のことを行って1行分を映像出力します。もちろんその行にボールがなかったり、パドルがなかったりする場合は「白」の出力はしません。そのためには「ビームが何行目にいるのか」を数えるカウンタ、「ボールが何行目にいるのか」を検出するコンパレータなどが必要です。

それぞれの要素について左端、右端、上端、下端を保持しておくカウンタや一致検出のためのコンパレータなどのハードウェアが必要になります。ゲームの進行もこれらのカウンタ、コンパレータをうまく使って実現することができます。(たとえば右パドルでボールが左から右へと反射するのは、ボールの右端を覚えているカウンタが右パドルの左端を覚えているカウンタと一致したとコンパレータで検出した瞬間に、ボール用のカウンタの計数方向(上昇/下降)をひっくり返すことに他なりません。)

全体としてなんだかものすごいハードウェアの量になりそうですが、それでも当時としてはコンピュータ+メモリのほうがずっと複雑で物量も大きく、なによりも高価だった。カウンターとかコンパレータが山ほどあってもそれで済むのならまだ経済的だったのです。

2008年10月12日日曜日

なぜPONGなのか(2)

そしていつの間にか私もいい歳の大人になって、おやじになって、世の中はテレビゲームのみならず携帯ゲームが世の中を席捲している状況。ひとえにコンピュータ産業の発展のたまものです。

これらはコンピュータを内蔵し、ソフトウェアで動くという点で世代にかかわらず私から見れば「同じもの」。つまり、画面上の座標と一対一に対応付けられたビデオメモリー(VRAM)に、ソフトウェアで指令されたコンピュータのコア(CPU)がせっせとイチゼロのデータを書き換え続けるということです。VRAMのある番地のデータが書き換われば対応する画面の座標の色が変わります。そういうVRAM→テレビ画面の仕組みがチップ内に組み込まれているのです。

私が生まれて初めて触れたコンピュータは、すでにテレビ用のインターフェースを備え、白黒ではあったが文字表示と簡易グラフィック表示ができるものでした。当然画面への表示は前述のVRAM→画面の仕組み(CRTC = Cathode-Ray Tube Controller)が搭載されていました。テレビに何かを表示したい場合にはそのような仕組みにするのが当然であり、それしか方法はないものだと思い込んでいました。まだ何も知らない若造だったのです。



某電器メーカーのコンピュータ設計部門に就職したその年、先輩エンジニアたちと雑談をしていて、私が愚にもつかない質問をしました。

「テレビのOSD*を出すためのマイコンってどのくらいVRAM積んでいるんですかね?」

(* On-Screen Display: チャンネル番号やボリュームレベルをテレビ映像に重ねて表示する機能)

ちょうどテレビの設計部門から転属してきていた先輩エンジニアはすかさず答えます。

「VRAMなんか持っているわけないじゃん。そんなメモリー積んでたら(値段が)高くなっちゃってしょうがないよ。」

自分の常識を覆す答え。え?それじゃあどうやって文字を出すの?

「スキャンビーム(走査電子ビーム)が、うまい位置を通るちょうどその時に映像信号をONするようにプログラムループを使ってタイミングをとるんだよ。テレビなんて何種類も文字出さないし、文字の解像度もすごく低いからからそんなんで十分。アセンブラでゴリゴリよく書いたもんだ。」

目から鱗でした。なるほど、極小のリソースの中でどれだけ複雑なことができるか、これぞ技術だ、技だと思ったものです。

2008年10月10日金曜日

なぜPONGなのか(1)

私が子供の時分にTVコマーシャルで、そしておもちゃ屋の店頭で見た「テレビテニス」はあまりにも鮮烈で脳裏に焼き付いています。なにしろそれまでテレビに映し出されるものはテレビ番組しかなかったわけで、その画面に何やら番組以外のものを映し出して遊ぶという概念さえ持ち得ませんでした。しかも(遊ぶからには当たり前ですが)コントローラ上のノブを回して自分の意のままにパドル(棒の映像)が動く。それはそれはびっくりこいてしまったのです。

我が家は貧乏ではありませんでしたが、当時このようなものを持っている友人は皆無で、当然買ってもらえるような代物ではありませんでした。いや、あまりにも自分の立場とかけ離れた存在だったので、親に遠慮して欲しがらなかったのかもしれません。

今ネットで調べてみるとこれは1975年にエポック社から発売されたものと判明。定価19,500円とは、当時としてはまったく子供向きの価格ではなかったんですね。

また、こちらの情報によれば「得点を記録する機能がなく、本体に回転式の表示装置が付けられている」って…へーそーだったんだー。てことは、ボールを跳ね返すことしかできなかったんだね。当時は技術立国の直前。それでも家庭用ゲームとしては強烈に画期的だったはず。

日本の「テレビテニス」のおおもとは米国アタリ社のアーケードゲーム "PONG" らしい。1972年の発表だったそうです。こちらの "PONG" はネット上で情報が集めやすく、プレイ中の動画も YouTube などから発掘できます。

こっちにはちゃんと得点表示が画面に表示されています(自分としてはなぜかこっちの画面のほうが記憶に残っています)。

2008年10月9日木曜日

TinyでPONG!(動画)


Tiny2313でつくるPONGゲーム。ようやく動画ができました。WindowsMovieMakerはタダであるがゆえあちこち不満はあるものの、ど素人でもこの程度のビデオが作れてしまうのは驚愕、さすがMSと言えます。

製作記事はまたいずれ後日に。

2008年10月7日火曜日

負電圧の電源を作ろう


秋月でロングセラーの液晶モジュールSC1602。データバスと3本の制御線だけつないでコマンド投げれば文字表示ができる大変お手軽で便利なデバイスです。しかし5V駆動なのが玉にキズ…。最近仕事ではほとんどが3V系のものばかりで、ブレッドボードでの実験などもどうしても3Vで動かないと困ってしまいます。

で、データシートをくまなく読んでみると、ロジックは2.7V以上で動作することがわかりました。ただし、液晶コントラスト電圧(データシート上ではVo)が電源VDDより下がること4V以上が必要。仮にVDD=3VだとするとVo=VDD-4V=-1Vで負の電圧が必要になります。

それでは正電圧→負電圧の変換器(電圧インバータ)を作ってモジュールに抱き合わせてしまおうと思い立ちました。そうすれば3V単一で動作する液晶モジュールになりますから。

電圧インバータは、Vo端子がほとんど電流を食わないため、いわゆるチャージポンプ方式とします。74HCU04×2/6で発振回路を構成し、残りのゲートで駆動力を稼ぎます。その後にCとDiのネットワークを通すとあら不思議!-2.0V程度の負の電圧が得られます。インバータという割にきっちり-3V出ないのは、HCU04の出力電圧が若干電源電圧よりも低いのと、ダイオードの順方向降下電圧(VF)のせいです。ショットキバリアダイオードなどVFの小さいものを使えばもう少し電圧は稼げると思いますが、今回は-1V以上出ればOKなのであまり追及はしませんでした。

  • 液晶モジュールSC1602のデータシートはこちらから(PDF)
  • SC1602内で使われているコントローラMSM6562B(沖)の日本語版データシートはこちらから(PDF)