アルドゥイーノ+ USBホストSheild生産USBマウスrpmのPS / 2インターフェイス

プロダクション理由

企業のイントラネットワイヤレスマウス(一見なしPS / 2インターフェイス)を使用することを望んでのみPS / 2インターフェイス、。そして、PS / 2変換アダプタのUSBの種類だけのシンプルな接続である、あなたは、それ自体がPS / 2モードが動作することができますサポートしてキーボードやマウスを必要とし、近代的なUSBマウスレシーバは、明らかに、このことを考慮していませんでした。誰かがなされてアルドゥイーノとUSBキーボードデバイスターンPS / 2をつまずいた、マウスもなければなりません。この手段は、原則的に、それがリピーターです。USBマウスの場合(ホストの非Bluetoothワイヤレスマウスは、まだUSBマウスで、有線の区別を欠い)、彼はマスターである、マウスからのデータを受信し、実際のホストのために、彼はPS / 2マウスである、責任変換されたデータをそこに送信します。


PS / 2部

物理インターフェイス

以下、実用的なだけの4行、1 - データ:(双方向)データを送信するための、5 - 時計制御データを読み出し、書き込み、ホストにパルスを送信するステップと、3 - グランド:グランド; 4 - VCC(+ 5V):パワー。3及び4はアルドゥイーノに接続しながら1とArduinoの上の任意のデジタルピンに接続することができる2、(ただしSheild占有それらピンUSBホストを避けるため、私は実際には2番、3番ピンを使用します) 5VおよびGND、上のようにホストPS / 2インターフェースの意志機能に接続されていない追加の電源、。

データ伝送(1)

デバイス>ホストは:パルスを生成する装置により制御クロックは、まず、クロックハイ期間を維持しながら、(ハイ/ローレベルが1/0を示す)送信されるデータビットを設定し、低いクロックを引かれますレベルは、立ち下がりエッジが生成され、通知ホストは読み出し(ラッチ)データ、クロックリリースクロ​​ック(次の1ビットのデータ転送のための調製において高いへ戻る)後の期間のために低いままです。

ホスト>デバイス:まだ装置によって制御クロックパルス。クロックデータをプルマスターは(ハイになる)データの送信を停止する必要があり、優先度のデータは、ホストから読み出し、ホストはクロックを解放することが所望またはデバイスに送信(コマンド)データ、およびデバイス表す場合、デバイスが表しますあなたはデータを読み始めることができます。まず、デバイスは、クロック時間にハイに保持され、その後、クロックダウン、立ち下がりエッジを生成し、ホストデータを通知するために設けられているリリースクロ​​ックがハイになった後、クロック期間のために低いままである(この場合、装置はロックすることができます現在のデータを保存し、準備完了)下位1ビットのデータに読み込まれます

データ送信(1バイト)

送信ごとにデータの1つのバイトは、追加のスタートビット(0)の必要性、奇数パリティ・ビット、ストップビット(1)、11の合計来

コードの実装

PS2devクラスのルックスは、1バイトを達成するために、元々 ps2devと呼ばれるサンプルコードで見つかったArduinoの公式ウェブサイトは、読み込みと書き込みが、バージョンが古すぎます。その後ps2devはすでにのArduinoのライブラリであることがわかった、あなたはライブラリマネージャにインストール検索することができますが、それでも十分ではない、新たな、いくつかの問題があります。ここで彼の最新バージョンhttps://github.com/Harvie/ps2devマウスの簡単なシミュレーションの例は、ある時点で死んでしまう、サイクルから抜け出す、私の改正は、著者にマージされました。また、通信速度を向上させるために、私は今、正常に動作する、単一のバイトを送るのクロック周波数との間隔を変更しました。:)

マウスプロトコル

マウスは、ホストからの応答コマンドが、ホストはデータ・パケットの変位(ストリームモードを送ることであることを除い及び「データレポート」で、ん。一般的に、マウスホストがクエリに各種コマンドを送信するか、マウスまたはパラメータの状態を設定します状態を有効にし、積極的に)報告することができ、より具体的にはオンラインマニュアルを参照してください。私は次のようにキャッチコマンドシーケンスに記載されている(ああ、検索「PS2マウスとキーボードテクニカルリファレンス」のA中国版):

