PIC AVR 工作室->TopPage->AVRの工作->ComponentVideo
TINY2313でカラーのコンポーネントビデオ表示
仕上がりイメージ
TINY2313とオペアンプを使って、カラーコンポーネント信号(もしくはD端子)にカラービデオの表示を してみました。
「カラー化の野望」の成果物その1です。まずはそのアウトプットをご覧あれー。
一見すると単なるカラーバーの様ですが、よーく見てみてください。1ドット単位に着色しています。 (別窓で開くともっと大きく表示できます)
単なるカラー表示に留まらず、ゆくゆくは1ドット単位で色をつけたスプライト表示や文字表示に たどり着くための通過点の一つです。
オペアンプと組み合わせることで、マイコン側の処理は白黒表示に近いレベルでプログラムが組めるのがミソ!
コンポーネント表示のための背景
ビデオ信号に使われる端子と信号について
ビデオ端子といえば、普通はあの黄色いRCA端子を思い浮かべますよね。これまでAVRで作ってきたビデオ表示の 作品(スプライト表示器やテキスト画面) も、あの黄色い端子に繋いで使うモノでした。
今回採用したコンポーネントビデオ(日本国内ではD端子として付いていることが多い)は、ここ10年くらいのテレビなら ほとんどどんなモノにでもついていると思うほどメジャーな端子なのですが、ハイビジョンDVDを使っているというような 人を除くと、あまり触ったことも無いよ…という方も多いかと思います。(私はまだハイビジョンDVD持ってませんが…)
どうせなら、使い慣れた黄色い端子でカラー信号を表示すればいいジャン!って思う方が多いと思いますが、 カラー化の野望でも触れているように、黄色い端子を 流れるカラー信号 (カラーコンポジット信号)は、その当時の超ハイテク(というと言い過ぎ?)の信号だったわけで、 40年以上経った現在でも、その信号の仕組みがそのまま使われている代物です(デジタル放送への移行で もうじきその 役割を終えようとしていますけどね…)。単純に言えば、RGBの3信号を1本に重畳させているため、信号の 生成タイミング等がとても複雑で緻密です。さすがのAVRでも白黒のようには簡単に実現できません。
今回実現するビデオ信号について
AVRを14.318MHzで動作させることでカラー表示を実現している作例はネット上に幾つも公開されている のですが、簡単な映像を、しかも表示するだけに留まるようです。私の目指している映像というのは単に色が出れば OKというわけでなく、ゆくゆくは1ドット単位毎に色を付け、しかも自由自在に動かしたいという遠い目標があります。
しかも(CPLDやFPGAの開発環境が無くてもいいように)マイコンだけでカラーコンポジットビデオを実現したい と思っているのですが、その前に、まずはコンポーネント信号でカラー表示をしてしまおうというのが今回の企画です。
いずれにしても、最近のテレビになら大抵D端子くらい標準で搭載してるわけし、今後実現したいと思っているコンポジット信号 だってコンポーネント信号の延長にある規格なので、ひとまずコンポーネント信号でテレビにカラー表示を行うことを 中間目標として実現してみました。
各ビデオ信号の相関について
今回扱うカラーコンポーネント信号を含め、カラービデオ映像の方式にはいくつかの種類が存在します。
ご存知の通り、通常のテレビにしてもPC用ディスプレーにしてもカラー映像を表示するためには「色の3原色」 の情報が必要になります。3原色とはRGB=赤緑青の3つです。ディスプレーの1ドットを虫眼鏡で拡大して 見るとすぐにわかりますが、1つ1つのドットはこの3色を組み合わせることで実現しています。
RGB、コンポーネント、Sビデオ、カラーコンポジットの概略図
それらの各種映像方式について、どの様な関係性があるのかをマンガにして整理し、以下に纏めました。
RGBについて
最近はPCにしてもハイビジョンにしても、HDMI等のデジタル映像信号へとシフトしつつありますが、 旧来のアナログRGB信号はテレビでもPCでも、周波数等の違いはあるにしても大同小異。RGB信号+Sync信号 という4つの信号で構成されています。上の絵の一番左側がそのRGB信号になります。家庭用テレビの映像なら 垂直同期=15kHzの信号です。
ちょっと前までは、ソニーWEGAシリーズには「AVマルチ入力(ゲーム)」という名前でRGB入力出来る端子が 付いてましたが、PC用ディスプレイとちがってテレビ用のディスプレーは旧来のビデオ信号(白黒ビデオ信号など) との互換性が無いRGB信号は徐々に淘汰されてきました。
いずれにしても、テレビ画面にドットを表示する際には上述の通り3原色が必要となるため、最終的には内部で3原色の 情報に還元していることは今でも変わりありません。なので、カラー映像を扱う際にはこの3原色を理解しておいて損はありません。
なお、RGBの場合のシンクロ信号は水平・垂直が別になっているものが多いですが、モノによっては混合同期信号に なっているものもあるようです。
コンポーネント信号について
さて、その右隣のコンポーネント信号が今回の本題です。
マンガに描いてあるように、コンポーネント信号(D端子の信号)はY信号、Cr信号、Cb信号の3つで構成されています。
Yは輝度信号で、白黒テレビ時代の映像信号そのものです。Crは赤から輝度を引き算したもの、Cbは青から輝度を引き算 したものです。旧来の白黒ビデオ信号と互換性を持たせながら、新たに色情報を盛り込む為に拡張された仕様とお考え下さい。 詳しいことは後述します。
Sビデオ信号について
そのさらに右隣。Sビデオ信号です。Y信号とC信号の2つから成っています。
C信号は、コンポーネントのCr、Cbに変調を施すことによって1つの信号に纏めたものです。 Y信号(輝度)はコンポーネント用のY信号と同じものです。端子の形状は4ピンのミニDIN形状です。 RCAではありません。
コンポジット信号について
一番右側は、最も見慣れた黄色い端子のビデオ信号=コンポジット信号です。マンガを見ていただけば おわかりのとおり、Sビデオ信号のYとCを単純に足し算したものです。輝度に色信号が混ざったものなのですが、 「周波数インターリーブ」や「4フィールドシーケンス」などの仕組みを使って、白黒テレビにこのまま信号を入力しても 旧来の白黒映像と同様に表示されるようにできています。
ビデオ信号の基礎とその操作法(CQ出版)にはさらに 詳しいことが記載されているので、ご興味のある方はそちらをご覧ください。
各信号間の相関について
これらの各方式は、右から左、もしくは左から右の方式へは、何らかの演算を行うことで変換することが出来るように なっています。今回はコンポーネント方式がメインテーマなので、以下ではRGB信号とコンポーネント信号の変換について 紐解いていきたいと思います。
コンポーネント信号の概要
細かい計算などはカラー化の野望を読んでいただくとして、 コンポーネント信号の大まかな概要だけ触れておきます。
コンポーネントの信号線の種類と数について
コンポーネント信号(もしくはD端子の信号)には、以下の3つの信号線があります。
- 緑端子 = Y信号 (輝度信号)
- 赤端子 = Cr信号 (赤色差信号)
- 青端子 = Cb信号 (青色差信号)
お馴染みのコンポジット信号では映像信号が1端子だけだったのに対し、コンポーネントでは3つの信号端子に分かれて 映像が伝送されます。赤、青、緑の3つの信号を3本の線で送る場合と1本に重畳して送る場合では、単純に考えれば どちらがクオリティーの高い映像を送ることが出来るかは容易に想像できるかと思います。
なお、海外ではこれら3つの信号はそれぞれ緑・青・赤の色の付いた3つのRCAジャック(コンポーネント端子)で接続 するようになっています。一方日本では、この3つの信号を1個1個繋ぐのが面倒だと判断されたのか、D端子(D1の信号)という 日本独自規格の端子1個だけで接続できるようになっています。
D端子について
D端子のDはデジタルのDではなく、D型の形をした端子という意味で、内部を流れる信号自体はアナログ信号です。 基本的にはコンポーネント信号そのものですから。
で実際、コンポーネント信号とD端子は相互に互換性があるので、単純な変換ケーブルで繋ぎ換えることが可能です。 ケーブルは家電屋さんとかでも売ってます。写真は、千石で買ってきたコンポーネント-D端子変換ケーブルです。↓650円也。
ご覧の通り、片側が緑・青・赤端子(それぞれY、Cb、Cr)のコンポーネント信号。もう片方がD型をしたD端子になっています。 D端子側をテレビに繋ぎ、コンポーネント端子側をマイコンボードに繋いで使います。
そうすることで、テレビ側は一般的なD端子、マイコン側は工作が楽なRCA端子という組み合わせに出来ます。 D端子の細かいピンの工作を厭わなければ、両側がD端子のケーブルにしてもよいでしょう。
3つの信号(Y、Cb、Cr)の中身
Y、Cb、CRそれぞれの信号線を流れる信号について、簡単に触れておきたいと思います。
まず緑の端子=Y信号ですが、これは旧来の白黒ビデオ信号と基本的に一緒のものです。 白黒の輝度信号と垂直・水平同期信号が混ざった信号です。なので、実際にこの緑の信号線をテレビの ビデオ入力(黄色い端子)に繋げば白黒のビデオ映像になって表示されます。
輝度に相当する部分は、緑、赤、青それぞれの信号を適当に重み付けをして足し合わせたものです。この3色では人の目には 緑が最も明るく、青が最も暗く見えるので、緑に重みを沢山載せ、青は重みを軽くして足し合わせて作ります。
ビデオ信号の規格は、カラー放送が始まる前から(白黒テレビの時代から)上位互換という形で拡張されてきました。 この緑端子(輝度信号)は、白黒放送時代の映像信号そのものといえます。(厳密には、カラーと白黒ではちょっとだけ周波数がずれてますが)
残りのCb、Cr信号はというと、それぞれ赤、青の信号から輝度信号(Y信号)を引いた物です。 なので、すごく簡単に言ってしまうとCb、Cr信号にY信号を足すと元の赤、青の信号が取り出せます。 (実際はもう少し細かい計算が必要ですが、それは後述します)
これだと緑信号が取り出せないジャン!って思うかもしれませんが、大丈夫。Y、Cb、Crの3つの信号から 計算によって緑信号も取り出すことが出来るようになってます。(元のRGB信号に復元するための計算はテレビの中で やってくれているので、我々はY、Cb、Crの信号を規格どおりに作り出すことを考えれば十分。)
この”色差”という方式を使うことによって、3本の信号線だけでもY信号(輝度信号)に白黒時代の信号と互換を持たせながら、 RGB各色の情報を正確に伝送しています。
さて、マイコンを使ってRGB3つの信号自体を作り出すのは白黒信号と同じくらい簡単なので、処理能力の 低いマイコンでも充分処理可能になります。(ただし、データ量は単純に3倍になります)
具体的には、マイコンからR、G、B、SYNCの4つの信号を出力して、それらをオペアンプで適当な電圧に なるように加減算し、テレビに伝える、という形で実現します。以下に、その変換式を記します。
RGB→YCbCr信号の変換式
今回は、マイコンのVCCが5VでRGB各1ビット出力(0Vか5V)なので、RGB各5Vppの信号を 0.7Vppのビデオ信号(Y信号はシンクロ信号を含めて1Vpp)になるように変換することを考えます。
マイコンから出力される赤、緑、青、シンクロの各電圧をそれぞれR、G、B、Sとすると、YCbCrの各信号の電圧は 以下の計算式で求められます。
Y信号の計算
Y信号 = (+0.587G+0.114B+0.299R ) × 0.7 ÷ 5 - 0.06S
Cb信号の計算
Cb信号 = (-0.587G+0.886B-0.299R ) ÷ 0.886 × 0.35 ÷ 5
Cr信号の計算
Cr信号 = ( -0.587G-0.114B+0.701R ) ÷ 0.701 × 0.35 ÷ 5
マイコンの電源が5V以外の場合は、式中で「5」で割り算しているところを適宜読み替えてご使用下さい。
この計算式を実現する、オペアンプ周りの抵抗値計算についてはカラー化の野望 で解説しているのでそちらをご覧ください。
変換式を実現する回路図
以下に回路図を示します。(縮小表示しています。別窓で開くなどして等倍でご覧ください)
簡単な解説
簡単に解説します。TINY2313を20MHzで稼動してます。RGBとSYNCの各信号を各1ビットの5Vppで 出力しています。それを3つのオペアンプを使ってY、Cb、Crの信号に変換しています。
3つのオペアンプはすべてNJM2114DDを使いました。このアンプはSR=15V/usと 正直ビデオ信号に使うには遅いオペアンプなので、出来ればもっと速いオペアンプを使ってください。 ビデオ信号といえばやはりSR=50V/us程度は欲しいところです。
数値がやたら細かい抵抗がいくつかありますが、これらは2つの抵抗を並列にすることで実現します。図の下のほうに その組み合わせがメモってあるので、そちらをご覧ください。また、このオペアンプ周りの抵抗については、 誤差が大きいと発色に影響するので、誤差1%以内の「金属皮膜抵抗」を使うことをお勧めします。
電源回路について
そうそう。各オペアンプは反転増幅・非反転増幅の両方を使っているので、負電源が必要になります。 単電源可(rail-to-rail)のオペアンプを使う場合でも負電源が必要です。 プラス側の電源はマイコンと同じ5Vで良いですが、今回マイナス側の電源には 8ピンPICとOS-CONで作る負電源を 使用しました。負電圧生成ICのLTC1144やその他何でも構わないと思いますが、大体-5V程度出力できる電源を ご用意ください。
プログラム(AT-TINY2313用)
ダウンロード
プログラムを以下に示します。クリックしてダウンロードしてご使用ください。
とりあえず動いて画が出ることを最優先にしたので、処理タイミングが少々怪しいです。出力した画も 少し横に像が乱れているところがあります。が、面倒なので直しません。ご了承ください。
プログラムの処理内容
基本的には、白黒表示のサンプルプログラムに ちょっとだけ手を加えたものです。プログラムの処理内容について簡単に解説いたします。
- まず、メインループの先頭で9本の垂直同期信号を出しています。
- その後、28本のブランクラインを表示します。
- そこから50本ずつ、縦4層に分けて横方向に7色のビットマップを表示しています。
- 一番上のビットマップはベタイメージ。白、黄色、水色、緑、紫、赤、青の順で出力しています。
- 次のビットイメージは、コメントに「太線テクスチャ」とあるように、横方向に太いビットイメージを 表示しています。”out_data(=R20)”に0xF0、つまり0x11110000をセットしてサブルーチンを 呼び出していますが、サブルーチン内ではこの各ビットを左から順に取り出して画面に表示していきます。
- ちなみに1ビットあたり3クロック要するので、1バイト分表示するのに24クロック。それをサブルーチン側で 4回ずつ繰り返しているので、1色あたり96クロックかけて表示しています。4回繰り返しているので、 太い線が4本表示されます。
- その下の50本はビットイメージを0xCC、つまり0b11001100となり、少し狭い線が表示される ことになります。
- さらにその下50本は0xAA、つまり0b10101010となり、横1ドットあたり3クロックで 表示されます。一番細い線が表示されます。というか、この細さになると家庭用テレビのブラウン管解像度ギリギリ といった感じです。
- 最後に、1フィールド(1フレーム)262本となるようにブランクラインを表示してから先頭に戻ります。
というわけで、処理内容としてはたいしたものではありません。
サブルーチン内の処理についてもう少し補足
サブルーチン”COLOR_DRAW”について少し補足します。
このサブルーチンでは、メインルーチンから渡されたビットイメージについて1ビットずつ取り出して、 1ならそれを色コード(7から1に向かって変化します…つまり白から青へ)に、0なら黒にして、Bポート(B0、B1、B2)に 色コードを出力します。
動作確認後にソースを眺めてみたら、物凄く無駄な処理してますね。初期化で1回やっておけば済むような処理を、 毎回毎回処理してました。でもAVRは文句をいわず頑張ってくれてます。いいヤツです。
ま、解説しなくても出力画面を見れば容易に想像できるような単純な処理ですね。ビデオ信号なので、例によって 処理タイミングが厄介というだけで、それ以外は特に難しいところはなしです。
今後の拡張性
1ビット単位(3クロック@20MHz)で色ドットを自由自在にコントロールできたので、あとは その色ドットのイメージをデータ化しておけば、自由自在に色表示が出来ることがお判りいただけると思います。
今回はTINY2313というメモリの小さいマイコンを使ったのと、あくまでテストプログラムとして 作ったので、「絵を描いたり」するほどの凝ったことはしませんでしたが、マイコン内にカラービットマップを 蓄えておけば、カラーのお絵かきが簡単に出来てしまいます。スプライト表示をカラー化することも簡単ですね。
ちなみに、オペアンプの方はアナログRGB入力もOKに作ってあります。総天然色対応です。
今回コンポーネント表示が実現できたので、あとはCb、Cr信号に変調を掛けてSビデオのC信号に変換できれば、 コンポジットビデオ信号を生成できる目処が立ちます。CPLDやFPGAを使えば比較的簡単にできてしまう のでしょうが、なんとか使わずに実現したいと思っています。汎用ロジックICとかオペアンプとかで。一応 頭の中では目処が立っていますが、出来るだけ汎用性を持たせつつ、かつ少ない部品で…ということで模索中。
通常はCXA1645のような、RGB→コンポジット変換ICなどを使うのが一番簡単なのでしょうが、 この手のICはいつまで残っているか判りません。(店頭からどんどん消えていっているようです)
今回はRGB→コンポーネントまでというのが目的地でしたが、今後、CXA1645を使わずにコンポジット信号の 生成を行うところまで足を伸ばす予定です。こうご期待!
本当は、わざわざコンポジットにしちゃうよりもコンポーネントのまま表示した方が映像は綺麗なんですが、 コンポーネントだと録画に困るんですよね…
以上でこの工作を締めくくりたいと思います。