09EC001 穴田 拓磨
テレビに接続するだけで家庭でもコンピュータゲームが遊べる、いわゆるTVゲーム機が世に生まれてから約40年、日進月歩の速度で発達するコンピュータを追いかけるように、ゲーム機もまた急速な進歩を続け、多くの子供や大人たちを楽しませてきた。 幼い頃の思い出に登場するファミリーコンピュータも、スペックを見ればCPUクロックは1.79MHz、RAMとVRAMはそれぞれ2kバイトと、現代のゲーム機やパソコンとはまさに天地ほどの開きがある。そのようなごく限られたスペックで作られた当時のゲームであるが、しかし現代でも娯楽として通用するソフトは数多く存在し、今でも多くの人が旧作に触れ、ゲームを楽しんでいる。 しかし8bitパソコンの頃から種処理を担うCPUと画面処理は分けられたハードウェアの設計が主流であり、任天堂のファミリーコンピュータなどの家庭用ゲーム機も、CPUとグラフィック処理は別になっていた。わずかな例外としてシンクレア社のZX81は主処理と画面処理を同一CPU上で行っていたが、そのために、CPUの負荷が高まると画面表示が乱れてしまうという欠点を持っていた。 近年のマイクロコントローラの普及により、マイコン工作に「1chipゲーム機」というジャンルが生まれた。これは数MHzのマイコンでゲームと画面処理を同時に行うというものである。 そこで、本研究ではArduinoを用いた1chipゲーム機の実現を目指し、その手始めとしてArduinoによる映像信号の生成と、ディスプレイへの出力を行い、その評価を行うのが目的である。
出力にはVGA端子を用いる。VGA端子は現在でもノートパソコンや外部ディスプレイなどの入出力端子として普及しており、比較的シンプルなアナログ信号による伝送を行う事が出来る。 実際に出力を行うプログラム及び出力回路の設計図はネット上で入手することが出来たが、VGA信号はデファクトスタンダードとして普及しているものの明確な規格が存在しないため、プログラムの発する信号が正しいものであるか評価する基準が無い。 入手したプログラムと設計図による回路から出力される信号と、一般的なノートパソコンから出力される信号とをオシロスコープによって測定、比較した。 また、より高精度な出力が得られる出力回路を設計し、既存の設計回路との信号特性の違いを比較した。
映像信号の出力には、パソコンの映像出力などで一般的に使われている規格であるVGA映像端子を利用する。 近年は映像出力にはDVIやHDMIを用いたデジタル伝送が一般的だが、アナログに比べ高速な信号切り換えが必要なデジタル伝送はArduinoの限られたCPUスペックでは対応が難しく、また出力回路も複雑になるため、今回のような試みには不向きであると判断した。 VGAでは信号の構造もシンプルなため、信号の測定・評価も容易になる。
Arduinoに書き込むプログラムについては、インターネット上で公開されていたVGA映像出力を行うプログラムをそのまま利用した。
ディスプレイに映像信号を入力するためにはArduinoの出力を信号規格へ合わせた電圧へ調整する電気回路が必要になるが、これについては上述のプログラムと併せて公開されていた回路と独自に設計した回路とを作成し、それぞれの特性の違いを比較した。
出力を行うマイコン部分にはArduinoを用いる。 Arduinoとは、AVRマイコンと入出力ポートを備えた基板と、プログラミングのための独自の言語を中心としたオープンソースのマイコン開発キットである。 用途に合わせ様々なボードが市販されているが、そのうち一般的であるArduino Uno R3を使用した。 Arduino Uno R3の簡単なスペックを以下に示す。
搭載マイコン | ATmega328 |
---|---|
動作電圧 | 5.0V |
デジタルI/Oピン | 14(内6箇所はPWM出力可) |
アナログ入力ピン | 6 |
1ピンあたりの最大電流 | 40mA |
フラッシュメモリ | 32KB |
CPUクロック速度 | 16MHz |
制作した装置によって出力するVGA映像信号について説明する。 VGA規格は、元々はIBMが1987年に発売したパソコンPS/2シリーズの映像出力端子として利用された後、様々なPCが互換する規格を利用したため一般的なパソコンの映像出力端子のデファクトスタンダードとして普及した。 そのためかVGA規格にははっきりと標準化された規格が存在しない。
端子にはミニD-Sub15とも呼ばれる 3列15ピンコネクタを利用する。ピン配置は以下のようになっている。 このうち実際に出力に用いるのはRGBの色信号と垂直・水平同期信号の5つで、これにGNDを加えた6本を用いて装置とディスプレイを接続する。
VGA規格では、垂直同期信号(V-Shync)、水平同期信号(H-Shync)と3色のビデオ信号(Video_R、Video_G、Video_B)の5つの信号によって画面を描画している。 垂直、水平同期信号によって画面上のどの位置に走査線があるかを示し、ビデオ信号がその位置のピクセルの持つ色成分を示す。
VGA映像信号が画面を描画する手順を簡単に説明する。 まず水平同期信号を合図として、走査線は一枚の画面の起点である画面の左上の角へ移動する。 続いて水平同期信号を合図に走査線は画面上を左端から右へ水平に移動し、それに同期してビデオ信号が一行分の色成分を発信する。次の水平同期信号を合図に走査線は一行下がり、画面左端から次の行の走査を始める。 これを繰り返し、画面右下の角へ到達すると、次の垂直同期信号が発信され、新たな画面の走査を始める。
垂直同期信号、水平同期信号はTTLレベルのデジタル信号、ビデオ信号は0.7Vを最大値、0Vを最低値とするアナログ信号である。
前述のようにVGA規格には規格に標準が存在しないため、作成した回路の妥当性を検討するためのお手本として、ノートPCから発信される映像信号をサンプルとして測定した。
接続の様子を以下に示す。 自作したVGAケーブルによってノートPCとディスプレイとを繋ぐ。 このときノートPCからは、(R,G,B)=(255,0,0)がスクリーン全面に映し出されるよう出力させている。 VGAケーブルは途中でブレッドボードを経由して接続され、ブレッドボードの任意の位置にオシロスコープのプローブを挿せるようになっている。
オシロスコープによって、垂直同期信号、水平同期信号、ビデオ信号のR成分の3つの信号に対し、最大電圧、最小電圧、パルス幅を測定する。 測定の結果は以下のようになった。
V-Shync | H-Shync | ビデオ信号 | |
---|---|---|---|
周期 | 16.66 ms | 20.66 μs | - |
電圧-Hi | 5.36 V | 4.76 V | 730 mV |
電圧-Lo | -120 mV | -120 mV | -180 mV |
パルス幅 | 124.1μs | 2.093μs | - |
VGA信号をArduinoから発信させ、正しい信号出力を得られるか実験する。 まず、インターネット上で公開されているNick Gammon氏のArduinoによるVGA映像出力の再現を行う。
Arduinoから出力を行うプログラムはNick Gammon氏のVGA出力プログラムを利用する。 このプログラムは、水平同期信号とビデオ信号の入出力する際の動作遅延、同期ズレを防ぐため、ポートレジスタの書き換えによって高速、同時のスイッチングを実現している。 このため、垂直同期信号端子と3色のビデオ信号端子は、同一ポート上(PORTD:デジタルピン0〜7)に配置される必要がある。
映像信号にはアナログの規格を使うが、実際の出力にはArduinoのデジタル出力端子を用いるため、実際に発信する信号はHi-Lowのデジタル信号である。
VGA規格において、垂直・水平同期信号はTTLレベルによるデジタル認識で信号の判断を行っている。つまり、ディスプレイの側では、およそ2.0V以上でHi、およそ0.8V未満でLowと認識し水平・垂直信号の有無を判断する。 上述のノートPCからの信号測定では、垂直、水平同期信号の電圧はおよそ5.0Vであった。 Arduinoのデジタル出力は5Vであるので、垂直同期信号、水平同期信号Arduinoの出力端子をそのままディスプレイへと接続する。
前述のように出力にはArduinoのデジタル出力端子を用いるため、ディスプレイには各色の端子ごとに0または最大値の2値を出力することになる。 従って2値^3色の計8色の表示が可能である。 RGBの色信号は最大で0.7Vなので、Arduinoのデジタル出力5.0Vを電気回路によって降圧し、0.7Vに降圧してディスプレイへと出力する必要がある。 Nick Gammon氏の作例では、ごく単純に、一本の抵抗器を通すことで電圧を0.7Vまで降下させる仕組みであった。
前述の回路から出力される信号をオシロスコープによって観察、測定する。 Arduinoと降圧回路をディスプレイに接続し、ディスプレイの表示と出力波形を観察する。
オシロスコープによって得られた測定値を以下に示す。
V-Shync | H-Shync | ビデオ信号 | |
---|---|---|---|
周期 | 16.62 ms | 31.96 μs | |
電圧-Hi | 5.30 V | 5.10 V | 670 mV |
電圧-Lo | -400 mV | -700 mV | 0.00 V |
パルス幅 | 64.16 μs | 3.999 μs |
垂直同期信号の周期16.62msより周波数は60.168Hzなので、 理論上のフレームレートの60Hzに対する誤差は次のようになる。
水平同期信号の周期31.96μsより周波数は31.29 kHzなので、 1フレームあたりに発せられる水平同期信号の数は最大で次の値になる。
このように規格とは異なる数値ではあるが、 ディスプレイに映った映像にブレや歪みは見られなかった。
VGA規格などのアナログ映像信号を伝送する場合、入出力のインピーダンスにズレがあると、回路内で伝送された信号が反射を起こし、映像が乱れる可能性がある。 そのためアナログ映像信号の伝送においては、出力回路の出力インピーダンスと映像装置の入力インピーダンス、伝送路である同軸ケーブルの伝送インピーダンスが一致していることが求められる。 しかし前述のNick Gammon氏の作例では、ビデオ信号の降圧は抵抗器一本を介して降圧する最低限の回路で構成されていて、ディスプレイの入力インピーダンスとのマッチングが考慮されていないため、本来映像出力回路としては不適である。 そこで、インピーダンスをより厳密にマッチングさせる降圧回路を新規に設計し、抵抗器のみの回路からの出力信号と新規設計回路の出力信号とを比較する。
Arduinoのビデオ信号出力の電圧をVGA規格に定められた0.7Vに降圧し、同時に75Ωの出力インピーダンスを実現するため、トランジスタを用いたエミッタフォロワ回路を作成した。 抵抗器を用いて5.0Vの出力を1.4Vへ分圧し、トランジスタの駆動により0.7Vの降下が起こることで、安定して0.7Vの出力を得る。
4.2.と同様の要領で、エミッタフォロワを用いた降圧回路による出力信号の観察、測定を行う。
オシロスコープによって得られた測定値を以下に示す。
V-Shync | H-Shync | ビデオ信号 | |
---|---|---|---|
周期 | 16.62 ms | 31.96 μs | |
電圧-Hi | 5.30 V | 5.40 V | 420 mV |
電圧-Lo | -400 mV | -700 mV | -150 mV |
パルス幅 | 64.25 μs | 3.999 μs |
垂直、水平同期信号については、実験1.と同一の回路であるため、ほぼ同じ値が得られた。
垂直同期信号の周期は誤差が0.28%、水平同期信号の周期は誤差が-0.95%。
ビデオ信号については次節で2つの回路の結果を比較する。
ディスプレイに表示される映像も、実験1との違いはわからなかった。
抵抗器のみによって出力した信号と、作成した降圧回路を用いて出力した信号とを比較し、回路の妥当性を検証する。 Arduinoと降圧回路をディスプレイに接続しディスプレイの表示と出力波形を観察する。
抵抗器のみの降圧回路とエミッタフォロワを用いた降圧回路、それぞれを用いてビデオ信号を出力した場合の信号波形を以下に示す。
抵抗器のみの 降圧回路 | エミッタフォロワ 降圧回路 | |
---|---|---|
電圧 Hi | 710 mV | 410 mV |
電圧 Lo | 10.0 mV | -140 mV |
最大値 | 959 mV | 490 mV |
オーバーシュート | 35.51 % | 14.56 % |
波形と測定結果からは大幅にノイズが低減できた事がわかるが、降圧回路を変えて観察してもディスプレイ上に映る映像にははっきりとわかる違いは見られなかった。 最大値である0.7Vを超えた値は、ディスプレイからはいずれも0.7Vとして認識されるため、デジタル8色表示で最大値のみを出力する場合、矩形波の上辺にノイズがあっても映像への影響は少ないと考えられる。 より細かいドットを表示したり、1ピクセルごとに高速で色を切り替えたりする場合には違いが出る可能性がある。
ArduinoはUSB給電の他に、電源端子にACアダプタを接続することによっても電源を得ることが出来る。 直流5.0Vが供給されるUSB端子と違い、ACアダプタを使用した場合は7〜12Vの直流電源を、基板上の3端子レギュレーターによって定電圧化することによってマイコンの電源を得ることになる。 これらの条件の違いによってノイズが発生するなどし、二つの降圧回路の性能の違いを見つけることが出来るかも知れないと考え、12VのACアダプタを電源ソースとした場合の、二つの回路の信号特性をそれぞれ調べた。
オシロスコープによる測定値を以下に示す。 なお、表6 は比較のため実験1、2の測定値を併記した。
USB電源 | ACアダプタ12V | ||||
---|---|---|---|---|---|
抵抗器のみ | エミッタフォロワ | 抵抗器のみ | エミッタフォロワ | ||
V-Shync | 周期 [ms] | 16.62 | 16.62 | 16.62 | 16.62 |
電圧-Hi [V] | 5.30 | 5.30 | 5.30 | 5.30 | |
電圧-Lo [mV] | -400 | -400 | -900 | -700 | |
パルス幅 [μs] | 64.16 | 64.25 | 64.50 | 64.32 | |
H-Shync | 周期 [μs] | 31.96 | 31.96 | 31.97 | 31.97 |
電圧-Hi [V] | 5.10 | 5.40 | 5.10 | 5.20 | |
電圧-Lo [mV] | -700 | -700 | -700 | -700 | |
パルス幅 [μs] | 3.999 | 3.999 | 3.997 | 3.995 | |
ビデオ信号 | 電圧-Hi [mV] | 680 | 420 | 700 | 400 |
電圧-Lo [mV | -10.0 | -150 | 10.0 | -120 | |
最大値 [mV] | 920 | 493 | 821 | 469 | |
最小値 [mV] | -196 | -349 | -278 | -492 |
ACアダプタを用いた場合の垂直同期信号の周期の誤差は0.28%。水平同期信号の周期の誤差は−0.98%。 どちらも十分小さな誤差であり、またUSB電源で駆動した時の値とも一致しているため、3端子レギュレーターによる電圧調整が正しく行われていることがわかる。
ビデオ信号も測定値では誤差は小さいが、オシロスコープで波形を観察すると、頻繁に激しいノイズ(図15赤丸部分)が走るのが確認できる。しかしディスプレイ上の映像の乱れは発見できなかった。
Nick Gammon氏の作例ではビデオ信号の降圧にたった一本の抵抗器を通すのみ、というきわめてシンプルな回路を使用していた。 これは映像信号の伝送には本来不適切な回路設計ではあるが、実際にはインピーダンスが一致するよう設計された回路を用いた場合と、ディスプレイ上に表示される映像にはほとんど違いは見られなかった。 映像出力信号としては本来不適切な回路設計であるが、ディスプレイ側のノイズ除去能力で十分対応できており、「最小限の回路構成で映像出力を実現する」、という点では極めて優れていると考えることも出来る。
対して新規に設計したエミッタフォロワを用いた降圧回路は、部品構成のシンプルさは失われたものの、ノイズの低減と同時に出力インピーダンスのマッチングという映像信号伝送における条件を満たしており、より高密度の映像の伝送や、劣悪な伝送環境下でも確実に映像信号を伝送できるものと考えられる。
Arduinoを用いてVGA映像信号の出力を行い、複数の出力回路に対して波形の観察と測定を行った。 Nick Gammon氏の回路と比較して、よりノイズの少ない出力が得られたが、実際にディスプレイ上に映る映像からは違いを見つけることは出来なかった。 今後、高速で変化する動画や、色数を増やす等、より高度な映像を伝送しようとすると、回路の性能差が実感できるようになるかもしれない。