「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



arduinoとLM1881を使って、ビデオオーバーレイ表示を
やってみようという実験の続き (↓これの続き)
http://brown.ap.teacup.com/nekosan0/249.html

ひとまず、74HC125(バッファIC)を通すことで
シンク/ソース電流に余裕を持たせてみたんですが、
やはり上手く行ってません。

arduinoの代わりにTINY2313でやってみると、やはり
上手く動くところをみると、74HC125バッファ自体は
きちんと動作している様子なのですが…

なんか悔しいので、不具合の原因の切り分けをもう少し
キッチリやってみようと思いました。
事前の実験によってソフト側の不具合ではないことは
判ったつもりだったのですが、74HC125を通しても
やはり上手く割り込みがかからないところをみると、
本当にソフト側のバグは無いのか?と気になってしまって…

で、スケッチを以下のようにちょっと修正し、
ラインカウントをシリアルでPC宛に送信するという
処理を挟み込み、ブレッドボードで実験をして
みました。
(スケッチ中の不等号と&記号は全角に変換してあります)

// arduino video overlay sketch
// with interrupt 0 (v sync)
// and interrupt 1 (c sync)
// output video signal on digital pin 4

#define video_out 4


volatile int line_no;

volatile char bitmap[12] = {0b00011000,0b01111000,
0b00100100,0b01000100,
0b00100100,0b01111000,
0b00111100,0b01000100,
0b01000010,0b01000010,
0b01000010,0b01111100};


void v_sync()
{
line_no = 0;
}


void c_sync()
{
int disp_line;
int char_location;
char bitmap1;
char bitmap2;
int i;
int n;
boolean bit_out[] = {LOW,HIGH};

line_no ++;

if((line_no >= 40) && (line_no <= 87)){

disp_line = (line_no - 40) / 8; //line no now display
char_location = disp_line;

bitmap1 = bitmap[char_location * 2]; //left bitmap for display
bitmap2 = bitmap[char_location * 2 + 1]; //right bitmap for display



n = 0;
for (i=7;i>-1;i--){
n = (bitmap1 >> i) && 1; //pick up 1bit for display
digitalWrite(video_out,bit_out[n]); //display a bit
}

digitalWrite(video_out, LOW); //display black

n = 0;
for (i=7;i>-1;i--){
n = (bitmap2 >> i) && 1; //pick up 1bit for display
digitalWrite(video_out,bit_out[n]); //display a bit
}
}

digitalWrite(video_out,LOW);

}



void setup()
{
Serial.begin(9600);
pinMode(video_out, OUTPUT); // set digital pin4 for output video signal
digitalWrite(video_out, LOW);

line_no = 0;

attachInterrupt(0, v_sync, RISING);
attachInterrupt(1, c_sync, RISING);
}

void loop()
{
Serial.println(line_no);
}


int0が立ち上がる時にv_sync関数が呼び出されて
ラインカウントが0クリアされます。
int1が立ち上がる時にc_sync関数が呼び出されて
ラインカウントがインクリメントされます。

で、int0、int1ともに抵抗を介してVccに繋いでおき
(常時HIGHレベル入力)、適宜int0端子、int1端子を
手でGNDとショートさせます(LOWレベル入力)。
ショートさせてから離した瞬間が立ち上がり波形
の入力となり、割り込みが発生するはずです。

で、これで散々弄ってみたんですが、思ったとおりに
ラインカウントがアップしたり0クリアしたりと
想定どおりの動作をしてくれます。

ところが、このスケッチでLM1881を繋いでみると、
やはり上手く動きません。ラインカウントはずーーっと
0のままです。
そしてTINY2313に繋ぎ換えるとちゃんと動きます。

うーん、ソフトではない。回路設計ではない、
部品の故障でもない。とすると、やっぱりデジタル3ピン
に繋がったLED用電流制限抵抗(470Ω)による
電圧上昇と、それによる弁別閾電圧との相性としか
思えないんだけどなぁ…

74HC125を通しても上手く動かないということを考慮
すると、470Ωの抵抗ではどんなICをつないでも
LOWレベルを入力させられないのでは?と
思えてしまいます… (TへT)

ひとまず、スケッチをこのままMEGA8用にコンパイル
してみたらエラー無く通ったので、この間作った
シリアル版MEGA8のarduinoで一旦実験してみたい
と思います。

MEGA8でもMEGA168でも、CPUコア自体は殆ど変わりが
無いので、MEGA8のシリアル版で動くなら、reduino-nano
のボードの仕様(限界)ということになるのでしょうか。

場合によっては、470Ωの抵抗を1kΩ程度に換えちゃう
っていう手も有るかな…
(LEDは薄暗くなっちゃうけど…)




コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




TINY2313でビデオのオーバーレイ表示が出来たので、
調子に乗ってarduinoでもオーバーレイが出来るだろう
と思って実験してみたんですが、意外な落とし穴が…

今回実験台に使ってみたarduinoはreduino-nano。
ブレッドボードで便利な細型タイプのほうが便利かと。

