自分自身のための ものづくり / 自分自身のためのものづくりメモ

* XRGB-2plusのドットクロックをファミコンに合わせる

#RGB #ファミコン
 スーパーモードを有効にして、DTC_TYP を[USER]に、USR_DTCを1023に設定。

 SCAN は [SVGA](47kHz) に設定しておく。VGA(31kHz)では、スキャンライン毎に表示されるドットがずれる。また、SVGAモードの方がPPUの動作に伴う(?)「縦線」ノイズが目立ちにくい。
(というか、XRGB-2plusの31kHzモードでやたら縦線ノイズが目立つ。サンプリング周期/2以上の周波数のノイズが突き抜けているのか? 出力がVGAかSVGAかで変わるのが謎だ。出力が違っても入力のサンプリングは変わらないだろうに…。)

http://nesdev.parodius.com/2C02%20technical%20reference.TXT
+---------------+
|PPU base timing|
+---------------+
(中略)
  • Pixels are rendered at the same rate as the base PPU clock. In other
words, 1 clock cycle= 1 pixel.

  • 341 PPU cc's make up the time of a typical scanline (or 341/3 CPU cc's).
341*3 = 1023

* Bad Apple!! PV-FC (2) がファミコン実機で映像が乱れる。原因は黒より暗い黒

#ファミコン
※最新版では問題は修正済

発端

Bad Apple!! PVをファミコンで再現してみた。(その2)
http://www.nicovideo.jp/watch/sm9170895
に感動した。
 エミュレータでの再生では満足できず、実機で再生するためにMMC3搭載カセットのROMを剥いでEP-ROMを載せたカセットを作成した。


事象

 RF接続した赤白ファミコン(HVC-001)では映像が乱れる。RP2C03を載せたRGB出力AV仕様ファミコン+XRGB-2plusでは乱れない。

↑MTV-2000にRF接続し、キャプチャ

調査とわかった事

 後期型ファミコンの裏蓋を外し、オシロスコープでPPUの出力を眺めた。その結果、映像の黒部分に、バースト直後の黒レベルよりも低いレベルの信号が出ていた。

↑はAV仕様ファミコン(無改造)の映像出力

黒より暗い黒

http://nesdev.parodius.com/2C02%20technical%20reference.TXT
+-----------------------+
|Video signal generation|
+-----------------------+
(中略)
Luminance value 0, mixed with chrominance value 13 yield a "blacker than 
black" pixel color. This super black pixel has an output voltage level close 
to the vertical/horizontal syncronization pulses. Because of this, some 
video monitors will display warped/distorted screens for games which use 
this color for black (Game Genie is the best example of this). Essentially 
what is happening is the video monitor's horizontal timing is compromised by 
what it thinks are extra syncronization pulses in the scanline. This is not 
damaging to the monitors which are effected by it, but use of the super 
black color should be avoided, due to the graphical distortion it causes.

 パレットについての関連参考資料。
ファミコンの詳しい話
http://www.wizforest.com/OldGood/FamiCom/FamiMisc.html

 Bad Apple!! PV-FC では、黒として 'Luminance value 0, mixed with chrominance value 13' つまり 0x0D を使っているのだろう。(未確認。VirturalNESのパレットビューアでは、どのパレットを使っているかが数値では表示されない)
 作者の門真なむさんは実機で動かしているが、RP2C05-99を積んだツインファミコンで動かしたために、普通のファミコンで映像が乱れる(モニタにもよるだろう)ことに気づかなかったのかな。

追記

 問題が出る環境はかなり限られている模様。悪条件に相当弱い機器でなければ、はっきりした問題にはならないのかも。
 うちでは、MTV-2000にRF接続でノイズだらけになる。(MTV-2000はノンスタンダード信号に弱いので、blacker than black 以前の問題もあるかも)LGの安物VHSビデオデッキにチューナが死んだテレビデオ(普通のテレビ放送でも同期外れがたまに出るほど、同期周りが弱い)にて、同期外れが頻発。

* Vista環境にて、PL-2303を使用したUSB接続COMポートで、TEXCELLのRubyシリアル通信ライブラリを用いてデータを受信できない。その原因と対処法

