PS2-Maus

Eine Maus am Arduino ist vielleicht nur auf den ersten Blick nicht der absolute Renner bei den Sensoren. Jedoch ist sie reichhaltig ausgestattet mit den bis zu drei Tasten, dem Scroll-Rad und den x- / y-Bewegungssensoren. Darüber hinaus ist sie preiswert oder es liegt vielleicht noch eine irgendwo rum. Und zu guter Letzt ist sie mit 4 Drähten (Masse, 5 Volt, Daten und Takt) ruck-zuck angeschlossen.
Gute Gründe es mal zu Probieren. Die zugehörige Bibliothek gibt es hier:
http://thepotterproject.net/TPPNews/?page_id=180
Info zum Maus-Protokoll und der Verdrahtung hier:
http://www.computer-engineering.org/ps2protocol/
und hier:
http://www.computer-engineering.org/ps2mouse/

Das Ganze habe ich in einer halben Stunde installiert und aufgebaut. Mit der Bibliothek kommt ein Beispiel Sketch, das auch auf Anhieb lief. Aber dann: vielleicht bin ich ja zu blöd oder die beiden Mäuse, die ich ausprobiert habe, haben den selben Fehler, jedenfalls zeigt sich bei mir, dass der Status des Scroll-Rades nicht sofort beim Drehen sondern erst nach einer weiteren Maus-Aktion (Bewegen, Taste drücken) "upgedated" wird. Schlimmer noch, Bewegung der Maus im ersten Quadranten, also so schräg nach rechts oben erzeugen auch kein "update" der Koordinaten :0 Nur wenn in negativer X- oder Y-Richtung (also nach links oder unten) eine Bewegungskomponente mit dabei ist gibt es die neuen Koordinaten zurück geliefert.
Hier mein etwas modifiziertes Programm (die Modifikation bewirkt, dass nur bei Änderungen des Mausstatus eine Ausgabe erfolgt):

#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 2 is the mouse data pin --green
/* pin 3 is the clock pin     --white
 * Feel free to use whatever pins are convenient.
 */

PS2Mouse mouse(3, 2);
  int old_mouseStatus=0;          //for change tracking
  
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()
{
  MouseInfo mouseInfo;
  mouse.getData(&mouseInfo);

  if (mouseInfo.status!=old_mouseStatus){   //print if status has changed
    old_mouseStatus=mouseInfo.status;       //save new status  
    Serial.print(mouseInfo.status, BIN);

    //X change
    Serial.print("\tX=");
    Serial.print(mouseInfo.x, DEC);

    //Y change
    Serial.print("\tY=");
    Serial.print(mouseInfo.y, DEC);

    //Scroll change
    Serial.print("\tSc=");
    Serial.print(mouseInfo.scroll, DEC);

    //Left button down
    Serial.print("\tLB=");
    Serial.print(mouseInfo.leftClick, DEC);

    //Middle button down
    Serial.print("\tMB=");
    Serial.print(mouseInfo.middleClick, DEC);

    //Right button down
    Serial.print("\tRB=");
    Serial.print(mouseInfo.rightClick, DEC);

    //Cumulative X position
    Serial.print("\tCX=");
    Serial.print(mouseInfo.cX, DEC);

    //Cumulatie Y position
    Serial.print("\tCY=");
    Serial.print(mouseInfo.cY, DEC);

    //Cumulative scroll postion
    Serial.print("\tCS=");
    Serial.print(mouseInfo.cScroll, DEC);
    Serial.println();
 //   delay(1000);       //no delay because change tracking surpresses continius update
  }
}

Ich habe mir auch mal die Bibliothek angeschaut. Ist recht tricky und für 'nen Anfänger nicht leicht durchschaubar. Ich selber habe aber nichts auffälliges entdeckt. Würde mich auch wundern bei einer offiziellen Arduino Bib. Ich hatte versucht über die internationalen Foren eine Antwort zu bekommen, leider ohne Erfolg. Und wie ich den Autor der Lib. direkt erreiche habe ich auch nicht heraus gefunden.

Vielleicht hat eine/einer von euch ja mal die Zeit diesem Phänomen nachzugehen und mir auf die Sprünge zu helfen. Würde mich freuen und mir helfen.
Gespannt auf das, was ihr raus finden werden
MHz

ich habe eine normale ps2-maus ohne scrollrad, die ich am roboter als schrittzähler zerpflückt habe , "x" für rechtes rad und "y" für linkes rad. funktioniert wunderbar.

gruss

Hallo funkheld,
welche lib verwendest Du denn? Die hier: http://thepotterproject.net/TPPNews/?page_id=180 ? Wie es dort heißt, ist dies eine neuere Version.
Wie sieht den die "zerpflückte" Maus aus? Hast Du die Encoder ausgebaut, um linkes und rechtes Rad abzufragen? So mit der original Maus-Mechanik kann ich mir das nicht vorstellen - schick mal ein Bild davon.
Ist aber 'ne echt gute Anwendung für eine ausgediente Maus. Ich kann mir vorstellen, dass eine optische Maus dafür ebenfalls gut geeignet sein dürfte. Und dies sogar ohne mechanische "Umbauten". Gleitet einfach über den Boden und sendet x- y- Koordinaten. Meine optische Maus am PC reagiert auch noch wenn sie ca. 5mm über dem Boden schwebt. Genial einfach, super Idee!
Aber zurück zu meinem Problem: welche Bib. setzt Du ein?
Gruß MHz

"PS2 Mouse Library", diese anklicken, nicht die neue nehmen.
da kann man eine ps2-tastatur testen und die ps2-maus. 2 demos sind da drin.

ich hatte die sensoren erst ausgelötet von der mausplatine und auf eine eigene kleine platine gesteckt dann am roboter angebracht.
dann hatte ich mir sensoren bestellt , die vom roboter asuro gehen wunderbar.
den strom dafür nehme ich wie gehabt von der mausplatine ab, dann braucht man mit widerständen nichts zu basteln.

habe auch damit mal ein barcodeleseer gebastelt, der papierstreifen dafür ist halt nur schmaler.

gruss

VGA-PS/2 Adapter Platine:
http://www.watterott.com/de/VGA-PS2-Adapter-Board-Kit

Könnte das Anschliessen der Maus etwas vereinfachen.

optische Maus dafür ebenfalls gut geeignet sein dürfte.

nee, bei einem abstand von ca 2mm von der oberfläche spielt sie verrückt.