で、実際にやってみました。

TINY2313の時と同じように、LM1881のc-sync、v-syncを
int0、int1に入力するように繋いでみます。

LM1881と繋ぐ前には、スケッチがちゃんと機能するか
int0、int1に手動でパルスを入力してみてうまく動作
することの確認は出来ていたのでが、実機では上手く
動いてくれません。

ソフト側はちゃんと動いているようなので、
どうやら回路上の問題みたい…。

一生懸命回路の接続内容を見直したんですが、
おかしなところはやっぱり無し。

まてよarduinoのint1=デジタル3番にはLEDが
ボード上に載ってたなぁ、と。

Vccから抵抗を挟んでLEDがデジタル3番に
繋がっているので、言い換えればプルアップ
されているって事です。
それを踏まえてLM1881の電気特性を見直して見ます。

c-sync、h-syncの出力シンク電流は5mAと書いて
あります。ということは、あまり小さい抵抗で
たくさんの電流を流し込んでしまうと、あっという間に
LOW出力時の電圧が上昇しちゃうって事です。

繋がっている抵抗は470Ω。5V470Ωってことは、10mA
くらい流れこむわけですね…。アウトです。

そもそもLM1881の出力電圧って(バッファが入って
いないのかわかりませんが)LOW出力は高いし、
HIGH出力は低いみたい。
特にLOW側は電圧が上がりやすいみたいで、
I/F先でLOWと認識されなくなっちゃう恐れが
大きいです。

で実際、LED用の電流制限抵抗で電圧が上がって
しまい、LOWレベルと認識され無くなったようです。
上手く割り込みが発生しませんでした。

この回路をTINY2313に置き換えるとちゃんと画面に
オーバーレイされるということは、原因は
ここしか思いつかない…

だからと言って、arduinoの外部ピン割り込み
(attachInterrupt)で使えるのはint0とint1の
2つしかないし、しかもその2つとも必要になるので、
いかんともし難い状態です。

デジタル3はPWMの端子なので、reduino-nanoは
アナログ出力が標準で使えて便利だなぁと思って
いたのですが、LM1881のように出力バッファが
弱いICと繋ぐ場合にはその抵抗がプルアップ抵抗
としてはたらく事に注意が必要のようです。

うーん、この自作したシリアル版arduinoを
mega8からmega168に載せ換えて実験しなおして
みたいところ…。

もしかしたら、出力電流が大きく取れるような
バッファICでも挟めば上手く動くのかな?

スケッチはもう出来ているので、後で時間が出来たら
また挑戦してみます。



