PS/2 マウスからモーション データを取得するために、このメッセージの下部にあるマウス スケッチ (他の誰かによって書かれています) を使用しています。このマウスの仕様を確認したところ、PS/2 互換であることがわかりました。ただし、実行すると、「mouse.write(0xff); // reset」という mouse_init の最初の行で停止するように見えます。これは、ps2.h 内の関数の呼び出しです。ps2.h は 2008 年から存在し、多くのプロジェクトで使用されているので問題ないと思いますが、PS/2 マウスとして接続する USB マウスには、このライブラリにはなかった独特の機能があるのではないかと考えていました。に対応するように設計されています。これに光を当てる可能性のある経験はありますか?
私は、mouse.write が Genius マウスの状態を変更していることを確認できましたが、ホストがデータの送信を続行できるように、マウスがクロック状態を低くするはずのポイントで停止します。mouse.write が開始される前は、クロック状態は低いですが、ホストによって数行だけ mouse.write にプッシュされ、そこにとどまります。マウスはそれを再び下げることはありません。問題が何であるかについての考えは大歓迎です。
#include <ps2.h>
/*
* an arduino sketch to interface with a ps/2 mouse.
* Also uses serial protocol to talk back to the host
* and report what it finds.
*/
/*
* Pin 5 is the mouse data pin, pin 6 is the clock pin
* Feel free to use whatever pins are convenient.
*/
PS2 mouse(6, 5);
/*
* initialize the mouse. Reset it, and place it into remote
* mode, so we can get the encoder data on demand.
*/
void mouse_init()
{
mouse.write(0xff); // reset
mouse.read(); // ack byte
mouse.read(); // blank */
mouse.read(); // blank */
mouse.write(0xf0); // remote mode
mouse.read(); // ack
delayMicroseconds(100);
}
void setup()
{
Serial.begin(9600);
mouse_init();
}
/*
* get a reading from the mouse and report it back to the
* host via the serial line.
*/
void loop()
{
char mstat;
char mx;
char my;
/* get a reading from the mouse */
mouse.write(0xeb); // give me data!
mouse.read(); // ignore ack
mstat = mouse.read();
mx = mouse.read();
my = mouse.read();
/* send the data back up */
Serial.print(mstat, BIN);
Serial.print("\tX=");
Serial.print(mx, DEC);
Serial.print("\tY=");
Serial.print(my, DEC);
Serial.println();
// delay(20); /* twiddle */
}