Project

General

Profile

Statistics
| Branch: | Revision:

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()