コメント ( 2 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




PIC Kit 2が秋月で4000円で販売を始めたようです。
量はそれほど多くは無さそうです。
ちなみに、赤ボタンバージョンのようです。

4000円はいいですねぇ…。

もっと早く出てくれていれば、「もどき」ではなく
本物を買っても500円くらいしか違わなかったのに…

まぁ、作ること自体は好きなので、それはそれで
いいのですが…

デバッグエクスプレス版も5800円だそうです。


「PICkit シリアルアナライザ」も同じくらいの
値段で売られていると嬉しいんですけどね。
秋月さん、是非入荷してください!! m(vv)m



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




ずいぶん前のブログの日記中に挙げていたお話。
http://brown.ap.teacup.com/nekosan0/113.html
↑TINY2313の背景表示器とLM1881を使って
ビデオオーバーレイ表示が出来るだろうと予想
していたんですが、ブレッドボードで回路を
組んでみました。

↓こんなんなりました。(≧v≦)σ

ビデオ信号に背景表示器からのビデオ信号が
重なって出ています。かなり簡単な回路で
実現できます!

カラービデオ映像の上に、「レンガ模様」が重畳
して表示されているのがわかるかと思います。

HDDレコーダーから出力されたビデオ信号を元に
LM1881で垂直、水平同期信号を取り出し、
この信号で2313のピン割り込みをかけて、割り込みを
トリガにビデオ信号を出力します。
出力したビデオ信号は、抵抗とダイオードを通して
元のビデオ信号に重畳します。

回路的にはこんな感じ↓。


ビデオ信号の線とLM1881を除くと、あとはクリスタル、
ISP端子、電源だけなので、複雑なところは特に
ありません。

ポイントになるのは、シンクロ信号の取りまわしと
ビデオ信号の重畳の仕方。
背景表示器は各シンクロ信号を入力することで動くの
ですが、これをLM1881で生成します。
映像信号は、LOW(=0V)の時はダイオードによって
アイソレートされ、HIGH(5V)の時は抵抗を
通してビデオ信号に電圧が掛かるという仕組みです。

http://www.viennawireless.org/balloon/hardware/overlay/index.php
この仕組みは参考にした↑このサイトに有った回路
の原理そのままなんですが、抵抗値は300Ωくらいが
一番自然な輝度という気がしました。(当社比)

UARTからキャラクターコードや座標を指定すれば、
任意のところにキャラクターが表示されます。

ただ、シンクロ信号はスプライト表示器からi/fされる
ものを前提としているため、ラインカウントの数が微妙に
狂っています。

これは垂直同期期間におけるV-SYNC、H-SYNC
の同期信号の出方の違いによるもので、V-SYNC
が入力されるとラインカウントをクリア、以降H-SYNC
を入力するたびにライン数が1upしていくという処理を
しているのですが、LM1881とスプライト表示器ではこの
タイミングがちょっとちがっています。
 →結果、レンガ模様が上に寄って表示される

ラインカウントの数え方を変えるだけで表示位置を簡単に
補整できるので、いざとなれば簡単に表示位置は調整
出来ます。

まぁ、今回は一つの実験なので、これはこれでいいことに
します。

ちなみに、参考にしたサイトにあった「ビデオ信号を
薄暗くしてオーバーレイ表示を見やすくする機能」
は実現してません。これに相当するような信号が
背景表示器には実装されていないので。

まぁ、いずれにしても簡単にオーバーレイ表示が
出来ることが判りました。

唯一の問題は、使うマイコン(AT-TINY2313)よりも
LM1881の方が高いということでしょうか。

LM1881の代わりにディスクリートで組めばもっと安上がり
になりそうですが、定数を決定するのに調整が大変そう…

後で纏めて「実験くん」のページにアップしておきたいと
思います。

(追記:実験くんのページに纏めました↓)
http://picavr.uunyan.com/experiment2_overlay.html



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




arduinoにPS2キーボードを繋いでみました。

http://www.arduino.cc/playground/Main/PS2Keyboard
↑Contributed Librariesにライブラリと接続図が
公開されています。が、一点注意が必要です。

PS2キーボードやマウスは、電源2本とデータ+
クロックの4本の線が必要なのですが、データ線と
クロック線にはプルアップ抵抗が必要です。
このページの接続図にはこのプルアップ抵抗が
抜けています。

プルアップ抵抗が抜けていると、大抵は動かなかったり、
仮に動いても不安定な動作になったりするかと思います。

PS2コネクタの信号線は双方向i/fのため、
基本的にはオープンドレインで接続し、信号の衝突時
にショートしないためです。詳しくは、PS2、
キーボード、プルアップ、などと検索してみてください。

さて、先日シリアル版arduinoを自作した際に、
PS2コネクタのアクセサリも作っていました。

暗くてちょっとわかりにくい写真ですが、ミニdin6ピン
の端子をブレッドボード用に一列の配列に変換します。

ここにPS2キーボードを差し込んで配線し、先ほどの
プルアップ抵抗(今回は1kΩを使用)を差して、
以下のスケッチを実行。(サンプルスケッチを元にして
ちょっとだけ手を加えたものです)
例によって、半角不等号と&マークは全角に置き換えて
あるので、適宜半角に戻して使ってください。

#include <PS2Keyboard.h>

#define DATA_PIN 4
PS2Keyboard keyboard;

void setup() {
keyboard.begin(DATA_PIN);

Serial.begin(9600);
Serial.println("hi");
delay(1000);
}

void loop() {
if(keyboard.available()) {
byte dat = keyboard.read();
byte val = dat - '0';

if(val >= 0 && val <= 9) {
Serial.print(val, DEC);
} else if(dat == PS2_KC_ENTER) {
Serial.println();
} else if(dat == PS2_KC_ESC) {
Serial.println("[ESC]");
}
Serial.print(" ");
Serial.println(dat,HEX);
}
}

テンキーの数字かエスケープキーを押したときは
その内容とコード値を、その他のキーの場合は
コード値だけを表示するようになっています。

スクリーンショットはこんな感じ。


エスケープと数字の1~3を押してみた所です。

簡単なスケッチですし、ライブラリ自体にもそれほど
の機能はないみたいなので、capsロックLEDや
numロックLEDなどはキーを押しても光りません。
(機能は有効になるようです)

帰ってくるコードは、各キーのスキャンコードではなくて、
asciiコードっぽいです。
ライブラリの中身を読んだわけではないので詳しくは
判りませんが、日本語106キーボードの場合ちゃんと
コード変換が行われるのかは疑問です。

まあ、込み入った用途ではなく、少ない接続線で繋がる
簡単な入力デバイスとして使うには簡単で便利。

ちなみに、データ線は好きなところに割り当てられますが、
クロック線はハードウェアピン立下り割り込みを利用
しており、デジタル3番が固定的に割り当てられています。

この3番ピン以外で使いたい場合、ライブラリソースに
修正を加える必要があります。
その際、信号の立下りで割り込みがかかるピンを
選ばないとなりません。

ちなみに、キーボードはUSB/PS2兼用のもの
(変換コネクタ付属)を使ったのですが、普通に
つながりました。

playgroundにマウス用のライブラリもあるみたいなので、
そのうち試してみたいと思います。
http://www.arduino.cc/playground/ComponentLib/Ps2mouse




コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする



« 前ページ