PIC24 を使った usb マウス to ps/2 変換 プログラム

自宅のパソコンの切り替え機が、PS/2 対応なので、ずっと PS/2 マウス・キーボードを使っていますが。
その、PS/2 マウスが具合が悪いので、新しいマウスに買い替えたいと常々思っていたのですが、
生憎、近頃はPCショップで気の利いた、PS/2 マウスを見かけません。

なので、試しに USBマウス to PS/2 変換アダプターなるものを、購入して USBマウスで試してみたのですが、やっぱり、うんともすんとも動きません。残念!
そこらへんで売っている USB マウス PS/2変換アダプターは、USBにしか対応していないマウスには使えないとの事です。(どうやらコンボマウスとか言うマウスでないと...と最近判明)

このUSB マウス PS/2変換アダプターが、又曲者で、中にICチップの1も入っていなくて、単に配線しているだけの代物の様です。

PIC24_USB_Mouse_to_PS2_Converter_Etching_Borad_2017.10.5-1l.jpg

そこで、無いものは自分でつくろうと、思って、

最初は、Arduinoでできないかインターネットで調べてみましたが、
どうやら、USB-HOST機能が組み込まれていないと無理だとわかりました。
そこで他に使えるマイコンを色々探してみたら、Microchip の PIC24F、PIC32-MX 等が使えることがわかりました。
この時点ではPICとは、何者ぞと言う状態でしたが。

そこで、PICに関する情報を色々読んでみて、今回が初めてでしたが、PIC24FJ64GB002を使う事にしました。
まずは、PIC24 のプログラムを一から勉強を始めて。LEDチカチカ、USB-Serial通信でのPC上のシリアル端末に確認表示ができるように迄しました。
そのあと、いよいよ本題のPIC24F での USB Host での USBマウスの接続プログラムと、
PS/2 接続よる端末側のエミュレーションプログラムをやっとの思いで作ってみました。

作ったと言っても USB-HOST エミュレーションは、Microchip の MLA のUSB HOSTのhid_mouseのサンプルの流用だったり、PS/2 のデバイスエミュレーションは、ArduinoのPlayGroundで公開されているps/2 mouse を参考にしましたが。

開発の苦労話は、下の方の、開発の後書き に書きました。

結構、色々な問題をクリアしての出来上がりだったので、最後は本当に、ほっとしました。

今は、まだブレッドボード上での確認ですが、ブレッドボードにPIC24F の必要最低限の回路と USB のメス側端子、PS/2 のオス側の端子を結線しました。


USB のメス側には、当然 USB マウスをつなげます。
PS/2の端子には、本来であれば、PC の PS/2端子を接続ですが、此処は、Arduino に PS/2 ホストエミュレートプログラムを書き込んで、Arduino を PS/2 HOSTに見立てて、さらに、Arduino には、 USB-Serial で PCとつなげてPCのターミナルから、PIC24F につなげたUSBマウスからのデータを確認できる環境をこしらえました。

以上の開発環境で、最近やっと、PICにつなげたUSBマウスをグリグリしてそのデータを Arduino 経由で PCのターミナルで見れるようになりました。

やれやれでした。

後は、プログラムを完成させて、小さめのユニバーサル基盤に回路、USB端子とPS/2ケーブル(オス)をそれぞれ結線した後は。
実際に自宅のKVMに接続して、自分でしばらく使ってみようかとおもっちょります。

その後は、このプログラムを書き込んだ PIC24FJ64GB002 のみを単体で販売でもしようかなと考えちょります。

いずれ、時間をみて今回の簡単な回路図、ブレッドボードで配線した写真でも掲載しようかなと考えちょります。YouTubeに動画も載せられたらのせたいです。コッホ!

最後に一言。
このPS/2通信のプログラムを作って思ったのですが、PS/2 と言えば兎角マウス、キーボードしか思い浮かびませんが、物理層、データリンク層だけを見れば、実に軽量、シンプルで、他のI2C,SPIの様な専用モジュールを内蔵してなくても出来ます。その上の通信レイヤーを、マウス、キーボード以外に独自で作れば、PICやArduino と装置との通信に簡単に利用できると思いました。
只し、接続が1対1 なので、1対他の構成には、KVMの様な切り替え器を自分で作るなどの工夫が必要かもしれませんが。

2017.2.12
まだブレッドボードの状態ですが、CenOS7 のPC に実際につなげて動くようになりました。
電源は、まだ消費電力を確認していないので、HOSTのPS/2 からのVCCラインは使わずに、PIC24には、別のWindows10 につなげた、USB-Serial から供給をしています。
実際、つなげてみて、気が付いた点が、2、3ありました。
CentOS7 の PS/2 Mouseドライバーは、初期化シーケンスの途中に、Reset(0xff) コマンドを出して、それへのDeviceの返事として、
0xAA Self-test passed
0x00 Mouse ID
を返すのですが、その 0x00 Mouse ID を受け取らないで、
sample rate(0xf3) を送ってくるシーケンスになっていたので、そこで、1件つまずきましたが、それへの対応をすれば、後は、すんなり動きました。
あと、Y軸と、Wheel の移動値が上下逆でした。

2017.2.14
WindowsXP のPCでも旨く動きました。
WindowsXPのPS/2 Mouseの初期化シーケンスは、本当にシンプルでした。CentOS7とは、雲泥の差がありました。
KVM接続の、Windows10 のPCは、うんともすんとも反応しません。
原因は、KVMにあるのか、PCにあるのか、これから切り分けしないといけません。

