Smartphone‑gestuurde Bluetooth‑muis: Bouw je eigen virtuele joystick
Onderdelen en benodigdheden
| Arduino UNO | 1 |
| HC‑05 Bluetooth‑module | 1 |
| Jumper‑draden (generiek) | 1 set |
Apps en online diensten
- Arduino IDE
- IDLE (Python GUI)
- MIT App Inventor Bluetooth Mouse Control (app)
Over dit project
Dit project lijkt op mijn eerdere werk waarbij ik een joystick gebruikte om een pc‑cursor te besturen. Het belangrijkste verschil is dat ik een smartphone‑applicatie heb gemaakt die 2 virtuele joysticks bevat om de cursor te verplaatsen, te scrollen en linker/rechterklikken uit te voeren, net als een gewoon trackpad.
Werking
De smartphone‑applicatie stuurt de x‑ en y‑as‑data van de joystick, scroll‑status, linker‑ en rechterklik‑status via Bluetooth naar de Arduino Uno die verbonden is met de HC‑05 Bluetooth‑module. Deze data wordt door de Arduino verwerkt om de huidige cursorpositie aan te passen tot een nieuwe positie. De resulterende data samen met scroll‑ en knopstatus wordt via de seriële poort uitgeprint in een formaat dat door het Python‑script gelezen kan worden. Het Python‑script gebruikt de mouse‑module om muisacties uit te voeren.
(Afbeelding van het blokdiagram is in de originele tutorial te vinden.)
Over de applicatie
De smartphone‑applicatie is gemaakt met MIT App Inventor. Het bouwen van de app is eenvoudig: je voegt gewenste blokken toe om je applicatie te bouwen. Ik heb me gebaseerd op de Tabletop Robotics‑tutorial. Het hoofscherm van de applicatie ziet er als volgt uit:
(Afbeelding van het app‑scherm is in de originele tutorial te vinden.)
Voordat de hoofdinformatie naar de HC‑05‑module wordt gestuurd, stuurt de applicatie eerst een één‑byte getal (255) om het begin van de data aan te duiden. De reeks van dataoverdracht is:
- Verstuur '255' als startbyte
- Verstuur 1 byte joystick x‑as‑waarde
- Verstuur 1 byte joystick y‑as‑waarde
- Verstuur status van linkerklik, rechterklik en scroll (1 byte)
De data wordt elke 20 milliseconden naar de Arduino UNO gestuurd.
Arduino‑kant
De databytes van de applicatie worden door de Arduino ontvangen via de HC‑05 Bluetooth‑module. De Arduino houdt de huidige cursorcoördinaten bij: x‑coördinaten lopen van 0 tot 1279, y‑coördinaten van 0 tot 799. Deze extreme waarden zijn verkregen via de Python‑functie mouse.get_position() (niet gebruikt in de hoofdsketch).
Op basis van de ontvangen joystick‑data worden de huidige x‑ en y‑coördinaten verhoofd/verlaagd om de cursor naar de gewenste nieuwe coördinaat te verplaatsen. De finale data wordt vervolgens in de volgende volgorde op de seriële monitor geprint:
(Afbeelding van de seriële uitvoer is in de originele tutorial te vinden.)
Deze datasequentie wordt door het Python‑programma uitgelezen en uitgevoerd. Hiervoor hebben we de extra modules mouse en pyserial nodig (zie volgende stap).
Python‑programmering
De gebruiker moet Python 3 geïnstalleerd hebben op laptop/computer. Download van python.org.
Voor Windows:
- Na installatie, kopieer het pad naar de Python‑installatiemap.
- Open de opdrachtprompt en voer uit:
cd <plak het pad naar de Python‑map>
py –m pip install –-upgrade pip
py –m pip install mouse
py -m pip install pyserial
De mouse‑module voert muisacties uit, pyserial zorgt voor seriële communicatie met de Arduino.
(Schermafbeeldingen van de installatie zijn in de originele tutorial te vinden.)
Uitvoering
- Installeer de "Bluetooth Mouse Control"‑app op je smartphone.
- Upload de Arduino‑sketch naar je Arduino UNO en bouw de schakeling volgens het schema.
- Python‑kant:
- Kopieer de Python‑code in een notitieblokbestand. Verander de COM‑poort naar die van je Arduino UNO en bewaar als
.py. - Open het bestand in Python IDLE.
- Run het script.
- Kopieer de Python‑code in een notitieblokbestand. Verander de COM‑poort naar die van je Arduino UNO en bewaar als
- Open de smartphone‑app, verbind met de Bluetooth‑module en je zult de cursor zien bewegen wanneer je de virtuele joystick bedient.
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;
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++;
if (datareceived[1] >= 110) xpos = map(datareceived[1], 110, 172, 0, sensitivity);
if (datareceived[1] <= 70) xpos = map(datareceived[1], 60, 1, 0, -sensitivity);
if (datareceived[2] >= 110) ypos = map(datareceived[2], 110, 255, 0, sensitivity);
if (datareceived[2] <= 60) ypos = map(datareceived[2], 70, 1, 0, -sensitivity);
if (datareceived[3] == 1 && l_prev == 0) clicks = 1;
else if (datareceived[3] == 2 && r_prev == 0) clicks = 2;
else if (datareceived[3] == 3 || datareceived[3] == 4) clicks = datareceived[3];
l_prev = datareceived[3];
r_prev = datareceived[3];
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
import time
import serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('COM3', 9600) # Pas COM‑poort aan
time.sleep(1)
while True:
data = str(ArduinoSerial.readline().decode('ascii'))
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)
elif '4' in z: mouse.wheel(delta=1)
Schema's
Zie bijgevoegde afbeelding in de originele tutorial.
Productieproces
- Bouw een Bluetooth-gecontroleerde Raspberry Pi Robot met Audio Feedback
- Gebarenbestuurde RGB-tafellamp – Interactief, Handvrij Verlichten
- Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
- LED's bedienen met Alexa via Raspberry Pi – Eenvoudige stapsgewijze handleiding
- Een oude RC-auto ombouwen tot joystick-gestuurd voertuig met Arduino
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
- Bouw een Stemgecontroleerde Robot met Arduino Nano
- MobBob: Bouw Je Eigen Arduino Robot, Naadloos Bestuurd via Android Smartphone
- Spraakgestuurde huishoudapparaten: Bluetooth-besturing met Google Assistant
- PiBot: De Arduino-aangedreven pianorobot voor precisiemuziek