Arduinoを用いたVGA映像信号の出力

09EC001 穴田 拓磨

目次

  1. はじめに
  2. 準備
    1. Arduino
    2. VGA信号について
    3. 接続端子
    4. 信号規格
  3. 予備実験 - ノートパソコンからの出力信号の観察
    1. 接続図
    2. 測定
  4. 実験1. 既存研究の再現
    1. 構成
      1. プログラム
      2. 回路
        1. 垂直・水平同期信号(V-Shync、H-Shync)
        2. Video_R,G,B信号
    2. 測定 ― 抵抗器のみの回路による出力
    3. 測定結果1
  5. 実験2. 改良回路の検討
    1. エミッタフォロワ降圧回路
    2. 測定 ― エミッタフォロワ回路による出力
    3. 測定結果2
    4. 測定結果の比較
    5. 信号の比較
    6. 電源を変えた場合
    7. 測定結果3
    8. 考察
  6. まとめ
  7. 参考文献

1.はじめに

テレビに接続するだけで家庭でもコンピュータゲームが遊べる、いわゆる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の出力を信号規格へ合わせた電圧へ調整する電気回路が必要になるが、これについては上述のプログラムと併せて公開されていた回路と独自に設計した回路とを作成し、それぞれの特性の違いを比較した。

2.準備

2.1.Arduino

出力を行うマイコン部分にはArduinoを用いる。 Arduinoとは、AVRマイコンと入出力ポートを備えた基板と、プログラミングのための独自の言語を中心としたオープンソースのマイコン開発キットである。 用途に合わせ様々なボードが市販されているが、そのうち一般的であるArduino Uno R3を使用した。 Arduino Uno R3の簡単なスペックを以下に示す。

表 1 Arduino Uno R3 のスペック

搭載マイコンATmega328
動作電圧5.0V
デジタルI/Oピン14(内6箇所はPWM出力可)
アナログ入力ピン6
1ピンあたりの最大電流40mA
フラッシュメモリ32KB
CPUクロック速度16MHz

2.2.VGA信号について

制作した装置によって出力するVGA映像信号について説明する。 VGA規格は、元々はIBMが1987年に発売したパソコンPS/2シリーズの映像出力端子として利用された後、様々なPCが互換する規格を利用したため一般的なパソコンの映像出力端子のデファクトスタンダードとして普及した。 そのためかVGA規格にははっきりと標準化された規格が存在しない。

2.3.接続端子

端子にはミニD-Sub15とも呼ばれる 3列15ピンコネクタを利用する。ピン配置は以下のようになっている。 このうち実際に出力に用いるのはRGBの色信号と垂直・水平同期信号の5つで、これにGNDを加えた6本を用いて装置とディスプレイを接続する。

2.4.信号規格

VGA規格では、垂直同期信号(V-Shync)、水平同期信号(H-Shync)と3色のビデオ信号(Video_R、Video_G、Video_B)の5つの信号によって画面を描画している。 垂直、水平同期信号によって画面上のどの位置に走査線があるかを示し、ビデオ信号がその位置のピクセルの持つ色成分を示す。

VGA映像信号が画面を描画する手順を簡単に説明する。 まず水平同期信号を合図として、走査線は一枚の画面の起点である画面の左上の角へ移動する。 続いて水平同期信号を合図に走査線は画面上を左端から右へ水平に移動し、それに同期してビデオ信号が一行分の色成分を発信する。次の水平同期信号を合図に走査線は一行下がり、画面左端から次の行の走査を始める。 これを繰り返し、画面右下の角へ到達すると、次の垂直同期信号が発信され、新たな画面の走査を始める。

垂直同期信号、水平同期信号はTTLレベルのデジタル信号、ビデオ信号は0.7Vを最大値、0Vを最低値とするアナログ信号である。

図 2 VGA信号の概略

図 2 VGA信号の概略

3.予備実験 - ノートパソコンからの出力信号の観察

前述のようにVGA規格には規格に標準が存在しないため、作成した回路の妥当性を検討するためのお手本として、ノートPCから発信される映像信号をサンプルとして測定した。

3.1.接続図

接続の様子を以下に示す。 自作したVGAケーブルによってノートPCとディスプレイとを繋ぐ。 このときノートPCからは、(R,G,B)=(255,0,0)がスクリーン全面に映し出されるよう出力させている。 VGAケーブルは途中でブレッドボードを経由して接続され、ブレッドボードの任意の位置にオシロスコープのプローブを挿せるようになっている。

