ベクターディスプレイの概要

この記事はこの記事の翻訳です。

私の翻訳があまりにも不器用ではないことを願っていますが、資料は興味深いものです。



今日、ベクトル表示は、情報を表示する手段よりも古い不思議である可能性が高いですが、それにもかかわらず、アーケードマシンやレーダーシステムでの使用は、特定の魅力を与えます。

ビームが毎回左から右、上から下に通過して各線を描く通常のラスターディスプレイとは異なり、ベクター表示では、画像を定義する線に沿ってビームが移動します。



ほとんどの2チャンネルオシロスコープにはXYモードがあり、時間内に画像をスイープするために使用される信号が入力信号に置き換えられるため、2つの平面でビームの位置を制御できます。 ローパスフィルターでPWMを使用すると、LEDの輝度を制御するのに効果的ですが、複雑な形状を描くには、より高速な方法が必要です。 最も簡単な方法は、R-2Rスキームに従ってDAC (デジタル-アナログコンバーター)を使用することです。



画像



ベクトル表示の作成や画面にオシロスコープを描画する方法について詳しく知りたい場合は、catへようこそ。



パラレルDAC R-2R



画像

8ビットDACは簡単に作成でき、チャンネルごとに16個の抵抗が必要です。 1%の許容誤差を持つ抵抗を使用することをお勧めしますが、5%も機能します。 抵抗がRの抵抗器が7個、抵抗が2 * Rの抵抗器が9個必要です。

この場合、0.5および1kΩの抵抗が使用されます。

コンバーターの概略図:



画像



オシロスコープの2つのチャンネルを制御するため、2つのDACが必要です。



それほど多くの部品をはんだ付けしたくない場合は、SIPパッケージで抵抗器アセンブリを使用するか、16ピンDIPパッケージでMC1408 / 1508(乗算DAC)などを使用できます。



このプロジェクトでは、ATMEGA32U4マイクロコントローラーをベースにしたボードを使用します。他のほとんどすべてのマイクロコントローラーを使用できます。主なことは、2つの8ピンポートがあり、ピンの状態を同時に変更できることです。



ポートPORTDおよびPORTBを使用します。



オシロスコープのセットアップ



画像

回路をはんだ付けした後、それをオシロスコープに接続し、XYモードにします。

安価なRigolでは、水平メニュー-タイムベースに移動して、XYモードを選択する必要があります。

残念ながら、液晶画面を備えた安価なデジタルオシロスコープは、図面のコンテキストではアナログのものよりも劣りますが、画面の不活性をシミュレートするデジタルフォスファーモードを備えているものもあります。



水平線と垂直線



画像



DACをマイクロコントローラーのポートに直接接続することにより、ポートに値を書き込むことでアナログ電圧を変更できます。 たとえば、2ボルトの信号を生成するには、値は256 * 2.0V / 5.0V == 102でなければなりません。



DDRB = 0xFF; PORTB = 102; //,    ,  2 
      
      







原則として、電圧の特定の値には関心がありません。出力電圧が0x00での0ボルトから0xFFでの5ボルトまで直線的に変化することが重要です。



オシロスコープは0〜5ボルトの範囲に設定し、各軸に合わせて調整する必要があります。

最初に試すべきことは、水平線と垂直線を描くことです。これは、ループを使用して、1つの変数を変更せずに行うことができます。 たとえば、水平線を描画する場合、Yの値は一定で、その逆も同様です。



 void line_vert( uint8_t x0, uint8_t y0, uint8_t w ) { PORTB = x0; PORTD = y0; for (uint8_t i = 0 ; i < w ; i++) PORTD++; } void line_horiz( uint8_t x0, uint8_t y0, uint8_t h ) { PORTB = x0; PORTD = y0; for (uint8_t i = 0 ; i < h ; i++) PORTB++; }
      
      







前の図のように、正方形を描くためのコード。



  line_vert(64, 64, 128); line_vert(196, 64, 128); line_horiz(64, 64, 128); line_horiz(64, 196, 128);
      
      







傾斜線



画像



この画像は、ベクトル表示の一般的なアーティファクトを示しています。線の始点と終点にある明るいドット。 この効果は、ポイントの発光の強度がそのポイントでビームが費やした時間に依存し、プログラムが新しいラインをロードするのに時間がかかるため、ビームが一箇所に少し長く残るために発生します。 この問題を解決するには、16ビット演算を使用するか、NOPを追加して、常に切り替えが同時に行われるようにします。



ここで、画面の焼損について言わなければなりません。



値が長時間変わらない場合、この場所のリンは色あせて別の色になります。 同じ画像を常に表示すると、画面が破損する可能性もあります。 マイクロコントローラーのファームウェアの実行中、ポートは通常Zモードに切り替わります。つまり、オシロスコープの入力にゼロが入力され、画面の隅にある明るいスポットの外観に反映されます。



点滅中は、輝度を下げるのが最適です。



斜めの線の描画は、垂直線または水平線の描画よりもはるかに複雑です。

理想的なオプションは、例えばSC200で行われるように、アナログ回路を使用して信号をスムーズに変更することです



他の問題では、代わりにBresenhamアルゴリズムを使用して線をポイントに分割できます。 このアルゴリズムを適用すると、画像にステップが現れますが、これは実装の単純さによって相殺されます。



 void line( uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1 ) { int dx, dy, sx, sy; if (x0 < x1) { dx = x1 - x0; sx = 1; } else { dx = x0 - x1; sx = -1; } if (y0 < y1) { dy = y1 - y0; sy = 1; } else { dy = y0 - y1; sy = -1; } int err = dx - dy; while (1) { PORTB = x0; PORTD = y0; if (x0 == x1 && y0 == y1) break; int e2 = 2 * err; if (e2 > -dy) { err = err - dy; x0 += sx; } if (e2 < dx) { err = err + dx; y0 += sy; } } }
      
      







フォント



画像



線の描き方を学んだ後、シンボルを描くことを妨げるものは何もありません。

Hershey Fontsライブラリをフォントとして使用すると便利です。

その中で、各キャラクターは32ポイント未満で構成されています。 ポイントのすべての座標は、シンボルの左下隅を基準にして配置され、値(-1、1)が満たされるまで接続されます。つまり、次のポイントにジャンプする必要があります。 輪郭は(0、0)の値を持つポイントで終了します。

番号1の例。



 typedef struct { int8_t x, y; } path_t; static const PROGMEM path_t digits[][32] = { [1] = { { 6,17}, { 8,18}, {11,21}, {11, 0}, }, };
      
      









画像では、接続されていない2点間の線が見えることがあります。これは、DACの電圧が瞬時に変化しないためです。 オシロスコープの輝度チャンネルを使用すると、この効果を修正できますが、残念ながら私のオシロスコープにはそのような機能がありません。



ビットマップ画像



画像

オシロスコープを使用して、ビットマップ画像も表示できます。

画像は、ImageMagickを使用して画像をXビットマップ形式に変換することにより取得されます。 Xビットマップは、画像を表すためのテキスト形式であり、ソースで直接使用できます。

 convert -resize 256x256 input.jpg image/image.xbm
      
      





その結果、8キロバイトのプログラムメモリを占有するモノクロ画像が表示されます。



映像



オシロスコープのベクトル時計

ビデオが表示されない場合は、 www.flickr.com / photos / osr / 7925036218 / in / set-72157631344809602で見つけることができます

今後の計画



画像

将来的には、素晴らしいCRTオシロスコープを復元し、PDP-1でSpacewarを移植する予定です。



All Articles