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

* シリアルマウス

PC mouse info
http://www.tkk.fi/Misc/Electronics/then/mytexts/mouse.html
更新:リンク変更

PIC K iT PS/2⇔シリアル マウスインターフェイス
http://members.jcom.home.ne.jp/irv/documents/sermouse/0511123_SirialMouse_manualB0.pdf
スクロールマウスのデータフォーマットの情報あり。その他にも色々参考になる。


 比較的簡単なハードウェアとソフトウェアでWindows機(等)にマウス扱いされる自作ハードを繋げるのは魅力だが、Windows2000, XPでは電源ON時にしか認識されない(?)等、微妙に面倒が多いのが難点。
 あと、近頃はシリアルポート搭載率が減少傾向。USB<->シリアル変換はシリアルマウスには対応していないのが多い。

#電子工作

* 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

* ナンバーディスプレイ対応モデム

#途中経過 #ナンバーディスプレイ
 ナンバーディスプレイ対応モデムにて、電話番号を表示させてみた。

参考ページ

X68K.NET: Admin Diary.
2004年04月13日(火)
#1 [NET][ISP][VoIP][NTT] アナログモデムdeナンバーディスプレイ(IP電話)
http://x68k.net/diary/?200404b&to=200404130#200404130

結果

  • 正式にナンバーディスプレイ対応を謳うMRV56PCにて、電話番号が表示された。
  • TO-BXF56Kは、"AT#CID?"等に反応したが、着信時に番号は表示されなかった。
  • USB-DM560は、"AT#CID?"等にERRORを返した。
  • VAIO PCG-XR1G内蔵モデムは、"AT#CID?"等にERRORを返した。

条件

  • OSはWindowsXP
  • ハイパーターミナルにて対応するCOMポートに接続
  • ナンバーディスプレイ対応疑似交換機(インターフェース社製 IF-101)を介して接続した電話機より発呼した。

ATコマンドへの応答など

(ReadMore...)

* スクロール専用USB接続「ホイール」

#電子工作 #途中経過
 故障した2.5インチHDDを部品として、USB接続マウスの回路を流用し、スクロール専用のUSB接続「ホイール」を作成した。
 ぐるぐると回してスクロールさせる操作感はとても気持ちいいのだが、使いどころは限られる。Picasaとの相性は抜群。特に、タイムライン表示をぐるぐる回すのはとても気持ちいい。


 スクロール専用なので、マウス(等)と併用する。

(ReadMore...)

* 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

* 画面に十字線を引く

 基板の穴開け補助に必要だったので、やっつけで製作。HSP3用。

 スーパーインポーズできるMSXとかよりも、ビデオキャプチャカード搭載のWindowsマシンの方が多いだろう。カメラを斜めに配置することによる縦横比のゆがみを、ウィンドウをリサイズすることで簡単に補正できるのが魅力。

 カーソルキーで位置を移動。Enterを押しながらだと高速移動。
 作業に使うには、USB接続のテンキーを繋ぐと便利。
(ReadMore...)

* USBマウスを改造してお手軽にUSB接続機器を作る実験


 ヤフオクを介して入手したエンコーダを、テストを兼ねてUSB接続のマウスに繋いでみた。
 マウスはジャンクとして300円ぐらいで購入したもの。ホイール付ではなかったが内部にはホイール用のパターンがあった。ホイール用エンコーダが繋がるとおぼしきところにエンコーダのA,B相を繋いだら、あっさりホイールとして機能した。

#電子工作 #途中経過