図 3 ノートPCからの信号の測定

図 3 ノートPCからの信号の測定

3.2.測定

オシロスコープによって、垂直同期信号、水平同期信号、ビデオ信号のR成分の3つの信号に対し、最大電圧、最小電圧、パルス幅を測定する。 測定の結果は以下のようになった。

表 2 ノートPCからの信号

V-ShyncH-Shyncビデオ信号
周期16.66 ms20.66 μs-
電圧-Hi5.36 V4.76 V730 mV
電圧-Lo-120 mV-120 mV-180 mV
パルス幅124.1μs2.093μs-

図 4 測定の様子 − ノートPCによる信号

図 4 測定の様子 − ノートPCによる信号

4.実験1. 既存研究の再現

VGA信号をArduinoから発信させ、正しい信号出力を得られるか実験する。 まず、インターネット上で公開されているNick Gammon氏のArduinoによるVGA映像出力の再現を行う。

4.1.構成

4.1.1.プログラム

Arduinoから出力を行うプログラムはNick Gammon氏のVGA出力プログラムを利用する。 このプログラムは、水平同期信号とビデオ信号の入出力する際の動作遅延、同期ズレを防ぐため、ポートレジスタの書き換えによって高速、同時のスイッチングを実現している。 このため、垂直同期信号端子と3色のビデオ信号端子は、同一ポート上(PORTD:デジタルピン0〜7)に配置される必要がある。

4.1.2.回路

映像信号にはアナログの規格を使うが、実際の出力にはArduinoのデジタル出力端子を用いるため、実際に発信する信号はHi-Lowのデジタル信号である。

4.1.2.1.垂直・水平同期信号(V-Shync、H-Shync)

VGA規格において、垂直・水平同期信号はTTLレベルによるデジタル認識で信号の判断を行っている。つまり、ディスプレイの側では、およそ2.0V以上でHi、およそ0.8V未満でLowと認識し水平・垂直信号の有無を判断する。 上述のノートPCからの信号測定では、垂直、水平同期信号の電圧はおよそ5.0Vであった。 Arduinoのデジタル出力は5Vであるので、垂直同期信号、水平同期信号Arduinoの出力端子をそのままディスプレイへと接続する。

4.1.2.2.Video_R,G,B信号

前述のように出力にはArduinoのデジタル出力端子を用いるため、ディスプレイには各色の端子ごとに0または最大値の2値を出力することになる。 従って2値^3色の計8色の表示が可能である。 RGBの色信号は最大で0.7Vなので、Arduinoのデジタル出力5.0Vを電気回路によって降圧し、0.7Vに降圧してディスプレイへと出力する必要がある。 Nick Gammon氏の作例では、ごく単純に、一本の抵抗器を通すことで電圧を0.7Vまで降下させる仕組みであった。

4.2.測定 - 抵抗器のみの回路による出力

前述の回路から出力される信号をオシロスコープによって観察、測定する。 Arduinoと降圧回路をディスプレイに接続し、ディスプレイの表示と出力波形を観察する。

図 5 Arduinoによる出力の測定 - ピン配置

図 5 Arduinoによる出力の測定 - ピン配置


図 6 Arduinoによる出力の測定 - 接続図

図 6 Arduinoによる出力の測定 - 接続図

図 7 測定の様子

図 7 測定の様子


4.3. 測定結果1

オシロスコープによって得られた測定値を以下に示す。

図 8 抵抗器のみで降圧した信号 - 同期信号

図 8 抵抗器のみで降圧した信号 - 同期信号


図 9抵抗器のみで降圧した信号 - ビデオ信号

図 9抵抗器のみで降圧した信号 - ビデオ信号


表 3 抵抗器のみによる降圧

V-ShyncH-Shyncビデオ信号
周期16.62 ms31.96 μs
電圧-Hi5.30 V5.10 V670 mV
電圧-Lo-400 mV-700 mV0.00 V
パルス幅64.16 μs3.999 μs

垂直同期信号の周期16.62msより周波数は60.168Hzなので、 理論上のフレームレートの60Hzに対する誤差は次のようになる。

( 60.168 − 60 ) ÷ 60 × 100 = 0.28 %

