オシロの画面から謹賀新年-2016 解説編
昨日の記事でオシロの画面に文字を表示させました。今回はどうやって画像を表示させたのか説明したいと思います。
▼全体はこうなっています

手前の右の青い基板はArduino UNOです。
▼回路図

左のArduino UNOからの信号の一部はCRなどを通して、右のオシロスコープに接続しています。
この回路ではR1を通してC1を充電しており、digitalの3ピンで強制放電させることでラスターの鋸歯状波を作っています。digitalの4ピンには輝度変調信号が出ているので、オシロのZ軸に接続、5ピンには同期信号が出ているのでトリガ信号として使います。なお、画像のフレーム間にすこしギャップを入れてあるので、うまくトリガを調整すれば同期信号無しでも表示出来ると思います。
以下、どのようにして表示しているか説明します。初心者の方でも判るように解説したいので、ベテランの方には退屈な話になる部分もありますがご容赦を。
▼ラスタースキャン波形

このように表示範囲全体を塗りつぶす波形がベースになります。このべったりと光っている部分をラスター波形、あるいは単にラスターと呼び、鋸歯状波形の繰り返しになっています。
なお、テレビのブラウン管はもっと沢山の線を使って細かい画像が表示するようになっています。またテレビの信号は上から下にスキャンしています。でも、オシロスコープは左から右に書く方が得意なので、横方向に書いていくことにします。
このラスターを輝度変調すれば画像を表示することが出来ることは予想できると思います。そのためにはArduinoのプログラムを書かないといけませんが、その前に画像のデーターを準備する必要があります。
▼画像データーの作成

こんな図を書いて、縦16ビット、横17ビットのビットマップとして定義しました。
▼プログラム
ポイントはTimer1ライブラリです。このライブラリで50μs毎に割り込みを発生させて、ピクセルクロックとして使うことで、信号のタイミングを合わせています。なおコンパイルにはTimerOneライブラリが必要です。
本当はピクセルクロックをもっと高速にしたいところです。でもArduinoはタイミングの粒度が4μsという制限などがあるので、これ以上高速で動かすのは難しそうです。
51~53行はフレームの間隔を空けるために時間稼ぎしているだけです。ここでデーターの配列の中身をいじれば、動画が表示出来るはずです。
普通にアナログオシロを使うなら話はここまでで終わりです。私はデジタルオシロを持っていないので、よく判らないのですが、Z軸入力があるデジタルオシロなら、たぶん同じように表示されると思います。
それと、もしアナログオシロでZ軸入力が無い場合は、CH-2にブランキング信号(Z軸信号)入れてチャンネル間のADD機能を使ってゲインなどを適切に調整すると、
▼チャンネル間ADD機能で表示

こんなふうに文字が表示されます。これはCH-1のラスター信号をCH-2に入れたブランキング信号で上に蹴っ飛ばしている状態です。上には蹴っ飛ばされた部分がネガポジ反転で表示されています。画面の外に思いっきり蹴っ飛ばせば、この記事の最初の写真のような表示にも出来るはずです。
なお、同じことをデジタルオシロでやると、蹴っ飛ばす途中の線も見えてしまって悲惨な画像になると思いますが、実際はどうなんでしょう。
ということで、長くなりましたが解説はこれで終わりです。オシロスコープは電気信号を表示する万能選手です。使い方はいろいろあるので、試してみると良い経験になると思います。
▼全体はこうなっています

手前の右の青い基板はArduino UNOです。
▼回路図

左のArduino UNOからの信号の一部はCRなどを通して、右のオシロスコープに接続しています。
この回路ではR1を通してC1を充電しており、digitalの3ピンで強制放電させることでラスターの鋸歯状波を作っています。digitalの4ピンには輝度変調信号が出ているので、オシロのZ軸に接続、5ピンには同期信号が出ているのでトリガ信号として使います。なお、画像のフレーム間にすこしギャップを入れてあるので、うまくトリガを調整すれば同期信号無しでも表示出来ると思います。
以下、どのようにして表示しているか説明します。初心者の方でも判るように解説したいので、ベテランの方には退屈な話になる部分もありますがご容赦を。
▼ラスタースキャン波形

このように表示範囲全体を塗りつぶす波形がベースになります。このべったりと光っている部分をラスター波形、あるいは単にラスターと呼び、鋸歯状波形の繰り返しになっています。
なお、テレビのブラウン管はもっと沢山の線を使って細かい画像が表示するようになっています。またテレビの信号は上から下にスキャンしています。でも、オシロスコープは左から右に書く方が得意なので、横方向に書いていくことにします。
このラスターを輝度変調すれば画像を表示することが出来ることは予想できると思います。そのためにはArduinoのプログラムを書かないといけませんが、その前に画像のデーターを準備する必要があります。
▼画像データーの作成

