Arduino-joystick-gestuurde muis: Preciese cursor-navigatie
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino UNO | 1 |
| Dual-axis joystick | 1 |
Apps en online services
- Arduino IDE
- IDLE (Python GUI)
Over dit project
Als alternatief voor het besturen van de computercursor met een muis of trackpad, heb ik deze toepassing gebouwd met behulp van een joystick. De joystick kan de cursor in elke richting (X- en Y-as) bewegen en voert ook de klikfunctie uit met de ingebouwde joystick-schakelaar.
Basisprincipes
Een joystick bestaat in essentie uit twee potentiometers die in de X- en Y-richting zijn uitgelijnd. De Arduino leest analoge waarden van de joystick in het bereik van 0 tot 1023. Wanneer de joystick in zijn standaardpositie (middelpunt) staat, ligt de analoge waarde dicht bij 500.
De Arduino-sketch is zo geprogrammeerd dat wanneer de joystick van het midden wordt bewogen, waarden worden uitgeprint in het bereik van -gevoeligheid tot +gevoeligheid (standaardwaarde 10), afhankelijk van de positie. In de uiterste positie print de Arduino 10, in de tegenovergestelde -10.
Om afzonderlijke waarden voor X- en Y-richting te scheiden, wordt een dubbele punt (":") gebruikt tussen de waarden. De status van de joystick-knop (SW) wordt als 1 of 0 op de seriële monitor uitgeprint na de X- en Y-waarden.
Voor de laptop/computer om de waarden te herkennen, hebben we Python's mouse module nodig (eerder pyautogui, bijgewerkt 12/11/2020).
Python-programmering
De gebruiker moet Python 3 geïnstalleerd hebben. Download het van python.org.
Na installatie, kopieer het pad naar de Python-installatie. Voer de volgende stappen uit in de opdrachtprompt:
cd <plak het pad naar de Python-map>py -m pip install --upgrade pippy -m pip install mousepy -m pip install pyserial
De mouse module voert muisacties uit en pyserial zorgt voor communicatie met de Arduino.
Het Python-programma leest de data die de Arduino print, herkent de X- en Y-richtingswaarden en de status van de schakelaar (SW). De huidige cursorcoördinaten worden verkregen via mouse.get_position() (in pixels).
Wanneer de joystick wordt bewogen, worden de analoge waarden van de Arduino opgeteld bij de huidige cursorpositie om de cursor in de gewenste richting te bewegen. De functie mouse.move(X+x, Y+y) zorgt hiervoor, waarbij X en Y de huidige positie zijn en x en y de incrementen van de Arduino.
Voor klikoperaties op basis van de SW-status: mouse.click(button="left").
Uiteindelijke uitvoering
- Upload de Arduino-sketch naar je Arduino UNO en sluit de joystick aan volgens het schema.
- Zorg dat
mouseenpyserialgeïnstalleerd zijn. - Kopieer de Python-code in een notepad-bestand. Specificeer de juiste COM-poort van de Arduino (te vinden in Apparaatbeheer). Sla op als
.pybestand. - Open Python's IDLE en open het .py bestand daaruit.
- Run de module (F5).
Bij fouten: herstart IDLE en controleer de COM-poort. Werkt het? Beweeg de joystick en zie de cursor reageren.
Code
Arduino-code
////////////////////////////////////
// Joystick-gestuurde muis
// Door Shubham Santosh
////////////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(9, INPUT); // SW pin
digitalWrite(9, HIGH);
}
int prev_state = 0; // vorige staat van schakelaar
void loop() {
int z = 0, xpos = 0, ypos = 0;
int x = analogRead(A0);
int y = analogRead(A1);
int sensitivity = 10; // aanpasbaar voor comfort
if (x >= 550) // omhoog bewogen
xpos = map(x, 550, 1023, 0, sensitivity);
if (x <= 450) // omlaag bewogen
xpos = map(x, 450, 0, 0, -sensitivity);
if (y >= 550) // rechts bewogen
ypos = map(y, 550, 1023, 0, sensitivity);
if (y <= 450) // links bewogen
ypos = map(y, 450, 0, 0, -sensitivity);
int curr_state = digitalRead(9);
if (curr_state == 1 && prev_state == 0) // SW ingedrukt
z = 1;
else
z = 0;
if (xpos != 0 || ypos != 0 || z == 1) { // print alleen bij beweging
Serial.print(xpos);
Serial.print(":");
Serial.print(ypos);
Serial.print(":");
Serial.println(z);
}
prev_state = curr_state;
delay(10); // voor normale operatie
}
Python-code
# Joystick-gestuurde muis
# Door Shubham Santosh
# Laatst bewerkt 12/11/2020
import mouse, sys
import time
import serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('com3', 9600) # Specificeer de juiste COM-poort
time.sleep(1) # wacht 1 seconde
while True:
data = str(ArduinoSerial.readline().decode('ascii')) # lees data
(x, y, z) = data.split(":") # splits in x, y, z
(X, Y) = mouse.get_position() # huidige cursorpositie
(x, y) = (int(x), int(y)) # converteer naar int
mouse.move(X + x, Y - y) # beweeg cursor
if '1' in z: # lees SW-status
mouse.click(button="left") # linksklik
Schema
Productieproces
- De Evolutie van de Computermuis: Ontwerp, Productie en Toekomsttrends
- Temperatuur-gecontroleerde Ventilator: DIY Relais Systeem Voor Media Kast Koeling
- Raspberry Pi-gestuurd Aquaponica Systeem: Bouwgids & Code
- Bouw een Beweging-gestuurde AWS IoT-knop met Raspberry Pi, PIR-sensor en MQTT
- Bouw een Bluetooth-gecontroleerde Raspberry Pi Robot met Audio Feedback
- Bouw een Wi-Fi-gecontroleerde Raspberry Pi Robot met Python – Stap-voor-stap Gids
- Alexa-gecontroleerde ARDrone 2.0 Demo: Stem-geactiveerde Drone met Raspberry Pi & Hologram Nova
- Een oude RC-auto ombouwen tot joystick-gestuurd voertuig met Arduino
- Interactieve Joystick Game met Arduino en LED Feedback
- Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
- FeNi42 Legering: Lage Thermische Uitdijing voor Precisieafdichtingen