水平同期信号の周期31.96μsより周波数は31.29 kHzなので、 1フレームあたりに発せられる水平同期信号の数は最大で次の値になる。

31.29k ÷ 60.168 = 520.029 回

このように規格とは異なる数値ではあるが、 ディスプレイに映った映像にブレや歪みは見られなかった。

5. 実験2. 改良回路の検討

VGA規格などのアナログ映像信号を伝送する場合、入出力のインピーダンスにズレがあると、回路内で伝送された信号が反射を起こし、映像が乱れる可能性がある。 そのためアナログ映像信号の伝送においては、出力回路の出力インピーダンスと映像装置の入力インピーダンス、伝送路である同軸ケーブルの伝送インピーダンスが一致していることが求められる。 しかし前述のNick Gammon氏の作例では、ビデオ信号の降圧は抵抗器一本を介して降圧する最低限の回路で構成されていて、ディスプレイの入力インピーダンスとのマッチングが考慮されていないため、本来映像出力回路としては不適である。 そこで、インピーダンスをより厳密にマッチングさせる降圧回路を新規に設計し、抵抗器のみの回路からの出力信号と新規設計回路の出力信号とを比較する。

5.1.エミッタフォロワ降圧回路

Arduinoのビデオ信号出力の電圧をVGA規格に定められた0.7Vに降圧し、同時に75Ωの出力インピーダンスを実現するため、トランジスタを用いたエミッタフォロワ回路を作成した。 抵抗器を用いて5.0Vの出力を1.4Vへ分圧し、トランジスタの駆動により0.7Vの降下が起こることで、安定して0.7Vの出力を得る。

図 10 エミッタフォロワ回路

図 10 エミッタフォロワ回路


5.2.測定 - エミッタフォロワ回路による出力

4.2.と同様の要領で、エミッタフォロワを用いた降圧回路による出力信号の観察、測定を行う。

図 11 エミッタフォロワ降圧回路の信号測定

図 11 エミッタフォロワ降圧回路の信号測定


5.3.測定結果2

オシロスコープによって得られた測定値を以下に示す。

図 12エミッタフォロワ回路で降圧した信号 - ビデオ信号

図 12エミッタフォロワ回路で降圧した信号 - ビデオ信号


表 4 エミッタフォロワ回路による降圧

V-ShyncH-Shyncビデオ信号
周期16.62 ms31.96 μs
電圧-Hi5.30 V5.40 V420 mV
電圧-Lo-400 mV-700 mV-150 mV
パルス幅64.25 μs3.999 μs

垂直、水平同期信号については、実験1.と同一の回路であるため、ほぼ同じ値が得られた。

垂直同期信号の周期は誤差が0.28%、水平同期信号の周期は誤差が-0.95%。

ビデオ信号については次節で2つの回路の結果を比較する。

ディスプレイに表示される映像も、実験1との違いはわからなかった。

5.4.測定結果の比較

抵抗器のみによって出力した信号と、作成した降圧回路を用いて出力した信号とを比較し、回路の妥当性を検証する。 Arduinoと降圧回路をディスプレイに接続しディスプレイの表示と出力波形を観察する。

5.5.信号の比較

抵抗器のみの降圧回路とエミッタフォロワを用いた降圧回路、それぞれを用いてビデオ信号を出力した場合の信号波形を以下に示す。

図 13 二つの降圧回路の比較

図 13 二つの降圧回路の比較


表 5 ビデオ信号の測定結果の比較

抵抗器のみの
降圧回路
エミッタフォロワ
降圧回路
電圧 Hi710 mV410 mV
電圧 Lo10.0 mV-140 mV
最大値 959 mV490 mV
オーバーシュート35.51 %14.56 %

波形と測定結果からは大幅にノイズが低減できた事がわかるが、降圧回路を変えて観察してもディスプレイ上に映る映像にははっきりとわかる違いは見られなかった。 最大値である0.7Vを超えた値は、ディスプレイからはいずれも0.7Vとして認識されるため、デジタル8色表示で最大値のみを出力する場合、矩形波の上辺にノイズがあっても映像への影響は少ないと考えられる。 より細かいドットを表示したり、1ピクセルごとに高速で色を切り替えたりする場合には違いが出る可能性がある。

図 14 ディスプレイの表示

図 14 ディスプレイの表示


