ページ 11

シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年7月30日(土) 12:51
by RYOT
目的

こんにちは,初投稿させていただきます.よろしくお願いします.皆様の過去ログおよびこのサイトのドキュメント,いつも参考にさせていただ来ております.

私は今視覚研究用にDXライブラリを使用して画像を正確なタイミングで表示するアプリケーションを作成したいと思っています.
その際に画像の表示タイミングにあわせてTTLレベルのシグナルを外部PCおよびオシロスコープに出力したいのです (表示のタイミングで5~10msec程度Hレベルの出力をして欲しい).
シリアルポートから信号を出力できないか?と考えているのですがその方法が調べた限りではなかなかわかりません.

質問は

1. そもそもそのようなことがシリアルポートで可能なのでしょうか?
2. 可能ならば参考になるコード若しくはサイト,ライブラリを教示いただけませんでしょうか?

ということです.

環境は windows10, visual studio 2015 community です.DxライブラリとCppで開発しています.

Re: シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年7月30日(土) 21:00
by とけい
素人意見で恐縮ですが、
TTL=Transistor-transistor-logic、シリアルポート=COM(RS-232C)ポートの事で宜しければ、
電圧レベル変換治具を介して15V→3.3Vに変圧した上でシリアル通信してやれば、理屈上は実現できると思います。
治具はRS232C-TTLレベル変換基板などでググれば色々出てくると思います、既製品を買うのも良し、自作するのも良しかと。
(ただし、綺麗な波形が欲しければH/W的な試行錯誤が必要な気がします。)
シリアル通信もググれば色々出てきました(Visual Studio 2010ですが以下のサイトなどが参考になるかもしれません)。
http://morimori2008.web.fc2.com/content ... erial.html
ご参考まで。

Re: シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年7月31日(日) 13:56
by softya(ソフト屋)
私もハード系の専門家ではないですが、なるべく正確にとなると非常に難しいです。
1.DXLIB自体というかGPUが描画する仕組みで、DrawGraphと実際の描画には遅延が発生します。
2.ディスプレイに画像が表示されるタイミングも垂直同期するため遅延します。
3.パソコン液晶ディスプレイ自体に遅延があります。パソコン液晶ディスプレイの個体差が大きいです。
で、TTLレベルの信号ですが、容易なのはArduinoなどUSB接続のマイコンを使う方法ですが、USBなどで遅延が発生します。
RS-232C自体は珍しくなったので、そういうパソコンを探すのが困難です。
※プリンタ用のパラレルポートの方が制御は楽。これまた今のパソコンには付いてません。
USB接続のRS-232CはArduinoをつなぐのと実際は大差ない遅延が発生します。
などなど、いろいろ実測して遅延誤差をどう吸収するか考えないといけないと思います。
トリガ付きオシロなどで実測しましょう。画面は白い画面が表示されたら光センサでオシロで分かるようにするなど出来ると思います。

Re: シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年7月31日(日) 14:07
by softya(ソフト屋)
思いついたアイデアですが、画面の片隅に光センサを貼り付けてマイコン処理、画面片隅を黒から白くすることで「表示のタイミングで5~10msec程度Hレベルの出力をして欲しい」を実現するのが誤差的には楽に実現できそうです。ただ、16.6ms後にしか黒に戻せないので33ms周期よりは早い周期で動作は期待できません。
※ 120fpsなどのゲーム用の高速垂直同期の液晶ディスプレイを使えば高速化は可能。

Re: シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年8月01日(月) 11:50
by RYOT
皆様

早速の回答をいただきありがとうございます.

>> とけい さん
シリアルポート=COM(RS-232C)ポート で間違いありません.治具については簡単にですが準備できています.ありがとうございます.
ご提示のウェブサイト参考にさせていただきます.

>> softya さん
すいません,もう少し詳しく状況を書いた方が良かったのですが現状を追記させていただきます.

一応準備済のPCではRS232cがマザボから生えていますのでそちらを利用する予定です.
USB変換では,どの程度マザボ直結と比べて遅延が発生するのかご存じでしたら教えていただけると幸いです (将来確保出来なくなったときのため).

画面遅延については一応認識しています.
現状では画面左下にフレーム切り替えのたびにDrawboxで白黒を交互表示し,フォトダイオードを貼り付けておりそこからNIのDAQとオシロに取り込んでいます.
が,取り回しがよくない,画面端が使えないなどの問題となるべく汎用性を高めるために上記のような質問をさせていただきました.

考えていましたのは,
- シリアルから取り出したL->Hレベルになったタイミングと上記のようにして測った輝度変化のタイミングを事前に計測
- タイミング間の誤差(遅延)が小さいようだったらその遅延時間を考慮して解析
という過程です.

ですがご指摘のようにマイコン処理でフォトダイオードの出力を閾値処理してLかHにした方が正確かもしれません.参考にさせていただきます.

Re: シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年8月01日(月) 12:17
by softya(ソフト屋)
USBの遅延は、OS自体が引き起こす遅延とUSBと言う通信の仕組みが引き起こす遅延が複合的に起きます。
参考です。
http://www.dacs-giken.co.jp/USBspeedATN.html
固定的に決め打ちで遅延時間を決定するのは困難な仕様になっています。
こんだけ遅らせれば大丈夫かなみたいな使い方は困難でしょう。
拡張スロットに刺すデジタル入出力ボードのほうが正確性では有利かと思います。
参考例です。
http://www.contec.co.jp/product/device/digital/

それと描画の遅延は垂直同期が関係するための固定値の遅延時間に成らない場合も多いんじゃないかという懸念があります。
どれだけの誤差を許容できるかが仕組みを決める上で重要かと思います。
1.OS自体もいろんな処理で遅延原因になります。Windows自体がリアルタイムを保証したOSじゃありませんので。
2.垂直同期のタイミングとDrawGraph()のタイミングが完全には常に同一に保証されない。タスクのスイッチング特性などなど。ms台の誤差は当然あります。
3.液晶モニタ毎に遅延時間は違うので汎用性にはどうしても乏しくなります。
気になるのは、こんなところでしょうか。

Re: シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年8月03日(水) 01:28
by いーくん
> USB変換では,どの程度マザボ直結と比べて遅延が発生するのかご存じでしたら教えていただけると幸いです (将来確保出来なくなったときのため).

参考までに
FT232RLを使ったUSBシリアル変換器(今市販されているものは大体このタイプ)では、ミリセックオーダー~マイクロセックオーダーで遅延が発生します。
他にもAVRのATmega32u4(Arduinoに載ってることが多いUSB機能がついたAVRマイコン)もそれに近い遅延が出ることを確認していますが、こっちは、他にもタイマ・カウンタなどの割り込みを多用していたのでなんとも言いかねます。

悪まで参考までに

Re: シリアルポートから画像表示に同期してTTLを出したい

Posted: 2016年8月19日(金) 10:21
by RYOT
皆様,遅延の程度等についてご教示いただきありがとうございました.個人的には 10ミリ程度以下の誤差なら許容範囲でした.

ご教示いただいたライブラリでシリアルから信号を出力することはオシロで確認できました.
ちょっと任意の波形,長さの信号の出し方はまだよくわからないのですが (1000とかじゃなく0110100みたいになる) あとは僕の問題だと思いますので,一旦スレッドとしては解決にさせていただきたいと思います.
ありがとう御座いました.