19:44:22.522 -は>はprocess_cmd FF リセットモード、さまざまな状態のリセット入力にリセットコマンド、セルフテストが完了した応答、デバイスIDは、モード蒸気が入り、
19:44:22.556 - > process_cmd F2 質問デバイスID、最初の問い合わせをすべき00(標準マウス)を返信するが、私はいつも03(ホイールマウス)の返信ああ、すべての権利
19:44:22.556 - > process_cmd E8の設定分解能
19:44:22.556 - >セット解像度0は読み込み解像度、1COUNT /ミリメートル
19:44:22.556 - > process_cmd E6は1スケーリング配置:1
19:44:22.556は、 - > process_cmd E6は1スケーリング配置:1 
19:44: - 22.556> process_cmd E6は:1、なぜ連続クロモニック比スケーリング設定しました3回?
19:44: - 22.556> process_cmd E9 マウスステータス問い合わせが、この時間は、パケットステータス・バイト3返信すべきである
:44:19 22.556を- > process_cmd E8 に配置された解像度
19:44:22.589 - >セット解像度3 読取解像度、 8count / mmで
19:44である: - 22.589> F3がサンプルレート設定process_cmd
:44:19 22.589を- >セットのサンプル・レート200は、 200 /秒のサンプリングレートを読み出し
19:44: - 22.589> process_cmd F3は、 サンプリングレート設定
:44:19 22.589を- >セットのサンプル・レート100は100 /秒のサンプリングレート読み込み
19:44: - 22.589> process_cmd F3は、 サンプリングレート設定
:44:19 22.589を- >セットサンプルレート80ホストがこの順に設けられた速度をサンプリングする際に留意、80 /秒のサンプリングレートを読み取り、彼はマウス03(ホイールマウス)をサポートし、前記
19:44である:22.589 - > process_cmd質問デバイスIDのF2、03は、この時点で復元しなければなりませんマウスサポート場合、
19:44:27.052 - > process_cmd FF リセットコマンド
19:44:27.052 - > process_cmd F2 呼掛けデバイスID
19:44である:27.052 - > E8はprocess_cmd解像度提供。
19:44:27.052の- >セット解像度0 読み取り解像度、1COUNT / mmで
19:44である: - 27.052>はE6がprocess_cmdスケールを設け1 :. 1
> E6はprocess_cmdスケールを設け1 :. 1 - 27.052:19:44であり、
19:44である:27.052 - > E6に配置されたスケーリングprocess_cmd 1:1、同、なぜ3回連続で毛?私は意味の推測します。
夜07時44分:27.086 - >
19:44:27.086 - > process_cmd E8 に配置された解像度
19:44:27.086 - >セット解像度3 読取解像度、8count / mmで
19:44れる:27.086 - > F3セットprocess_cmdサンプルレート
19:44:27.086 - >セットサンプルレート200は、サンプリングレート200 /秒である読み取る
。19:44である: - 27.086> F3がサンプルレート設定process_cmd
:44:19 27.086を- >セットのサンプル・レート100は100 /秒のサンプリングレートを読み込み
19:44である:27.086 - > F3配置さprocess_cmdサンプルレート
19:44:27.086 - >セットのサンプル・レート80は、なぜ再びそれを再び、80 /秒のサンプリングレートを読み込みますか?恥ずかしい
19:44:27.086 - > process_cmd F2 質問デバイスIDが、時間が03を返す必要があり、マウスのサポートそれ場合
19:44: - 27.120> process_cmd F3は、 サンプル・レート設定
19 - 200の読み取り>をセットサンプルレートは27.120サンプリング:44 200 /秒の速度
。19:44である:27.120 - > F3は、サンプルレート設定process_cmd
19:44 - >セット27.120サンプル・レート200は200 /秒のサンプリングレートで読み出しを
19:44: - 27.120> process_cmd F3は、サンプリングレート設定
:44:19 27.120を- >セットのサンプル・レート80がこの順に設けられたホストのサンプリング・レートは、言ったとき、彼は、マウス04(ボタンをサポートしていることを指摘し80 /秒のサンプリングレートを、読み取っ5ホイール)
19:44:27.120 - > process_cmd F2尋問デバイスID、マウスのサポートもあれば時間は、04を返す必要がありますが、私はしませんでした。:)
19時44分: - 27.120> F3は、サンプルレートを設定process_cmd
:44:19 27.120 - >セットのサンプル・レート100は100のサンプリングレートは、読み出しを/秒
19時44:27.120 - > E8はprocess_cmd解像度設け
19時44:27.154を- >設定された解像度3読取解像度、8count / mmで
19:44である:27.154 - > F4マウスが積極的に「変位データパケット」を報告し始めることができ、以下、「データ・レポート」を有効process_cmd。


