PIC AVR 工作室->TopPage->実験くん->マイコンでビデオオーバーレイ表示

マイコンでビデオオーバーレイ表示

ビデオオーバーレイとは

ビデオオーバーレイ。今更説明するほどのことではありませんが、ビデオ映像の上に描かれるテロップとか、 簡単に言うとああいうものです。テレビ画面の左上に表示される時刻表示などもオーバーレイの一種ですね。 スーパーインポーズなどとも呼ばれます。アレをマイコンでやっちゃおうっていうお話です。

元ネタはこのリンク先サイトです。 AVRのAT-MEGA8を使ってビデオオーバーレイ表示をしています。

以前AVRのTINY2313で背景表示器を作りましたが、実はこの背景表示器 の動作原理、上記サイトとほぼ同じ制御方法なんです。垂直同期と水平同期を入力してライン数をカウントしつつ、 白黒の映像信号を出力ピンに出すという仕組みです。なのでこの背景表示器のプログラムをそのまま流用すればビデオオーバーレイ表示が 出来るはずだろうと。ということで実験!

仕組みについて

オーバーレイ表示を行うためには、まずは「元となるビデオ信号に含まれている同期信号(垂直同期、水平同期の両信号)を検知」し、 そのタイミングに合わせて「映像信号を生成」し、それを「元の映像に重ね合わせる」という3つの機能が必要になります。

さて以前作った背景表示器ですが、まず1点目の「映像信号を生成」については言うまでも無く実現済みです。

2点目。「元となるビデオ信号に含まれている同期信号を検知」の機能についても一応実現済み。スプライト表示器と 背景表示器を作っていたとき、いずれビデオオーバーレイの実験を行おうと思っていたので、基本的には同期信号分離IC(LM1881)と ある程度似通った信号になるように作っていたのでした。 ただスプライト表示器がそもそもインターリーブ表示を行っていないとか、 限られたメモリサイズと処理時間内に押し込むため、出力する同期信号がLM1881とは少し波形が異なっています。 実際に実験したらどうなるのかが気になるところ。

そして3点目。生成したビデオ信号を元の映像に重ね合わせる」という点ですが、この点については上記の参考サイトの 合成回路が参考になります。なんと、合成に要する部品はダイオード1個+抵抗1個だけです。うーん、簡単!

というわけで、仕組み上必要となる3つの材料が揃いました。これらを使って上記サイトの回路図を参考に実験を行ってみました。

まずは実験の結果

先に実験結果を挙げておきます。ほぼ、思った通りの結果が得られました。

まず、オーバーレイしてみた映像のキャプチャー画像とムービーを挙げておきます。背景表示器から出力した レンガ模様がビデオ信号に重畳されている様子がお判りいただけるかと思います。たまたま流れていたCMが素材に なってます。

写真1

写真2

ムービー (クリックで再生します)

部分のズーム

という具合です。拡大図はJPEG画像から作ったのでいわゆるJPEGノイズがたくさんのっていますが、 映像自体の乱れや元映像への悪影響は出ていないことが見て取れるかと思います。

せっかくの動画なのにオーバーレイ表示がずっと変化がないのは単なる手抜きです。表示内容はリアルタイムで変化できます。

表示が少し上に片寄ってますが、そのお話は後で触れます。

実験材料

回路図

参考にしたサイトの回路を念頭に、今回使用した回路図はこんな感じです。(縮小表示しているので、別窓で拡大するか、 一旦保存してご覧ください。

TINY2313周りの電源回路やISP回路、クロック等は説明不要でしょう。ポイントとなるのはLM1881との 接続部分とビデオ信号への合成回路です。

なお、この回路はブレッドボード上に組みました。

プログラム

使用するプログラムは、以前作った背景表示器のものをそのまま 使います。厳密に言うと、この背景表示器は電源オン時には画面真っ暗状態に初期化しているため、UARTで 座標と表示キャラクターのコードを送らないといけません。

でもそのためにもう1個マイコンを繋ぐのが面倒だったので、初期化時にデフォルトで何か表示するように初期化用の キャラクターコードを修正しました(プログラム修正1箇所)。 このコードがキャプチャー画像にも写っているレンガ模様というわけです。

実験なのでひとまずこれでいい事にします。なお、UARTで接続しているマイコンが何もないので、 表示内容は初期化時から一切変化が生じません。まぁ、これはこれでいいことにします。

考察

同期信号周りについて

LM1881はビデオ信号を入力して垂直同期信号・複合同期信号を分離して出力します。この同期信号をTINY2313に接続してビデオ信号 とタイミングの同期を行うのに使っています。垂直同期はPD0に、複合同期はPD1に繋いでいますが、PD0、PD1は 共に外部ピンチェンジ割り込み機能のピンです。垂直同期の立ち下がりエッヂでINT0割り込み発生、複合同期の立ち上がりエッヂで INT1割り込み発生に設定しています。垂直同期の立下りでラインカウントを0にクリアし、複合同期の立ち上がりではラインを 1カウントアップしつつ、そのタイミングを基準に映像信号を出力しています。

スプライト表示器からは、複合同期信号の代わりに水平同期信号を出力しているのですが、このため垂直同期期間では ライン数のカウントが複合同期とずれてしまいます。

スプライト表示器及びLM1881それぞれから受け取る各同期信号のタイミングを漫画にしたものを 以下に纏めます。(縮小表示しているので、適宜拡大表示するか、保存して原寸でご覧ください)

薄い黄色がスプライト表示器からの同期信号、薄い水色がLM1881からの同期信号です。それぞれ赤い矢印のところで 割り込みが発生します。この図のように、垂直同期期間においてライン数のカウントがずれてしまいます。

背景表示器のプログラムは、ラインカウントが28になったら(割り込みが28回かかったら)絵を描き始めるように 組まれているため、LM1881のように垂直同期期間にもラインカウントを行ってしまうとより早く28ラインに達してしまい、 オーバーレイの絵は上にズレて表示することになります。

この28という数値を弄れば、表示位置は好きなところに変更が可能になります。(ただし内部のラインカウンタは 1バイト(0~255)で表現されているため、この範囲を超えてしまう場合はその点工夫が必要)

ビデオ信号とオーバーレイ信号の重畳について

ビデオ信号とオーバーレイ信号の重畳は、とても簡単な回路で組まれています。小信号用ダイオードと300Ω抵抗が各1個。

この簡単な部品構成でなぜオーバーレイの合成が出来てしまうのかを簡単に漫画にまとめてみます。

今回作った回路では、TINY2313から出た信号がダイオードと300Ωの抵抗を通してビデオ信号に接続されており、 その先ではテレビ(もしくはビデオ)内部に75Ωの抵抗を通してGNDに接地しています。

まずTINY2313からLOW(=0V)を出力することを考えてみます。TINY2313の出力ピンは0Vで、ビデオ映像の信号は 0V以上なので(真っ暗の映像でも0V)、ダイオードの向きと電圧を考慮するとTINY2313側からは電気は流れず、 またビデオ信号側からも電気は流れません。つまり、元のビデオ信号側とは絶縁(アイソレート)された状態と同じです。

次にTINY2313からHIGH(5V)を出力することを考えてみます。今度は電圧が高いのでTINY2313側から電気が 流れ出していきます。この際の流れるルートを辿ると、ダイオード→300Ω抵抗→75オーム抵抗→GNDとなります。

これを簡単に言い換えると、5Vの出力電圧がダイオードで0.7V電圧降下した後に、300Ωと75Ωで分圧した電圧が ビデオ信号ということになります。計算すると、(5V-0.7V)×75Ω/(300Ω+75Ω)=0.86Vとなり、 凡そ白信号の電圧に相当することが判ります。

最後にもう一つ気になるところがありますね。シンクロ信号の時のこの回路の働き方です。

シンクロ信号はGND以下の電圧(約-0.3V)になっているので、TINY2313が0Vの時にはシンクロ信号がTINY2313に 向かって流れ込みそうな気がしますよね。

ところがこの-0.3Vというのはシリコンダイオードの順方向電圧より小さいので、この程度の電圧では 電流が流れません。電流が流れなければ電圧降下も生じません。(もし仮に流れても、大部分はテレビ内の75Ω側(抵抗値が小さい方) に流れてしまい、電圧降下は微小だと思いますが)

というわけで、たった2個の部品ですが、とても上手く機能する回路だったということが分かります。

なお、参考にしたサイトの回路には、映像信号を部分的に薄暗くしてオーバーレイ信号を見やすくする機能も 登載されています。この機能の動作も、基本的な考え方は一緒です。ただ方向が逆になっているだけです。回路を見ると 部品構成は若干違っていますが、LOW(0V)の時には通電させて電圧を落とし、元の映像をそのまま出力する時には ピンのモードをHIGH-Z状態にする(アイソレートする)ことで実現しています。

プログラムでピンモードをHIGH-Z状態にしているためダイオードが使われていないのですが、 ダイオードを上図の逆方向に繋いでLOW(0V)orHIGH(5V)の出力によって制御することも可能です。 背景表示器にはこの信号を出力する機能がないので、今回の実験の対象外となっています。

まとめ

実験結果について

無事にビデオにオーバーレイが重畳して表示されることと、ラインカウントがスプライト表示器とLM1881で 差異が生じ映像が上方向にズレたというのは、当初の想定どおりでした。ひとまず想定どおりの結果が得られて満足 といったところです。

ちなみに、キャプチャー画像の拡大図を眺めてみると、白いオーバーレイ表示部分に、若干色が乗っているのが 見て取れます。これは、元のビデオ信号にオーバーレイ信号を置き換えたということではなく、元のビデオ信号に オーバーレイの白い信号が加わったことの現われのように思われます。

バースト信号自体は元のビデオ信号のままですし、バースト信号と同期が取れたC信号が残っていれば それがテレビ側のYC分離時にC信号(色信号)として扱われ、元の色相として再現。一方Y信号(輝度信号)は オーバーレイの信号が加わった分明るく(白っぽく)なっていると考えられます。

今回は、たった2個の部品でオーバーレイを行うことを念頭に実験したのでこれはこれでOKですが、 場合によってはC信号(を含む元のビデオ信号)を一切カットしたり、逆に少しだけ残しておきたいなどといった 要件によって使用する回路を取り替えて使う必要が有るかと思います。

なお、C信号を完全にカットするためには、ビデオ信号を接続/切断するためのちょっとした回路が必要に なりますがひとまず割愛します。

拡張性などについて

今後の拡張性という点では、一つには映像の一部を薄暗くしてオーバーレイ部分を見やすくする機能。 もう一つはカラー映像のオーバーレイを表示するということが考えられると思います。

映像の一部を薄暗くしてオーバーレイを見やすくするという方法については、上記で触れた方法で実現可能なので これは特に問題ないでしょう。

一筋縄で行かないのはカラー表示の方でしょうね。

コンポジットカラー信号の色相は、バースト信号と同期を取りこのバースト信号の延長の波に対して 位相がどの程度ずれているかによって表現されます。が、このタイミングをマイコンが受け取って処理するのは 精度的にほぼ不可能です。

というのは、バースト信号は約3.58MHzの波ですが、20MHz動作のマイコンに接続できる範囲では この4倍の14.318MHzのクリスタルを使うのがせいぜいでしょう。これは位相にすると90°ぶんに 相当します。つまり、バースト信号のタイミングをインプットできたとしてもクロックの分解能が90°ぶん しかないので、90°ぶんの範囲内で位相のズレが生じることが考えられるということです。

90°といえば、例えば青を表示したつもりがマゼンダ(というか殆ど赤)や殆ど緑に近い青緑に 変色してしまうレベルです。

色を付けること自体は無理ではないと思いますが、どんな環境でも正確な発色を行うということはほぼ無理です。

どんな環境でも同じ発色を得るためのいちばん安直な方法は、大きなフレームバッファを用意して、 そこにカラービデオ映像をバッファリングしておいて、デジタル信号上でオーバーレイを合成し出力するという 方法です。いわゆるデジタルTBCですね。…もはやTINY2313で出来る範囲では有りません。

つまり、マイコンだけでは綺麗な発色でオーバーレイを実現することは不可能だろうと思われます。

オーバーレイではなく、マイコン単体からカラーバースト信号+カラー映像信号を生成することは それほど困難ではないような気がしますが…

そういえば昔NJMかどこかのICで、8色カラーのオーバーレイをビデオ信号に重畳する便利なICが有ったと 思ったのですが、死蔵したっきりどこにいったのやら… 秋月で200円くらいで買ったと思ったのですが… あれを つかえばそれほど難しい話じゃない気がするんですが…

まとめ

マイコン1個でも、白黒信号のオーバーレイ表示は簡単。でもカラー表示は一筋縄ではいかないよ、という ことになるかと思います。

以上を以って、この実験を締めたいと思います。