Maus-Scroll-Ersatz

Mama hat einen neuen Laptop, aber das Touchpad ist Mist. Wer im Browser damit “scrollen” will, braucht eine Dosis Antidepressiva.

Hmmm … ich hatte doch noch einen ATmega32U4 und eine Joystick Breakout-Platine in der Lade liegen …


Auf manchen Arduino Seiten hat der “Leonardo” keinen besonders guten Ruf.
Das liegt unter anderem daran, dass er die serielle Schnittstelle etwas anders einsetzt, als das ein UNO oder MEGA tun.
(Und damit meine ich nicht den Code der Gegenseite, sieht damals…)

Der Arduino Leonardo basiert auf dem ATmega32U4 und im Gegensatz zum ATmega328p beim UNO hat er keinen separaten USB Chip für die Sketch-Uploads, weil er die USB-Kommunikation selbst beherrscht.

Und deshalb wird er auch etwas anders programmiert. Die übliche Serial Schnittstelle (sollte eigentlich Serial0 heißen und) ist hier dem virtuellen USB-COM-Port zugeordnert und nicht den Pins 0 und 1 auf der Platine.

Für die Pins ist Serial1 instanziert.

Doch eben gerade wegen der Einbettung von USB in den Mikrokontroller, können wir USB auch auf Code-Ebene manipulieren.
Und daraus ergeben sich ungeahnte Möglichkeiten

Problemstellung: Ein virtuelle Maus

Ohne Hardwareunterstützung oder vernünftige Software-Emulation über Gesten ist es durch ein Touchpad nicht ordentlich möglich, ein Scrollen auszulösen.
Man kann nur den Mauszeiger zu einer Scroll-Leiste schicken und dort auf ein Pfeilchen oder die Leiste klicken.
Ein Touchpad hat eben kein Scroll-Rad … leider.

Doch über den Header mouse.h bietet die Arduino-IDE “out-of-the-box” eine Bibliothek an, mit der man eine HID konforme Maus über den Chip nachbilden kann. Das bedeutet, der Chip wird vom PC wie eine Maus erkannt und nun können wir per Code Mausbewegungen und Aktionen zum PC senden, der diese dann umsetzt und visualisiert.

Und wo bekommen wir die Infos her, in welche Richtung gescrollt werden soll?
Natürlich vom Joystick, der im Hintergrund für jede Achse einen verstellbaren Widerstand nutzt um seine Ausrichtung zu melden.
analogRead() gibt eine Wert zwischen 0 und 1023 zurück, je nachdem wie weit der Stick nach oben oder unten (Y) bzw. links oder rechts (X) bewegt wurde.

Werte rund um 512 sollten die Mittelstellung darstellen. Wenn einem nur rauf oder runter bzw. links oder rechts Infos genügen, kann man sich einen Grenzwert für den gemessenen Pegel setzen, z.B.:

  • alles kleiner 256 bedeutet Richtung A
  • alles größer 768 bedeutet Richtung B
  • und dazwischen bedeutet keine Richtung

ATmega32U4 + Widerstand = Joystick

Also lötet man den Joystick auf eine etwas größere Platine, wo man den ATmega32U4 auch draufsetzen kann, verbindet seine Achsen mit den analogen Eingängen, wie auch die Stromzu- und -abfuhr, schreibt etwas Code und fertig ist der Prototyp.

Man kann also mit ein paar Zeilen wie:

 1void loop()
 2{
 3  int sensor = analogRead(joystick_pin);
 4  if(senser < 256)
 5  {
 6    Mouse.move(0, 0, -1);
 7  }
 8  else if(sensor > 768)
 9  {
10    Mouse.move(0, 0, +1);
11  }
12  delay(100);
13}

bereits seinen eigenen Scroll-Controller realisieren. Cool!

Etwas Ähnliches wäre auch mit Keyboard-Eingaben möglich und natürlich lassen sich noch andere USB-HID Standards nachahmen.

Fazit

Ich liebe unser Zeitalter. Dass man so schnell ein kleines Tool bauen kann, mit dem man Scroll-Eingaben an den PC senden kann, ist einach nur genial.

Natürlich war das Spielzeug in erster Linie ein Proof-of-Concept und etwas Zeitvertreib.
Mama fand es ein paar Minuten witzig, wollte dann aber doch lernen, wie man mit dem Touchpad ohne den Zusatzsteuerknüppel dort hinkommt, wo man eben hin will.

Und dafür braucht es etwas Übung, bis man mit den Fingern schneller wird.

Ich habe die Testplatine so gebaut, dass die MCU ein- und absteckbar ist und kann das Teil somit noch für andere Zwecke recyclen.
Von daher ist keine Hardware verschwendet worden.

Und ja, ich weiß, mit meinem Arduino Esplora wäre das ganze auch ohne Lötkolben in Sekundenschnelle fertig gewesen.
Aber hey … ein bisschen Beschäftigung an der Lötstation braucht man eben …


Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!