こんな図を書いて、縦16ビット、横17ビットのビットマップとして定義しました。
▼プログラム
/* オシロの画面にラスタースキャン方式で文字を書くこのプログラムを走らせて、オシロの時間軸と感度を調整すれば、画面に「元旦 2016」と表示されるはずです。
* 2016年正月用 2015/12/31
* ラジオペンチ http://radiopench.blog96.fc2.com/
*/
#include <TimerOne.h>
volatile boolean state = false;
int x, y;
unsigned int dispD[17] = {
0xF2C4, 0x9275, 0x921D, 0x9E05, 0x0005, 0xFE7D, 0x82C5, 0x8284,
0xFE00, 0x0080, 0x02BF, 0xFEA5, 0x00A5, 0xFEA5, 0x92A5, 0X92BF,
0xF280
}; // 表示パターン定義(16x17ビット,元旦 2016)
void setup() {
pinMode(2, OUTPUT); // ラスター波形 (ch-1)
pinMode(3, OUTPUT); // ブランキング信号 ( Z or ch-2)
pinMode(4, OUTPUT); // フレーム同期 (TRIG)
Timer1.initialize(50); // 割込みインターバル50μsで
Timer1.attachInterrupt(pixClock); // ピクセルクロック発生開始
}
void loop() {
digitalWrite(4, HIGH); // 同期信号ON
// ダミースキャンしてラスター開始位置を揃える
digitalWrite(2, HIGH); // ラスターのスイング開始
for (y = 0; y <= 15; y++) { // ダミースキャンしてラスター開始位置を揃える
syncPix();
}
digitalWrite(2, LOW); // ラスター戻し
syncPix(); // ラスターが戻るまで待つ
digitalWrite(4, LOW); // 同期信号OFF
// 本スキャン開始
for (x = 0; x <= 16; x++) {
for (int i = 0; i <= 1; i++) { // 横方向のドット水増しのため二度書き
digitalWrite(2, HIGH); // ラスターのスイング開始
for (y = 0; y <= 15; y++) {
digitalWrite(3, pixD(x, y)); // ブランキング信号で図形描画
syncPix(); // 1画素分の時間を待つ
}
digitalWrite(3, HIGH); // ブランキング
digitalWrite(2, LOW); // ラスター戻し
syncPix(); // ラスターが戻るまで待つ
}
}
for (int i = 0; i <= 400; i++) { // 後ろに適当にスペースを空ける
syncPix();
}
}
boolean pixD(unsigned int xx, unsigned int yy) { // 画像データーから該当ビットを取り出す
unsigned int bitP;
boolean ans;
bitP = 0x8000 >> yy;
ans = ! (dispD[xx] & bitP); // オシロはHIGHでブランキングするので反転
return ans;
}
void syncPix() {
while (state == false) { // ピクセルタイミング同期
}
state = false;
}
void pixClock() { // ピクセルクロック割込み処理
state = true;
}
ポイントはTimer1ライブラリです。このライブラリで50μs毎に割り込みを発生させて、ピクセルクロックとして使うことで、信号のタイミングを合わせています。なおコンパイルにはTimerOneライブラリが必要です。
本当はピクセルクロックをもっと高速にしたいところです。でもArduinoはタイミングの粒度が4μsという制限などがあるので、これ以上高速で動かすのは難しそうです。
51~53行はフレームの間隔を空けるために時間稼ぎしているだけです。ここでデーターの配列の中身をいじれば、動画が表示出来るはずです。
普通にアナログオシロを使うなら話はここまでで終わりです。私はデジタルオシロを持っていないので、よく判らないのですが、Z軸入力があるデジタルオシロなら、たぶん同じように表示されると思います。
それと、もしアナログオシロでZ軸入力が無い場合は、CH-2にブランキング信号(Z軸信号)入れてチャンネル間のADD機能を使ってゲインなどを適切に調整すると、
▼チャンネル間ADD機能で表示

こんなふうに文字が表示されます。これはCH-1のラスター信号をCH-2に入れたブランキング信号で上に蹴っ飛ばしている状態です。上には蹴っ飛ばされた部分がネガポジ反転で表示されています。画面の外に思いっきり蹴っ飛ばせば、この記事の最初の写真のような表示にも出来るはずです。
なお、同じことをデジタルオシロでやると、蹴っ飛ばす途中の線も見えてしまって悲惨な画像になると思いますが、実際はどうなんでしょう。
ということで、長くなりましたが解説はこれで終わりです。オシロスコープは電気信号を表示する万能選手です。使い方はいろいろあるので、試してみると良い経験になると思います。
- 関連記事
-
- Arduinoシリアル書き込みケーブルの製作(あちゃんでいいの用)
- あちゃんでいいのの製作と、ちょっと改造
- オシロの画面から謹賀新年-2016 解説編
- オシロの画面から謹賀新年-2016
- 小さな太陽電池でArduinoを連続運転する実験 その2