USBセクション

使用USBホストシールド拡張ボード、ここでは、最新バージョンを(MAX3421Eチップ、サポートUSB2.0を使用して)、プラス(ものArduinoのライブラリである)USBホストシールド2.0  https://github.com/felis/USB_Host_Shield_2.0、長いとカバークラス継承HIDUniversal仮想関数ParseHIDData HIDデバイスは、データ(データ形式使用可能USBBlyzer分析)を得ることができます。このデータが正確に前回と同じであれば、実際の使用で発見、それはParseHIDData呼び出されません。(例えば、同じ方向のスクロールホイール、後者は無視される)だけマイナーな変更hiduniversal.cppを必要とし、私には全く注意されていないの、マージ要求を入れています。^ _ ^(私は変更を確認https://github.com/felis/USB_Host_Shield_2.0/pull/522

USBは、ホストデバイス送信は、トークンパケット(上記ライブラリUSB :: InTransferを参照)、デバイスがホストにデータを送信することができる場合にのみ、マスタ - スレーブ構成です。内部マウスデバイスにUSBチップ(USBホストとの通信用)およびMCU(マウスを実行するためのファームウェアプログラム)へ。マウスの状態変化を(ボタンを押し又は移動されるような)検出した場合、バッファにMCUチップUSBデータのステータスは、ホスト・チップ・データにトークンパケット内のUSBによって受信されます。ホストが遅すぎるデータレート要求である場合はどうなりますか?私は、データが失われることになると思いますか?ファームウェアプログラムコードは、現在のビューに見出すことができるから、バッファチップ、及び無追加の処理に直接データを書き込むことです。バッファがいっぱいになったとき、おそらく、合併以降のデータは、よりよいビット?


マウスのリターン

つまり、サンプリングレートは、前述しました。

PS / 2は、理論的にサポートしています10,20,40,60,80,100,200。Iホスト100の最終設定値、2msの現在のUSB時間のかかる部分、PS / 2パートタイム6-7msを消費するには、満たさなければなりません。私は、より高速なクロック周波数変調、短い間隔に変更単一バイトの送信は、成功しなかった試してみました。:(

USB1.1のサポート:125

USB2.0のサポート:250,500,1000

トランシーバの速度と一致しない場合がありUSBおよびPS / 2を考慮すると、USBマウスからのデータを格納するための円形のキューを実装し、新しいデータができるだけ尾要素と組み合わされます。しかし、実際のテスト、キューの長さとは、複数のマージ機能であってもループの中で、再び繰り返したUSB PS / 2 sendが真であるデータを読み込むための()の試みと呼ばれることはなかったん、なぜ?私のUSBマウスのリターンはわずか125バーがあるからでしょう。


呼吸光

コンバータ(およびもう少しクール)、トップ・ボックスに余分なフルカラーLEDライトの動作状態を理解するために。ときに高速赤点滅し、忙しい;およびアイドリング時には、緑色のゆっくりした呼吸を配置します。


最終製品

ここでは完全なソースコード  https://github.com/liumazi/MzMouse


参考資料

https://www.arduino.cn/forum.php?mod=viewthread&tid=22851

http://www.burtonsys.com/ps2_chapweske.htm

http://usb.baiheee.com/usb_projects/easy_usb_51_programer_plus/usb_hid_mouse.html

https://blog.csdn.net/suipingsp/article/details/30238891

リリース8元の記事 ウォン称賛20 ビュー50000 +

おすすめ

転載: blog.csdn.net/liumazi/article/details/105153219