#プログラミング #Ruby #シリアルポート

事象

 Windows Vista の環境にて、USB接続のCOMポート(シリアルポート)を介して繋いだ機器のデータを、TEXCELLのRubyシリアル通信ライブラリ wincom.rb にて全く受信できない。teratermでは受信できる。。
 同じ接続対象機器・同じプログラムでも、レガシーな COM1 に繋いだならば受信できる。
 同じ接続対象機器・同じUSB接続シリアルポート・同じプログラムで、WindowsXP 環境では受信できる。

原因

 Vista環境にて、USB接続シリアルポートでは、ReadFileを実行した際、「読み取ったバイト数」として常にゼロが帰ってくるため。
 ドライバのバグか?

対処

 ReadFileの「読み取ったバイト数」は使わず、ClearCommErrorを実行した際に得られた COMSTAT構造体 の「受信バッファにあるデータのバイト数」を使う。
 ReadFileでそのバイト数読むと指示しているのだから、問題ない…と思う。問題あったとしても、常に0バイトよりはマシだ。
    def receive
(中略)
#                rcvchar = @wcrecv.unpack("a#{irlen[0]}")[0]
                rcvchar = @wcrecv.unpack("a#{ilen}")[0]

補足

 試したUSB接続シリアルポートアダプタは、以下2点。
 UC-232Aのドライバは、uc232a_windows_vista.rar (Ver._v1.0 2007-7-10)を使用。
 URS232GFは、Vista標準ドライバで利用できるとの事だが、できなかった。「URS232GFは一部ロットにて使用できません。」とのこと。チップ製造元であるProlificのサイトから、PL2303_Prolific_DriverInstaller_v10518.zip (2009/7/23 v1.0.5.18 )をダウンロードし、インストール。
 上記2点、チップ自体は同じか。ならば、ドライバもほぼ同一なのだろう。

あとがき

 今までTEXCELLのwincom.rbをありがたく便利なブラックボックスとして使わせて頂いていたのだが、中身を見て、色々と面倒な Win32API を隠蔽してくれていた事を実感した。今回必要に迫られてベールの下を覗いたけど、Win32APIは直接触らずに済むならそうしたい代物だ。


関連ページ

TEXCELL Rubyシリアル通信ライブラリ
http://www.texcell.co.jp/ruby/wincom/rubywincom.html

hirax.net::wincom.rbのCOM10以上対応
http://www.hirax.net/diaryweb/2009/07/29.html

Serial Communications in Win32
http://msdn.microsoft.com/en-us/library/ms810467.aspx

Windows/Vista/USB-RS232C(シリアル) - Tomocha WikiPlus
Windows Vista で動く、USB-RS232C変換ケーブル情報
http://wiki.tomocha.net/Windows_Vista_USB-RS232C.html

* Windows環境にて、USB接続COMポートを、個体識別する

#メモ #プログラミング #シリアルポート #Ruby
 Windows環境(少なくともWindows XP)では、USB接続のRS-232C(正確にはEIA-574)アダプタのCOMポート番号は、差すUSBポートを変えるとコロコロ変わる。COM19になったりCOM6になったり…。とても困る。
 一方、USB接続のその手の機器は、デバイスマネージャ上で個体識別できる。ならば当然、自作プログラムでも個体識別し、COMポート番号を自動設定できる。
 WMIを介して情報を得る。Win32_SerialPortではUSB接続の情報が得られない(場合が多い?)ので、Win32_PnPEntity からCOMポートを抜き出すのが確実。

require 'win32ole'

def ports
    locator = WIN32OLE.new("WbemScripting.SWbemLocator")
    services = locator.ConnectServer(".","root/cimv2")
    ports = services.ExecQuery "Select * From Win32_SerialPort"
    ports.each do |port|
        p port.Caption
        p port.Description
        print "\n"
    end
end

def ports_pnp
    ps = []
    locator = WIN32OLE.new("WbemScripting.SWbemLocator")
    services = locator.ConnectServer(".","root/cimv2")
    ports = services.ExecQuery "Select * From Win32_PnPEntity"
    ports.each do |port|
        if /\(COM\d+\)$/ =~ port.Caption
            p port.Caption
            p port.Description
            p port.Manufacturer
            print "\n"
        end
    end
