Hello i´m a Arduino beginner an I need help with the ps2 Protocol.
I want to take a laptop trackpannel to control my MIDI gear.
How can I read the mouse scroll in my sketch?
/*
Pin 5 is the mouse data pin, pin 6 is the clock pin
Pin 8 and 9 are connected with Resistors to 2 leds
Feel free to use whatever pins are convenient.
/
#define MDATA 5
#define MCLK 6
int xn = 0;
int yn = 0;
int xa;
int ya;
int mxn;
/
*/
int led = 8;
int helligkeit_led = 0;
int led1 = 9;
int helligkeit_led1 = 0;
boolean l = 0;
boolean r= 0;
boolean m= 0;
boolean la;
boolean ra;
boolean ma;
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(" 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);
/* start bit /
gohi (MCLK);
/ wait for mouse to take control of clock); /
while (digitalRead(MCLK) == HIGH);
/ clock is low, and we are clear to send data /
for (i = 0; i < 8; i++)
{
if (data & 0x01)
{
gohi(MDATA);
}
else
{
golo(MDATA);
}
/ wait for clock cycle /
while (digitalRead(MCLK) == LOW)
;
while (digitalRead(MCLK) == HIGH)
;
parity = parity ^ (data & 0x01);
data = data >> 1;
}
/ parity */
if (parity)
{
gohi(MDATA);
}
else
{
golo(MDATA);
}
while (digitalRead(MCLK) == LOW);
while (digitalRead(MCLK) == HIGH);
/* stop bit */
gohi(MDATA);
delayMicroseconds(50);
while (digitalRead(MCLK) == HIGH);
/* wait for mouse to switch modes /
while ((digitalRead(MCLK) == LOW) || (digitalRead(MDATA) == LOW));
/ put a hold on the incoming data. */
golo (MCLK);
// Serial.print("done.\n");
}
/Get a byte of data from the mouse/
char mouse_read(void)
{
char data = 0x00;
char bit = 0x01;
int i;
// Serial.print("reading byte from mouse\n");
// delay (500);
/* 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.println(data, DEC);
// 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 /
// Serial.print("Sending remote mode code\n");
mouse_write (0xf0); / remote mode /
mouse_read(); / ack */
// Serial.print("Read ack byte2\n");
delayMicroseconds(100);
}
void X_Y()
{
char mstat;
char mx;
char my;
char mz;
boolean ml;
boolean mr;
boolean mm;
/* get a reading from the mouse /
mouse_write(0xeb); / give me data! /
mouse_read(); / */
mstat = mouse_read();
mx = mouse_read(); //X Axis
my = mouse_read(); //Y Axis
//mz = mouse_read1(); //Z Axis
ml = bitRead(mstat, 0); //Rightclick
mr = bitRead(mstat, 1); //Leftclick
mm = bitRead(mstat, 2); //Middleclick
if (((mx || my) != 0) || (la != ml) || (ra != mr) || (ma != mm))
{
xn = xa + mx;
yn = ya + my;
// zn = ya+my;
l = ml;
r = mr;
m = mm;
xn = constrain(xn, -127, 127); //sets limit
yn = constrain(yn, -127, 127); //sets limit
Serial.print(mstat, BIN);
Serial.print("\tmx=");
Serial.print(mx, DEC);
Serial.print("\tX=");
Serial.print(xn, DEC);
Serial.print("\tmy=");
Serial.print(my, DEC);
Serial.print("\tY=");
Serial.print(yn, DEC);
Serial.print("\tl=");
Serial.print(l);
Serial.print("\tr=");
Serial.print(r);
Serial.print("\tm:=");
Serial.print(m);
// Serial.print("\tmz=");
// Serial.print(mz, DEC);
Serial.println();
xa = xn; //buffer
ya = yn; //buffer
la = l; //buffer
ra = r; //buffer
ma = m; //buffer
// za = zn;
}
}
void setup()
{
Serial.begin(9600);
mouse_init();
}
void loop()
{
X_Y();
helligkeit_led = map(xn, -127, 127, 0, 255);
analogWrite(led, helligkeit_led );
helligkeit_led1 = map(yn, -127, 127, 0, 255);
analogWrite(led1, helligkeit_led1 );
}