Flight Simulator med Arduino och Python (6 / 9 steg)
Steg 6: Python mus kontroll
Vi kommer att använda Python3.2 med pywin32 biblioteket för att få kontroll över några av Windows-funktioner såsom muskontroll. Pyserial biblioteket gör det möjligt att läsa vad Arduino skickar oss på USB-seriell Port.Den fullständiga koden visas i Nästa Step. För nu ska vi se viktigaste idéer som gör koden fungerar.
1.
I början öppna vi den seriella porten:
ser = följetong. Följetong (COM-1, 9600) # öppna serieporten
Men först måste vi räkna ut vilken COM-port det är på.
För att göra att vi prova var och en i sin tur. Om det misslyckas vi hantera undantag och hålla titta.
# Ta reda på vilken COM-port Arduino är på
för com i range(15):
försök:
ser = följetong. Följetong (com, 9600) # öppna serieporten
print("Found on COM",com+1) # om du kom hit COM-porten öppnades OK
break # Vi hittade det så sluta söka
utom:
skriva ut ("ingenting på COM", com + 1)
2.
swState är den variabel som vi läser switch staten in i (från den seriella porten från Arduino).
Egentligen vill vi inte veta tillståndet switch. Vi vill veta när knappen har tryckts.
Vi kan göra detta genom att hålla reda på det föregående värdet och subtrahera nuvärdet från den. Vi satt som i en funktion:
def swPressed():
återgå swStateD1 - swState # 0,1, -1: samma, bara man trycker precis släppt
dvs.
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,
Som kommentaren säger: när knappen trycks swPressed() returnerar 1
3.
Vi läser den seriella data som skickas av Arduino med ser.readline() enligt följande:
Den här raden läser en linje upp till och inklusive radmatningstecken "\r\n".
rx = ser.readline().decode().split('\r\n')
och vi delar upp det baserat på kommatecken
data = rx[0].split(',')
Slutligen indexera vi varje bit data fom data (en lista):
xTilt = int(data[0])
yTilt = int(data[1])
zTilt = int(data[2])
swState = int(data[3])
4.
Nästa vi beräkna x, y-position för markören utifrån "" mittläge (dvs cx, cy positionen för markören när vi tryckte på switch för att aktivera markörkontroll - mer om det senare) och lutning. Vi ger också viss kontroll över känslighet dvs hur mycket x, flyttar y-värden för ett givet Tilt värde:
x = cx + xTilt/känslighet
Och vi begränsa x, y-värden. Bra gjort i Python som följer:
x = max (min (xMax, x), 0) # gräns till samordnar den skärm
5.
Slutligen kontrollerar vi om växeln gick från inte pressad att tryckt:
sw = swPressed() # Check knappen
Om det bara var pressade och vi har kontroll över markören (enCursor == 1) då vi inaktivera markören och bryta utanför medan systemet slutar programmet. Men innan vi bryter vi efterlikna pressning av tangenten för att pausa Flight Simulator som följer:
win32api.keybd_event(0x20, 0,0,0) # Tryck på blanksteg för att pausa Flight Simulator
win32api.keybd_event (0x20, 0, win32con. KEYEVENTF_KEYUP, 0)
Annars om växeln trycktes bara och vi har inte kontroll över markören (enCursor == 0) så måste vi aktivera markören (enCursor == 1), uppdatera cx, cy variabler till den nuvarande ståndpunkten
(cx, cy) = win32api. GetCursorPos()
Vi får cx, cy värden så vi kan flytta markören + eller - i den här punkten i x och y som accelerometern lutas.
och klicka med vänster musknapp med hjälp av win32 -biblioteket:
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 om vi är i kontroll över markören, flytta vi markören till x, y-position vi beräknat tidigare från Tilt:
om enCursor: win32api. SetCursorPos((int(x),int(y)))
=================
Kopiera koden i Nästa steg in i ett nytt fönster i IDLE (Python IDE) och spara den som mouse.py