Smartphone-gesteuerte Bluetooth-Maus: Eigenen virtuellen Joystick bauen
Komponenten und Zubehör
| Arduino UNO | 1 |
| HC-05 Bluetooth-Modul | 1 |
| Jumper-Kabel (generic) | 1 Set |
Apps und Online-Dienste
- Arduino IDE
- IDLE (Python GUI)
- MIT App Inventor – Bluetooth Mouse Control App
Über dieses Projekt
Dieses Projekt ähnelt meiner früheren Arbeit, bei der ich einen Joystick zur Steuerung des PC-Cursors verwendete. Der entscheidende Unterschied: Hier habe ich eine Smartphone-App erstellt, die zwei virtuelle Joysticks enthält – einen für die Cursorbewegung, einen für Scrollen – sowie Links- und Rechtsklick, genau wie ein Trackpad.
Funktionsweise
Die Smartphone-App sendet per Bluetooth (HC-05) die X/Y-Achsenwerte beider Joysticks, Scroll-Status und Klick-Status an den Arduino Uno. Dieser berechnet daraus die neue Cursorposition und gibt die Daten seriell aus. Ein Python-Skript auf dem PC liest diese Daten ein und führt die Mausaktionen über das mouse-Modul aus.

Die Smartphone-App (MIT App Inventor)
Die App wurde mit dem MIT App Inventor erstellt. Der Hauptbildschirm zeigt zwei virtuelle Joysticks und Buttons für Klick/Scroll.

Datenprotokoll (alle 20 ms):
- Start-Byte:
255(Sync) - 1 Byte: Joystick 1 X-Achse
- 1 Byte: Joystick 1 Y-Achse
- 1 Byte: Status (Links/Rechts-Klick, Scroll)
Arduino-Seite
Der Arduino empfängt die Bytes über den HC-05. Er hält die aktuelle Cursorposition (X: 0–1279, Y: 0–799 – basierend auf mouse.get_position() in Python). Empfangene Joystick-Daten werden auf Bewegungsempfindlichkeit gemappt und zur aktuellen Position addiert/subtrahiert. Das Ergebnis wird als X:Y:Klick über Serial ausgegeben.

Python-Programmierung
Voraussetzung: Python 3 (von python.org).
Unter Windows:
- Python installieren, Installationspfad kopieren.
- Eingabeaufforderung öffnen:
cdpy -m pip install --upgrade pip py -m pip install mouse py -m pip install pyserial
Module: mouse (Mausaktionen), pyserial (Serielle Kommunikation).
Ausführung
- App installieren: „Bluetooth Mouse Control“ auf dem Smartphone installieren.
- Arduino flashen: Arduino-Sketch hochladen, Schaltung gemäß Schaltplan aufbauen.
- Python-Seite:
- Python-Code in Notepad kopieren, COM-Port anpassen (z. B.
COM3), als.pyspeichern. - In IDLE öffnen und ausführen (F5).
- Python-Code in Notepad kopieren, COM-Port anpassen (z. B.
- Verbinden: Smartphone-App starten, mit HC-05 koppeln. Cursor bewegt sich bei Joystick-Bewegung.

Code
Arduino-Code
int datareceived[5] = {0,0,0,0};
int in_byte = 0;
int array_index = 0;
int l_prev=0, r_prev=0;
void setup() {
Serial.begin(9600);
}
int height=0, width=0;
void loop() {
int clicks=0;
int sensitivity=20; // Empfindlichkeit einstellbar
int xpos=0, ypos=0;
if (Serial.available() > 0) {
in_byte = Serial.read();
if (in_byte == 255) {
array_index = 0;
}
datareceived[array_index] = in_byte;
array_index++;
// X-Achse (Joystick 1)
if (datareceived[1] >= 110) xpos = map(datareceived[1], 110, 172, 0, sensitivity); // rechts
if (datareceived[1] <= 70) xpos = map(datareceived[1], 60, 1, 0, -sensitivity); // links
// Y-Achse (Joystick 1)
if (datareceived[2] >= 110) ypos = map(datareceived[2], 110, 255, 0, sensitivity); // runter
if (datareceived[2] <= 60) ypos = map(datareceived[2], 70, 1, 0, -sensitivity); // hoch
// Klick/Scroll Erkennung (Flankenerkennung)
if (datareceived[3] == 1 && l_prev == 0) clicks = 1; // Linksklick
else if (datareceived[3] == 2 && r_prev == 0) clicks = 2; // Rechtsklick
else if (datareceived[3] == 3 || datareceived[3] == 4) clicks = datareceived[3]; // Scroll
l_prev = datareceived[3];
r_prev = datareceived[3];
// Nur senden, wenn Bewegung oder Klick
if (xpos != 0 || ypos != 0 || clicks != 0) {
height += ypos;
width += xpos;
height = constrain(height, 0, 799);
width = constrain(width, 0, 1279);
Serial.print(width);
Serial.print(":");
Serial.print(height);
Serial.print(":");
Serial.println(clicks);
clicks = 0;
}
}
}
Python-Code
import mouse, sys, time, serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('COM3', 9600) # Richtigen COM-Port eintragen!
time.sleep(1)
while True:
data = str(ArduinoSerial.readline().decode('ascii')).strip()
if not data: continue
x, y, z = data.split(":")
x, y = int(x), int(y)
mouse.move(x, y)
if '1' in z: mouse.click(button="left")
elif '2' in z: mouse.click(button="right")
elif '3' in z: mouse.wheel(delta=-1) # Scroll down
elif '4' in z: mouse.wheel(delta=1) # Scroll up
Schaltplan

Herstellungsprozess
- Bluetooth-gesteuerter Raspberry Pi Roboter mit Audio-Feedback bauen
- Gesteuerter RGB-Tischlampe – Interaktive, berührungslose Beleuchtung
- Intelligentes Voltmeter mit Arduino & Smartphone bauen – Einfaches DIY-Projekt
- LEDs mit Alexa über Raspberry Pi steuern – Einfache Schritt-für-Schritt-Anleitung
- Altes RC-Auto per Xbox-Controller & Arduino zum Joystick-Fahrzeug umbauen
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Arduino-basierter 6-DoF Roboterarm mit Nunchuk-Steuerung
- Sprachgesteuerter Roboter mit Arduino Nano bauen
- MobBob: Eigenen Arduino-Roboter bauen, per Android-Smartphone steuern
- Sprachgesteuerte Haushaltsgeräte: Bluetooth-Steuerung mit Google Assistant