Stap 6: De controle van de muis van de Python
We gebruiken Python3.2 met de pywin32 -bibliotheek controle krijgen over sommige van de Windows-functies zoals Mouse Control. De bibliotheek pyserial zal ons in staat stellen om te lezen wat Arduino is sturen op de USB-seriële poort.De volledige code wordt weergegeven in de Volgende Step. Voor nu laten we eens kijken naar de belangrijkste ideeën waardoor de code werken.
1.
Aan het begin openen we de seriële poort:
ser = seriële. Seriële (COM-1, 9600) # de seriële poort openen
Maar eerst moeten we om erachter te komen welke COM-poort is het op.
Om te doen dat wij proberen ieder op zijn beurt. Mocht hij verzuimen we omgaan met de uitzondering en blijf kijken.
# Erachter te komen welke COM-poort de Arduino is op
voor com in range(15):
Try:
ser seriële =. Serieel (com, 9600) # de seriële poort openen
print("Found on COM",com+1) # als je hier de COM-poort OK is geopend
pauze # We vonden het dus stoppen met zoeken
met uitzondering van:
bedrukken ("niets COM", com + 1)
2.
swState is de variabele die we de schakelaar staat in (vanaf de seriële poort van de Arduino lezen).
We willen eigenlijk de schakelaar staat kent. We willen weten wanneer de knop is ingedrukt.
We kunnen dit doen door het bijhouden van de waarde van de vorige en de huidige waarde van het af te trekken. We zetten dat in een functie:
def swPressed():
keren swStateD1 - swState # 0,1, -1: hetzelfde, enkel gedrukt, net vrijgegeven
dat wil zeggen
swState: 1,1,1,0,0,0,1,1,-
swStateD1:-, 1,1,1,0,0,0,1,1
swPressed():-, 0,0,1,0,0,-1,0,
Als de opmerking zegt: wanneer de knop wordt gedrukt swPressed() geeft 1 als resultaat
3.
We lezen de seriële gegevens worden verzonden door het Arduino met behulp van ser.readline() als volgt:
Deze lijn leest een lijn tot en met inbegrip van de 'newline' tekens '\r\n'.
rx = ser.readline().decode().split('\r\n')
en we splitsen op basis van komma 's
gegevens rx[0].split(',') =
We indexeren ten slotte elk stuk van gegevens fom gegevens (een lijst):
xTilt = int(data[0])
yTilt = int(data[1])
zTilt = int(data[2])
swState = int(data[3])
4.
Vervolgens berekenen we de x, y-positie van de cursor op basis van het "centrum" positie (dwz de cx, cy positie van de cursor wanneer we de schakelaar te activeren aanwijzerverplaatsing - daarover meer verderop ingedrukt), en de tilt. Geven we ook enige controle over de gevoeligheid d.w.z. hoeveel de x, verplaatsen y-waarden voor een gegeven waarde van de Tilt:
x = cx + xTilt/gevoeligheid
En we beperken de x, y-waarden. Mooi gedaan in Python als volgt:
x = max (min (xMax, x), 0) # limiet aan de coördinaten van een scherm
5.
Ten slotte controleren we als de schakeloptie ging van NOT Pressed aan Pressed:
sw = swPressed() # Controleer de knop
Als het net werd ingedrukt, en we in de controle van de cursor zijn (enCursor == 1) dan we uitschakelen van de cursor en breken uit de lus van het terwijl het programma eindigt. Maar voordat we breken we emuleren de indrukken van de spatiebalk om te pauzeren Flight Simulator als volgt:
win32api.keybd_event(0x20, 0,0,0) # Druk op de spatiebalk om te pauzeren van Flight Simulator
win32api.keybd_event (0x20, 0, win32con. KEYEVENTF_KEYUP, 0)
Anders als de schakelaar net werd ingedrukt en wij niet in de controle van de cursor zijn (enCursor == 0) dan we hebben om de cursor (enCursor == 1), de cx, cy variabelen bijwerken naar de huidige positie
(cx, cy) = win32api. GetCursorPos()
We krijgen de cx, cy waarden zodat we kunnen gaan de cursor + of - dit punt in x en y als de versnellingsmeter wordt gekanteld.
en klikt u op de linker muisknop met behulp van de win32 -bibliotheek:
win32api.mouse_event (win32con. MOUSEEVENTF_LEFTDOWN,int(x),int(y),0,0)
WIN32API.mouse_event (win32con. MOUSEEVENTF_LEFTUP,int(x),int(y),0,0)
Nu als we in de controle van de cursor, gaan we de cursor met de x, y-positie die we eerder van de Tilt berekend:
als enCursor: win32api. SetCursorPos((int(x),int(y)))
=================
Kopieer de code in de volgende stap in een nieuwvenster in IDLE (Python IDE) en sla het op als mouse.py