robobuggy / joystick / keyboard.py @ 347a6e5d
History | View | Annotate | Download (2.31 KB)
1 |
# Keyboard Driver for buggy
|
---|---|
2 |
# Do not run this from IDLE!
|
3 |
# You must run this from the shell (and currently on windows)
|
4 |
# to make this work properly.
|
5 |
|
6 |
import serial |
7 |
from threading import Thread |
8 |
from time import sleep |
9 |
import msvcrt # Recieve keypresses |
10 |
|
11 |
# Set starting values
|
12 |
steeringAngle = 0 # Steering angle, "in degrees" (not really) |
13 |
# between -1 and 1.
|
14 |
brake = 1
|
15 |
|
16 |
# Thread sync
|
17 |
ending = 0
|
18 |
|
19 |
def send_packet(servoAngle, brake): |
20 |
currentpacket = 'A'+str(servoAngle)+'B'+str(brake)+'C' |
21 |
print currentpacket
|
22 |
if(ser == None): |
23 |
return
|
24 |
ser.write('A')
|
25 |
ser.write(str(servoAngle))
|
26 |
ser.write('B')
|
27 |
ser.write(str(brake))
|
28 |
ser.write('C')
|
29 |
|
30 |
def send_packet_thread(): |
31 |
print "Send Packet thread started!" |
32 |
while(True): |
33 |
if(ending==1): |
34 |
print "Shutting down send_packet thread..." |
35 |
break;
|
36 |
|
37 |
sleep(0.3)
|
38 |
servo_angle = get_servo_position(steeringAngle) |
39 |
send_packet(servo_angle, brake) |
40 |
|
41 |
def keyloop_thread(): |
42 |
global steeringAngle
|
43 |
global ending
|
44 |
print "Keyloop started, press 'p' to quit" |
45 |
while(True): |
46 |
if(ending==1): |
47 |
print "Shutting down keyloop thread..." |
48 |
break;
|
49 |
sleep(.1)
|
50 |
key = ord(msvcrt.getch()) # getch is blocking |
51 |
|
52 |
if key == 97: # 'a' |
53 |
steeringAngle -= .1
|
54 |
print " L : New angle:", steeringAngle |
55 |
elif key == 100: # 'd' |
56 |
steeringAngle += .1
|
57 |
print " R : New angle:", steeringAngle |
58 |
elif key==255: # Stop running from idle! |
59 |
print "NONONO - STOP RUNNING FROM IDLE!!!" |
60 |
elif key==112: # 'p' |
61 |
ending = 1
|
62 |
# Get the servo angle from steeringAngle
|
63 |
def get_servo_position(steeringAngle): |
64 |
sAngle = (-1.0*(steeringAngle - 1))/2.0 |
65 |
sAngle = (sAngle*60)+95 |
66 |
sAngle = int(sAngle)
|
67 |
if sAngle > 180: |
68 |
sAngle = 180
|
69 |
return sAngle
|
70 |
|
71 |
|
72 |
|
73 |
if __name__ == "__main__": |
74 |
try:
|
75 |
ser = serial.Serial('COM12', 9600, timeout=5) |
76 |
except:
|
77 |
ser = None
|
78 |
klThread = Thread(target = keyloop_thread, args = ()) |
79 |
spThread = Thread(target = send_packet_thread, args=()) |
80 |
klThread.start() |
81 |
spThread.start() |
82 |
print "thread loop started!" |
83 |
|
84 |
klThread.join() |
85 |
spThread.join() |
86 |
ser.close() |