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