end
   


print "Select * From Win32_SerialPort\n"
ports

print "Select * From Win32_PnPEntity\n"
ports_pnp

ruby -Ks comports.rb

Select * From Win32_SerialPort
"通信ポート (COM1)"
"通信ポート"

"通信ポート (COM2)"
"通信ポート"

Select * From Win32_PnPEntity
"Prolific USB-to-Serial Comm Port (COM19)"
"Prolific USB-to-Serial Comm Port"
"Prolific"

"USB-to-Serial Comm. Port (COM6)"
"USB-to-Serial Comm. Port"
"Aten"

"通信ポート (COM1)"
"通信ポート"
"(標準ポート)"

"通信ポート (COM2)"
"通信ポート"
"(標準ポート)"


参考文献:

Kick4 BBS
USBシリアルのポート名を知る方法?
http://www.kick4.net/bbs/c-board.cgi?cmd=ntr;tree=4;id=

Win32_SerialPort Class (Windows)
http://msdn.microsoft.com/en-us/library/aa394413(VS.85).aspx
Win32_PnPDevice Class (Windows)
http://msdn.microsoft.com/en-us/library/aa394352(VS.85).aspx

* MAX4018 高速オペアンプ 3回路・各Disable付き

#RGB #部品調達 #電子工作
MAX4012, MAX4016, MAX4018, MAX4020 低コスト、高速、レイルトゥレイル出力付き、単一電源オペアンプ
http://japan.maxim-ic.com/quick_view2.cfm/qv_pk/1753

 MAX4018は、3回路で各Disable付き。
 出力は、Rail-to-Rail。150Ω負荷時、VCC-V(OH), V(OL)-VEE、各0.30V(typ)。
 入力は、最小VEE-0.20, 最大VCC-2.25。

 チップワンストップでお手軽かつ安く買えるのが魅力。
#Digi-Keyだと、最低数量が100とか2500とかだ。RSオンラインでは扱ってなかった。

 1〜9個で@357, 10〜49個で@333
 QSOP(ピン間隔0.65mm)で基板作りと半田付けが大変なのが難か?
#でも、MSOP(1.27mm)のMAX4018ESD+は単価が高い(1〜@786, 10〜@612)ので、なんか悔しい。

* DSC-UE4.3GのHDD換装

#PC #PC-98
 IDEのHDDをSCSIに変換するSDATを搭載のDSC-UE4.3G…の殻をヤフオク経由で入手した。早速、手持ちの6.4GBのHDDを入れたら無事認識された。

 しかし、他のHDDに変えると認識しなかった。
 手持ちのHDDで試した結果は以下の通り。
○Quantum Fireball CR 6.4G
×SAMSUNG SV0844A
×DK-238A-43
×MK2103MAV

 情報を求めてWebを彷徨うと
DSC-UE3.2Gを改造する
http://www11.cds.ne.jp/~youkan/y2k700/DSC-UE32.html
に、以下の記述があった。
ATAコマンドのIDENTIFY DEVICEを投げているとおぼしきところから追っていくと、怪しい部分が2つ見つかりました。
・Multiword DMA Capability を見て Mode 2 supported でなければエラーとしている。ここで該当ビットを見るのではなく即値の 0x04 と比較しているが、ATAPI-6のスペックを読むと「Mode 2 supported なら Mode1,0 のビットも立ててね」と書いてあるような気がする。0x07を返すHDDだとまずいっぽい。
・HDDから取得した総セクタ数をあらかじめ用意したテーブルのデータと順次比較し、「総セクタ数以下で一番近い容量のエントリ」を選択している。このとき実際の総セクタ数と決めうちで持っているセクタ数の差が0x100000(≒537MB)以上あるとエラーになる。つまり、このファームウェアはあらかじめ決められた数パターンの容量(9.1G/8.3G/6.4G/4.3G/3.2G/2.1G/1.2G + 0〜0.5G)しかサポートしていないのであった。これが20Gでも4Gでもダメだった原因っぽい。

 8.4Gのも4.3Gのも2.1Gのもダメだったのは、最初の条件に当てはまったっぽい。
 Interface 2000年7月号の「ATA(IDE)/ATAPIの徹底活用研究」を見てみたところ、ビット0,1,2が「マルチワードDMAモード0をサポートする」「(ryモード1又はそれ以下をサポートする」「(ryモード2または(ry」だそうだ。

#同じ悩みの人用の検索ホイホイ:DSC-UE4.3G, DSC-UE4.3G, DSC-UE8.3G,

* 入力デバイス「ダイス」

http://slashdot.jp/comments.pl?sid=343019&cid=1070484
ダイスのハードウェアサポート… (スコア:1)
Nomad-AY (2520) のコメント: Wednesday December 06, @02:52PM (#1070484)
昔から思っていたんだけど、そろそろ入力デバイスとしてダイスが登場しても良いと思う。
専用シート上で良いから、振ると出目を認識してくれるってな感じで。
標準で 6面体が 2個付属。別途、(さまざまな色の)多面体ダイスが購入できると。

 いいな、それ。
 画像認識のならあるようだけど、できればダイス自体にセンサが欲しい。
 「ごきげんよう」のサイコロぐらいの大きさなら、加速度センサ+PDA+無線通信手段ぐらいは比較的簡単に収まるのでは無かろうか。

 いや、今なら、Wiiリモコンを詰め込むだけでハードウェアは完成か。なんせ、Bluetoothで通信できる3軸加速度センサだし。
…で、ふと思ったのだけど、どっかのソフトハウス、Wii対応すごろく型パーティゲームを作らない?もちろん、リモコン収納スペース付のウレタン製サイコロ付で。

#電子工作

* Windows+cygwinでMMC(とか)をダンプする


参考:
Life with Cygwin 3
http://www.okisoft.co.jp/esc/cygwin-3.html#3.5


$ cat /proc/partitions 
major minor #blocks name 
(略) 
8 96 7840 sdg 
8 97 7792 sdg1 

$ cat /dev/sdg > mmc8m.img 

$ dump < mmc8m.img | head -16 
00000000 fa33 c08e d0bc 007c 8bf4 5007 501f fbfc z3@.P<.|.tP.P.{| 
(略) 
00000080 55aa 75c7 8bf5 ea00 7c00 0049 6e76 616c U*uG.uj.|..Inval 
00000090 6964 2070 6172 7469 7469 6f6e 2074 6162 id partition tab 
000000a0 6c65 0045 7272 6f72 206c 6f61 6469 6e67 le.Error loading 
000000b0 206f 7065 7261 7469 6e67 2073 7973 7465 operating syste 
000000c0 6d00 4d69 7373 696e 6720 6f70 6572 6174 m.Missing operat 
000000d0 696e 6720 7379 7374 656d 0000 0000 0000 ing system...... 
000000e0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 

#電子工作 #MMC

* PC-98用光学マウスを作るために


 光学マウスに搭載されているセンサは、XYのAB相を出力しているのがある。
 手持ちの部品取りにとっておいたマウスの、PixArtのセンサPAN101 (PAN101BOI-204)
http://www.pixart.com.tw/productsditel.asp?ToPage=1&productclassify_id=1&productclassify2_id=16
にはそういう信号が出ているようだ。

…ってことは、PS/2とかUSBのチップを取り払って、9ピンのコネクタをつけて配線すれば、PC-9801用光学マウスの出来上がり?

#電子工作 #PC-98

* 読みやすいWebページを目指して


UI 設計の 5 世紀
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnwebtool/htm/ui5.asp
「何時間使っても疲れない自然なユーザー インターフェイスを持つアプリケーションを設計しました。実のところ、あまりにも透過性に優れているため、ユーザーの意識から『消えます』。まるでユーザー自身の脳の一部のようで、アプリケーションを使っていることさえ忘れてしまうほどです」

まるで UI 設計における聖杯のようじゃありませんか?私たちを仮想現実世界へと導く、あくまでも空想上の未来像だとお思いでしょうか。そう思っているとしたら、それは間違いです!私たちはみんな、これくらい自然な UI をほとんど毎日のように使っています。私たちはそれを「本」と呼んでいます。

#Web