2017.2.16
KVM 接続の Windows10 のPCでもなんとか、動くようになりました。
でも、まだ、インテリマウスの5ボタンを認識できていません。Device から インテリマウスの5ボタンのID(0x04)を返しても、無視してリセット(0xFF)を送ってきます。
Windows10 につなげている、USB - > ps/2 変換ケーブルが変な処理をしているのか?

CnetOS7,WindowsXP の時とは違って、手こずりました。
Host からのコマンドへのレスポンスを返す待ち時間が本当に少なくて、直ぐ同じコマンドを再送してくるので、手を焼きました。なんでそんなに待てないのか理解に苦しみます。
CnetOS7,WindowsXPのPS/2マウスドライバーは、そんな事ないのに。

なんか節操が無いプログラムを組み込んでいる気がします。作った人間の性格なのか?
あとで、Windows10 のPCに PS/2 スプリッター(こういう物があるのを、今日まで知りませんでした)ケーブルをつけて、直接 Windows10 の PS/2 マウスドライバーで試してみようかと思っています。

2017.2.18
自宅の KVM で、PCを切り替えての確認もできました。
2017.2.16 の Device ID 5ボタン(0x04) を受け取らないのは、KVM のようです。
また、すぐ再送要求をだすのも、KVM のようです。

結局、自宅のKVMでは、5ボタンのUSBマウスが使えないです。非常に残念!
最近の5ボタンのUSBマウスが使い勝手がよくて、気に入っていましたが、スクロールで我慢するしか仕方がないようです。
あとは、簡単な基盤を作って、それで、実際に日々の作業で使って行きたいです。

2017.2.24
Eagle と言う基板パターンを作成するソフトがあるようなので、それで、ユニバーサル基板に配線パターンを書いてみました。
Eagle の使い方は、ツール・ラボさんのページ を参考にさせてもらいました。大変助かりました。この場を借りてお礼申し上げます。

開発に関して。

下記は、今回の PIC24 を使った usb マウス to ps/2 変換 プログラム の 回路図です。
PIC24F_USB_Mouse_to_PS2_Converter_Circuit_2017.10.2.png

下記は、同じく今回の PIC24 を使った usb マウス to ps/2 変換 プログラム の 基板パターンです。
PIC24_USB_Mouse_to_PS2_Converter_Borad_2017.10.2.png

開発の後書き

但し、流用とは言っても結構大変でぃ。
MLAのサンプルは、外付けのクリスタル使用だったのをPIC内臓発振器にかえたり、PS/2 との接続に5Vを使うのに、PIC24Fは、基本 3.3V なので、PICの該当ピンをオープンコレクターにしてPULL UP をつけて5Vにして使用する事が、最初全く知らなかったり。
またそのピン(RB8)が、I2Cのモジュールがデフォルトでつながっているのか、これをコンフィグで別のピンに逃がしても、これが影響しているのか、オープンコレクターで、入力モードにしても、Highインピーダンスにならない(RB7 の方は問題ないのに)。

やはり悪さをしているのかと思い、PS/2 のクロックをRB8 から RB5 に替えたら、PS/2側のプログラム単体では、うまくい行ったのが。
今度は、USB側のプログラムと連動させた時点で、USB OTGを切っているのに、RB5 に USB OTGの divice select の2.5Vみたいなのがでてきて ( これが、PIC24Fでは、切るレジスターが無い、PIC32では、追加されている様だが ) うまくいかない。

再度、PS/2 のクロックをRB8 にもどして、入力モード(Highインピーダンス) にしないで、Arduino 側のピンの信号のHig,Lowを読み取る方法を実際に、一個々連動させて、確認しながら探ったり(ここは、オープンコレクター自体が、出力モードでHighインピーダンス/Lowインピーダンスの切り替えに過ぎず、又、PICがPINをHighインピーダンス,Lowインピーダンスにするラッチレジスターと、実際のPINの 電圧のHigh,Lowを読み取る Port レジスターが別々にあった事が助けになりました(Arduino でもそうなの?)。

この点は、おんちゃんが今までマイコンのハードの経験が全く無い所為もあるが。( ちなみにソフト開発では一応プロのつもりですが ) と、問題が次から次へと出てきて結構大変でした。

今、気がかりなのは、消費電力が足りるのかですが!
PS/2 の規格では、電源容量は、275 mA 以下ですが、 USBマウス+PIC24FJ64GB002 でどれだけ必要か、そのうち、計測しないといけないです。
此処も、別のArduino で、PS/2 の+5V供給ラインに小さい抵抗でもかまして、Arudinoのアナログ入力で電流をモニタリングでもしてみようかと思っています。

その後、テスターを購入して、測ってみたところ、
アイドル時: 30.7 [mA]
グルグルしている時:33.7 [mA]
でした。無線USBマウスでも測定してみましたが、こちらも大体同じみたいです。
但し、無線USBマウスでは、うまく動作しませんでした。こちらは、そのうちチャレンジしてみます。
と言う事で、今は、自宅のKVM に繋げて使っています。

マウスが新しくなったので、結構快適に使っちょります。(2017.10.5 by nishi)

このブログ記事について

このページは、おんちゃんが2017年1月30日 17:41に書いたブログ記事です。

ひとつ前のブログ記事は「Android Studio 2.1.2 を使い始め、エミュレータのトラブル発生」です。

次のブログ記事は「Perl cgi sample for dynamic generate of Java Jnlp.」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