Вс май 23, 2021 17:57:50
/*
* 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.
*/
#define MDATA 5
#define MCLK 6
/*
* according to some code I saw, these functions will
* correctly set the mouse clock and data pins for
* various conditions.
*/
void gohi(int pin)
{
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
}
void golo(int pin)
{
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
}
void mouse_write(char data)
{
char i;
char parity = 1;
// Serial.print("Sending ");
// Serial.print(data, HEX);
// Serial.print(" to mouse\n");
// Serial.print("RTS");
/* put pins in output mode */
gohi(MDATA);
gohi(MCLK);
delayMicroseconds(300);
golo(MCLK);
delayMicroseconds(300);
golo(MDATA);
delayMicroseconds(10);
gohi(MCLK); /* start bit */
while (digitalRead(MCLK) == HIGH); /* wait for mouse to take control of clock); */
for (i=0; i < 8; i++) { /* clock is low, and we are clear to send data */
if (data & 0x01) {
gohi(MDATA);
}else{
golo(MDATA);
}
while (digitalRead(MCLK) == LOW); /* wait for clock cycle */
while (digitalRead(MCLK) == HIGH);
parity = parity ^ (data & 0x01);
data = data >> 1;
}
if (parity) { /* parity */
gohi(MDATA);
}else{
golo(MDATA);
}
while (digitalRead(MCLK) == LOW);
while (digitalRead(MCLK) == HIGH);
gohi(MDATA); /* stop bit */
delayMicroseconds(50);
while (digitalRead(MCLK) == HIGH);
while ((digitalRead(MCLK) == LOW) || (digitalRead(MDATA) == LOW)); /* wait for mouse to switch modes */
golo(MCLK); /* put a hold on the incoming data. */
// Serial.print("done.\n");
}
/*
* Get a byte of data from the mouse
*/
char mouse_read(void){
char data = 0x00;
int i;
char bit = 0x01;
// Serial.print("reading byte from mouse\n");
/* start the clock */
gohi(MCLK);
gohi(MDATA);
delayMicroseconds(50);
while (digitalRead(MCLK) == HIGH);
delayMicroseconds(5); /* not sure why */
while (digitalRead(MCLK) == LOW) /* eat start bit */;
for (i=0; i < 8; i++) {
while (digitalRead(MCLK) == HIGH);
if (digitalRead(MDATA) == HIGH){
data = data | bit;
}
while (digitalRead(MCLK) == LOW);
bit = bit << 1;
}
/* eat parity bit, which we ignore */
while (digitalRead(MCLK) == HIGH);
while (digitalRead(MCLK) == LOW);
/* eat stop bit */
while (digitalRead(MCLK) == HIGH);
while (digitalRead(MCLK) == LOW);
/* put a hold on the incoming data. */
golo(MCLK);
// Serial.print("Recvd data ");
// Serial.print(data, HEX);
// Serial.print(" from mouse\n");
return data;
}
void mouse_init()
{
gohi(MCLK);
gohi(MDATA);
// Serial.print("Sending reset to mouse\n");
mouse_write(0xff);
mouse_read(); /* ack byte */
// Serial.print("Read ack byte1\n");
mouse_read(); /* blank */
mouse_read(); /* blank */
//mouse_read(); /* blank */
//mouse_read(); /* blank */
// Serial.print("Sending remote mode code\n");
mouse_write(0xf0); /* remote mode */
mouse_read(); /* ack */
// Serial.print("Read ack byte2\n");
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 */
}
/* Modified mouse initialization to accomondate for
* Intellimouse vertical wheel (scroll)
* by DGar 02/05/2014
*/
/*
* 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.
*/
#define MDATA 5
#define MCLK 6
/*
* according to some code I saw, these functions will
* correctly set the mouse clock and data pins for
* various conditions.
*/
void gohi(int pin)
{
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
}
void golo(int pin)
{
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
}
void mouse_write(char data)
{
char i;
char parity = 1;
// Serial.print("Sending ");
// Serial.print(data, HEX);
// Serial.print(" to mouse\n");
// Serial.print("RTS");
gohi(MDATA); /* put pins in output mode */
gohi(MCLK);
delayMicroseconds(300);
golo(MCLK);
delayMicroseconds(300);
golo(MDATA);
delayMicroseconds(10);
gohi(MCLK); /* start bit */
while (digitalRead(MCLK) == HIGH); /* wait for mouse to take control of clock); */
for (i=0; i < 8; i++) { /* clock is low, and we are clear to send data */
if (data & 0x01) {
gohi(MDATA);
}else{
golo(MDATA);
}
while (digitalRead(MCLK) == LOW); /* wait for clock cycle */
while (digitalRead(MCLK) == HIGH);
parity = parity ^ (data & 0x01);
data = data >> 1;
}
if (parity) { /* parity */
gohi(MDATA);
}else{
golo(MDATA);
}
while (digitalRead(MCLK) == LOW);
while (digitalRead(MCLK) == HIGH);
gohi(MDATA); /* stop bit */
delayMicroseconds(50);
while (digitalRead(MCLK) == HIGH);
while ((digitalRead(MCLK) == LOW) || (digitalRead(MDATA) == LOW)); /* wait for mouse to switch modes */
golo(MCLK); /* put a hold on the incoming data. */
// Serial.print("done.\n");
}
/*
* Get a byte of data from the mouse
*/
char mouse_read(void)
{
char data = 0x00;
int i;
char bit = 0x01;
// Serial.print("reading byte from mouse\n");
gohi(MCLK); /* start the clock */
gohi(MDATA);
delayMicroseconds(50);
while (digitalRead(MCLK) == HIGH);
delayMicroseconds(5); /* not sure why */
while (digitalRead(MCLK) == LOW); /* eat start bit */
for (i=0; i < 8; i++) {
while (digitalRead(MCLK) == HIGH);
if (digitalRead(MDATA) == HIGH) {
data = data | bit;
}
while (digitalRead(MCLK) == LOW);
bit = bit << 1;
}
while (digitalRead(MCLK) == HIGH); /* eat parity bit, which we ignore */
while (digitalRead(MCLK) == LOW);
while (digitalRead(MCLK) == HIGH); /* eat stop bit */
while (digitalRead(MCLK) == LOW);
golo(MCLK); /* put a hold on the incoming data. */
// Serial.print("Recvd data ");
// Serial.print(data, HEX);
// Serial.print(" from mouse\n");
return data;
}
void mouse_init(){
char mouseId;
gohi(MCLK);
gohi(MDATA);
// Serial.print("Sending reset to mouse\n");
mouse_write(0xff);
mouse_read(); /* ack byte */
// Serial.print("Read ack byte1\n");
mouse_read(); /* blank */
mouse_read(); /* blank */
// Serial.print("Setting sample rate 200\n");
mouse_write(0xf3); /* Set rate command */
mouse_read(); /* ack */
mouse_write(0xC8); /* Set rate command */
mouse_read(); /* ack */
// Serial.print("Setting sample rate 100\n");
mouse_write(0xf3); /* Set rate command */
mouse_read(); /* ack */
mouse_write(0x64); /* Set rate command */
mouse_read(); /* ack */
// Serial.print("Setting sample rate 80\n");
mouse_write(0xf3); /* Set rate command */
mouse_read(); /* ack */
mouse_write(0x50); /* Set rate command */
mouse_read(); /* ack */
// Serial.print("Read device type\n");
mouse_write(0xf2); /* Set rate command */
mouse_read(); /* ack */
mouse_read(); /* mouse id, if this value is 0x00 mouse is standard, if it is 0x03 mouse is Intellimouse */
// Serial.print("Setting wheel\n");
mouse_write(0xe8); /* Set wheel resolution */
mouse_read(); /* ack */
mouse_write(0x03); /* 8 counts per mm */
mouse_read(); /* ack */
mouse_write(0xe6); /* scaling 1:1 */
mouse_read(); /* ack */
mouse_write(0xf3); /* Set sample rate */
mouse_read(); /* ack */
mouse_write(0x28); /* Set sample rate */
mouse_read(); /* ack */
mouse_write(0xf4); /* Enable device */
mouse_read(); /* ack */
// Serial.print("Sending remote mode code\n");
mouse_write(0xf0); /* remote mode */
mouse_read(); /* ack */
// Serial.print("Read ack byte2\n");
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;
char mz;
/* 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();
mz = 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.print("\tZ=");
Serial.print(mz, DEC);
Serial.println();
delay(20); /* twiddle */
}
Вс май 23, 2021 22:54:58
Вс май 23, 2021 23:09:02