3

Raspberry Pi Zero を仮想キーボードと仮想マウスに変えました。私はこの素晴らしい (SeongTae Jeong さんに感謝します!) github のレポ - rasp_vusbを使用してそれを行いました。それがどのように機能するかを簡単に要約すると:

  1. PI Zero を USB ケーブルで別のコンピューターに接続し、イーサネット ケーブルでインターネットに接続します。
  2. コンピューターに接続すると、デバイス マネージャー (Windows) に 3 つの新しいデバイスが作成されます。

    • ヒューマン インターフェイス デバイス
      • USB入力デバイス
    • キーボード
      • HID キーボード デバイス
    • マウスおよびその他のポインティング デバイス
      • HID準拠マウス(絶対位置+ボタン)
      • HID準拠マウス(相対位置+ホイール)
  3. PI zero (レポの rasp_vusb_server にあるコード) で実行されている「サーバー」があり、コマンドを受け取り、マウス コマンドまたはキーボード コマンドとして、USB 経由で接続されているデバイスに送信します。

  4. IP に接続して適切なデータを送信することにより、別のコンピューターから PI zero (サーバー) にコマンドを送信できます。マップInputControllerにある、提供されたレポで既に組み込まれているプログラムを使用できます

現在、これは Windows 10 ビルド 1803 およびビルド 1903 で完全に動作します。Mac でも動作しますが、Mac でキーボード機能をテストしていません。この奇妙な問題は、Pi Zero が Windows 10 (pro または home) ビルド 1809 に接続されている場合に発生します。

キーボードコマンド、相対マウスコマンド (意味: atm の現在の位置から +50 ピクセル右にカーソルを移動)、およびマウス ボタン(クリック) コマンドは正常に動作しますが、絶対マウスコマンド (意味: カーソルを画面上の X = 50、Y = 50) およびホイールコマンドが機能しない-カーソルが左上隅 (座標、X=0、Y=0) でスナップし続けます

これをさまざまなコンピューターと Windows ビルド、さまざまなモニター (タッチ スクリーンがあるものとないもの)、さまざまな Pi ゼロで試しました。この問題は、Windows 10 ビルド 1809 でのみ発生します。同様の問題についてWebで検索してみましたが、すべての回答がタッチスクリーンの問題につながりますが、私の場合、タッチスクリーンは別のビルドで動作するため、問題ではありません.

これが問題と関係があるかどうかは実際にはわかりません。これは、PIゼロに送信するコード/コマンドであり、PIゼロが接続されたデバイスに送信するためです)私はコードを掘り下げ始めました。絶対マウス コマンドを送信すると、長さが 15 のバイト配列が送信されることがわかりました。理解を深めるために例を挙げて説明します。

カーソルを画面上のX=50Y=100に移動する絶対マウス コマンドを送信したいとします。リポジトリの readme ファイルに記載されているように、画面の解像度に応じて計算を行う必要があります。では、 1920x1080の解像度があるとしましょう。次に、X=(50 * 32767 / 1920) = 853 と Y=(100 * 32767 / 1080) = 3033 を送信します。次に、関数を呼び出す必要があります。InputController/MouseDevice.csまたはDemo/MouseDevice.csのリポジトリにあります。この関数は、次のように数値をバイト配列に変換します: (EDIT*) 比較のために、(X=+50, Y=+50) のような相対マウス コマンドを送信したときに作成されるバイト配列を次に配置します。byte[] ConvertToMouseCommands("853 3033")

[0] = 11  <- Packet length (15 - 4)             [0] = 7 (11-4)                    
[1] = 0                                         [1] = 0
[2] = 0                                         [2] = 0
[3] = 0                                         [3] = 0
[4] = 7   <- 7 means absolute command           [4] = 6   <- 6 means relative commands
[5] = 85  <- (xPos & 0xff)                      [5] = 0                     
[6] = 3   <- (xPos & 0xff00) >> 8)              [6] = 50  <- xPos (Just xPos!) you can only send +-127 
[7] = 217 <- (yPos & 0xff)                      [7] = 50  <- yPos (Just yPos!) you can only send +-127 
[8] = 11  <- (yPos & 0xff00) >> 8)              [8] = 0
[9] = 0                                         [9] = 0
[10] = 0                                        [10] = 0
[11] = 0
[12] = 0
[13] = 0
[14] = 0

これらは、PI ゼロに送信するバイト配列です。PI ゼロがそれらを受信すると、2 つの機能 (相対マウス コマンドか絶対マウス コマンドかによって異なります) を使用して、それらをさらに送信します。2 つの関数はvoid MouseDevice::SendRelative(int fd, char *mouseInput, int keyLen)void MouseDevice::SendAbsolute(int fd, char *mouseInput, int keyLen)です。これらは、rasp_vusb_server/MouseDevice.cppのリポジトリにあります。この投稿はすでに十分に長いため、ここにコードを貼り付けたくはありませんが、基本的に、ボタンがクリックされた場合、またはマウスのホイールが回転した場合、X 座標、Y 座標が送信されます。私に。

私が言ったように、コードは他の Windows ビルドでは完全に機能しますが、ビルド 1809 では失敗するだけです。正直なところ、このようなもののデバッグを開始する方法さえ知りません。そのビルドで何かが変更されましたか?バイトを多少異なるものに送信する必要がありますか? ドライバーなどを無効にするような魔法の解決策はありますか (希望的観測)? 古い W​​indows 10 ビルドを試して、動作するかどうかを確認する必要がありますか?

情報を提供していただけると非常にありがたいです。ありがとうございました!

4

0 に答える 0