5.6.電源を変えた場合

ArduinoはUSB給電の他に、電源端子にACアダプタを接続することによっても電源を得ることが出来る。 直流5.0Vが供給されるUSB端子と違い、ACアダプタを使用した場合は7〜12Vの直流電源を、基板上の3端子レギュレーターによって定電圧化することによってマイコンの電源を得ることになる。 これらの条件の違いによってノイズが発生するなどし、二つの降圧回路の性能の違いを見つけることが出来るかも知れないと考え、12VのACアダプタを電源ソースとした場合の、二つの回路の信号特性をそれぞれ調べた。

5.7. 測定結果3

オシロスコープによる測定値を以下に示す。 なお、表6 は比較のため実験1、2の測定値を併記した。

図 15 12V ACアダプタを電源とした場合の出力(抵抗器のみによる降圧)

図 15 12V ACアダプタを電源とした場合の出力(抵抗器のみによる降圧)


表 6 ACアダプタを電源にした場合の比較

USB電源ACアダプタ12V
抵抗器のみエミッタフォロワ抵抗器のみエミッタフォロワ
V-Shync周期 [ms]16.6216.6216.6216.62
電圧-Hi [V]5.305.305.305.30
電圧-Lo [mV]-400-400-900-700
パルス幅 [μs]64.1664.2564.5064.32
H-Shync周期 [μs]31.9631.9631.9731.97
電圧-Hi [V]5.105.405.105.20
電圧-Lo [mV]-700-700-700-700
パルス幅 [μs]3.9993.9993.9973.995
ビデオ信号電圧-Hi [mV]680420700400
電圧-Lo [mV-10.0-15010.0-120
最大値 [mV]920493821469
最小値 [mV]-196-349-278-492

ACアダプタを用いた場合の垂直同期信号の周期の誤差は0.28%。水平同期信号の周期の誤差は−0.98%。 どちらも十分小さな誤差であり、またUSB電源で駆動した時の値とも一致しているため、3端子レギュレーターによる電圧調整が正しく行われていることがわかる。

ビデオ信号も測定値では誤差は小さいが、オシロスコープで波形を観察すると、頻繁に激しいノイズ(図15赤丸部分)が走るのが確認できる。しかしディスプレイ上の映像の乱れは発見できなかった。

5.8. 考察

Nick Gammon氏の作例ではビデオ信号の降圧にたった一本の抵抗器を通すのみ、というきわめてシンプルな回路を使用していた。 これは映像信号の伝送には本来不適切な回路設計ではあるが、実際にはインピーダンスが一致するよう設計された回路を用いた場合と、ディスプレイ上に表示される映像にはほとんど違いは見られなかった。 映像出力信号としては本来不適切な回路設計であるが、ディスプレイ側のノイズ除去能力で十分対応できており、「最小限の回路構成で映像出力を実現する」、という点では極めて優れていると考えることも出来る。

対して新規に設計したエミッタフォロワを用いた降圧回路は、部品構成のシンプルさは失われたものの、ノイズの低減と同時に出力インピーダンスのマッチングという映像信号伝送における条件を満たしており、より高密度の映像の伝送や、劣悪な伝送環境下でも確実に映像信号を伝送できるものと考えられる。

6. まとめ

Arduinoを用いてVGA映像信号の出力を行い、複数の出力回路に対して波形の観察と測定を行った。 Nick Gammon氏の回路と比較して、よりノイズの少ない出力が得られたが、実際にディスプレイ上に映る映像からは違いを見つけることは出来なかった。 今後、高速で変化する動画や、色数を増やす等、より高度な映像を伝送しようとすると、回路の性能差が実感できるようになるかもしれない。

7. 参考文献

  1. Turn your Uno into a VGA output device! - Arduino Forum , http://forum.arduino.cc/index.php?topic=102181.0.
  2. Arduino - ArduinoBoardUno , http://arduino.cc/en/Main/ArduinoBoardUno
  3. 出口 幹雄, "パソコン・モニタに直結!RGBビデオ出力!コントローラ型ゲーム機", トランジスタ技術, 2012年3月号, pp.171-178, 2012年3月
  4. 赤塚 博道, "トランジスタで構成する75Ωドライバ付き6dBビデオ・アンプ", トランジスタ技術,2004年1月号, PP.137, 2004年1月