Pages: [1]   Go Down
Author Topic: PS2 Mouse  (Read 1514 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello
I've a problem to connect the ps2 mouse to arduino. I've use the ps2-library directly from arduino.cc, use leonardo board and connected my asus usb-mouse to the arduinoboard(VCC= red, ground= black, green=clock(3), white = date(2)). I've tried with sevaral pins. When i use the mouse example from arduino.cc, it compiled but i haven't a result on the Serial-Monitor.
Can anybody help me? smiley-roll-sweat

Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 112
Posts: 5286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A USB mouse is NOT a PS/2 mouse. If you wanna connect a USB mouse, you have to use a USB host shield or an Arduino Due (which incorporates similar hardware).
Logged

Denmark
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I found out that some USB mouses are just a PS/2 mouse... Mostly the simple ones..
It doesnt seem like the one you got is a ps/2 mouse so you need the usb host like pylon says.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I've readed that this will be function in the Practical Arduino Book from Jonathan Oxer.
Is there a possibility to connect an USB mouse to Arduino? I've need this for my schoolproject. I will read with the optical mouse the position coordinates of may robo-car. Have everybody done this befor and can send me the sourcecode and library?
Logged

Gosport, UK
Offline Offline
Faraday Member
**
Karma: 21
Posts: 3113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You can connect a usb mouse to a usb host shield. Libraries that support mice are provided.

http://www.circuitsathome.com/products-page/arduino-shields/usb-host-shield-2-0-for-arduino
Logged

Espoo, Finland
Offline Offline
God Member
*****
Karma: 7
Posts: 586
"Oops, try again..."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

We are using PS/2 mouse to measure wheel rotation, and I don't see why typical USB-mouse wouldn't do that as well.

So, it's time to se the code....?

Cheers,
Kari
Logged


The only law for me; Ohms Law: U=R*I       P=U*I
Note to self: "Damn! Why don't you just fix it!!!"

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I've connected an old PS2-Mouse with a "ball" for tracking. And it works fine. But when I connect an Optical PS2-Mouse, I haven't a signal. I've debugged the code an saw that it hang up in de while loop:
 
 while (digitalRead(MCLK) == HIGH)
 ;
Anybody a solution?

Code:
/*
 * 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
#define MOUSE_FULL_TURN 1510
#define MOUSE_CPI 384

int     lastMouseX, lastMouseY;
float   lastHead, lastDistance;
float   y_mou, x_mou;
float   dX, dY;
float   dHead;
float   heading_mou;


/*
 * 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);
  /* start bit */
  gohi(MCLK);
/* wait for mouse to take control of clock);  -----------------------------------------------------------------------------hang up in this loop*/
  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;
  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 */
  //  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);
  while (!Serial) { }
  //Serial.print("Initialization of Mouse");
  mouse_init(); 
}

/*
 * get a reading from the mouse and report it back to the
 * host via the serial line.
 */
void loop()
{
  char mstat;
  int sensMouseX;
  int sensMouseY;
  float dPos;

  /* get a reading from the mouse */
  mouse_write(0xeb);  /* give me data! */
  mouse_read();      /* ignore ack */
  mstat = mouse_read();
  sensMouseX = (int)mouse_read();
  sensMouseY = (int)mouse_read();

  dX = sensMouseX - lastMouseX;
  dHead = dX * 360.0 / MOUSE_FULL_TURN;
  heading_mou += dHead;
  lastHead += dHead;

  while (heading_mou>=359)
    heading_mou-= 360.0;
  while (heading_mou<0)
    heading_mou+= 360.0;   

  dY = sensMouseY - lastMouseY;
  lastDistance += dY * 25.4 / MOUSE_CPI;
  dPos = dY * cos(heading_mou * PI/180) * 25.4 / MOUSE_CPI;
  y_mou += dPos;
  dPos = dY * sin(heading_mou * PI/180) * 25.4 / MOUSE_CPI;
  x_mou += dPos;
 

  /* send the data back up */
  //Serial.print("Heading=");
  //Serial.print(lastHead, DEC);
  Serial.print("\tDistance=");
  Serial.print(lastDistance, DEC);
  Serial.println();
  //Serial.print(mstat, BIN);
  Serial.print("X=");
  Serial.print(dX, DEC);
  Serial.print("\tY=");
  Serial.print(dY, DEC);
  Serial.println();
  delay(20);  /* twiddle */
}
« Last Edit: November 17, 2012, 08:50:48 am by marco131 » Logged

Pages: [1]   Go Up
Jump to: