Software

V1.1 of both the controller and the server has now been completed. The car now has complete movement control but no adjustable speed (i am thinking how best to do achieve that). The main changes from V1.0 are that i discovered the socket server wasnt sending the correct information packages which was causing the steering controls to randomly not be sent. I have modified the method and now send out one string package which i then disect at the Pi end to get the controls out.

PiBotController_v1.1

#import the tkinter module for the GUI and input control
try:
    # for Python2
    import Tkinter as tk
    from Tkinter import *
except ImportError:
    # for Python3
    import tkinter as tk
    from tkinter import *
 
import socket
import sys
 
HOST, PORT = "192.168.2.12", 9999
 
#setting up the functions to deal with key presses
def KeyUp(event):
    if drivelabel.get() == "forward":
        pass
    else:
        drivelabel.set('forward')
        labeldown.grid_remove()
        labelup.grid(row=2, column=2)
        transmit()
def KeyDown(event):
    if drivelabel.get() == "reverse":
        pass
    else:
        drivelabel.set('reverse')
        labelup.grid_remove()
        labeldown.grid(row=4, column=2)
        transmit()
def KeyLeft(event):
    if steeringlabel.get () == "left":
        pass
    else:
        steeringlabel.set('left')
        labelright.grid_remove()
        labelleft.grid(row=3, column=1)
        transmit()
def KeyRight(event):
    if steeringlabel.get () == "right":
        pass
    else:
        steeringlabel.set('right')
        labelleft.grid_remove()
        labelright.grid(row=3, column=3)
        transmit()
def key(event):
    if event.keysym == 'Escape':
        #transmit()
        root.destroy()
        
 
#setting up the functions to deal with key releases
def KeyReleaseUp(event):
    drivelabel.set('idle')
    labelup.grid_remove()
    transmit()
def KeyReleaseDown(event):
    drivelabel.set('idle')
    labeldown.grid_remove()
    transmit()
def KeyReleaseLeft(event):
    steeringlabel.set('idle')
    labelleft.grid_remove()
    transmit()
def KeyReleaseRight(event):
    steeringlabel.set('idle')
    labelright.grid_remove()
    transmit()
 
def transmit():
    #HOST, PORT = "192.168.2.12", 9999
    DriveSend = drivelabel.get()
    SteeringSend = steeringlabel.get()
    Drive = DriveSend + SteeringSend
 
    # Create a socket (SOCK_STREAM means a TCP socket)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
    try:
        # Connect to server and send data
        sock.connect((HOST, PORT))
        sock.sendall(bytes(Drive, "utf-8"))
        # Receive data from the server and shut down
        #received = str(sock.recv(1024), "utf-8")
    finally:
        sock.close()
 
#bind all key presses and releases to the root window by connecting
def connect():
    connectionmessagetempvar = connectionmessagevar.get()
    connectionmessagevar.set(connectionmessagetempvar + "\n" + "Attempting to connect...")
    root.bind_all('', KeyUp)
    root.bind_all('', KeyDown)
    root.bind_all('', KeyLeft)
    root.bind_all('', KeyRight)
 
    root.bind_all('', KeyReleaseUp)
    root.bind_all('', KeyReleaseDown)
    root.bind_all('', KeyReleaseLeft)
    root.bind_all('', KeyReleaseRight)
 
    connectionmessagetempvar = connectionmessagevar.get()
    connectionmessagevar.set(connectionmessagetempvar + "\n" + "Connected to PiBot")
   
 
#setting up GUI window        
root = tk.Tk()
root.minsize(300,160)
root.maxsize(300,160)
root.title('PiBot Control Centre')
root.grid_columnconfigure(0, minsize=50)
root.grid_columnconfigure(1, minsize=35)
root.grid_columnconfigure(2, minsize=35)
root.grid_columnconfigure(3, minsize=35)
root.grid_rowconfigure(2, minsize=35)
root.grid_rowconfigure(3, minsize=35)
root.grid_rowconfigure(4, minsize=35)
root.configure(background='white')
root.option_add("*background", "white")
 
#set up the labels to display the current drive states
drivelabel = StringVar()
Label(root, textvariable=drivelabel).grid(row=0, column=1, columnspan=2)
steeringlabel = StringVar()
Label(root, textvariable=steeringlabel).grid(row=1, column=1, columnspan=2)
Label(root, text="Drive: ").grid(row=0, column=0, columnspan=1)
Label(root, text="Steering: ").grid(row=1, column=0, columnspan=1)
 
#set up the buttons and message for connecting etc..
messages=tk.Frame(root, width=150, height=100)
messages.grid(row=1,column=4, columnspan=2, rowspan=4)
 
 
connectionbutton = Button(root, text="Connect", command=connect)
connectionbutton.grid(row=0, column=4)
connectionmessagevar = StringVar()
connectionmessage = Message(messages, textvariable=connectionmessagevar, width=100, )
connectionmessage.grid(row=1, column=1, rowspan=1, columnspan=1)
disconnectionbutton = Button(root, text="Shutdown",)
disconnectionbutton.grid(row=0, column=5)
 
#pictures
photodown = PhotoImage(file="down.gif")
labeldown = Label(root, image=photodown)
labeldown.photodown = photodown
#labeldown.grid(row=4, column=1)
 
photoup = PhotoImage(file="up.gif")
labelup = Label(root, image=photoup)
labelup.photoup = photoup
#labelup.grid(row=2, column=1)
 
photoleft = PhotoImage(file="left.gif")
labelleft = Label(root, image=photoleft)
labelleft.photoleft = photoleft
#labelleft.grid(row=3, column=0)
 
photoright = PhotoImage(file="right.gif")
labelright = Label(root, image=photoright)
labelright.photoright = photoright
#labelright.grid(row=3, column=2)
 
photoupleft = PhotoImage(file="upleft.gif")
labelupleft = Label(root, image=photoupleft)
labelupleft.photoupleft = photoupleft
#labelupleft.grid(row=2, column=0)
 
photodownleft = PhotoImage(file="downleft.gif")
labeldownleft = Label(root, image=photodownleft)
labeldownleft.photodownleft = photodownleft
#labeldownleft.grid(row=4, column=0)
 
photoupright = PhotoImage(file="upright.gif")
labelupright = Label(root, image=photoupright)
labelupright.photoupright = photoupright
#labelupright.grid(row=2, column=2)
 
photodownright = PhotoImage(file="downright.gif")
labeldownright = Label(root, image=photodownright)
labeldownright.photodownright = photodownright
#labeldownright.grid(row=4, column=2)
 
#bind the escape key for quiting the program.
root.bind_all('', key)
#print("Sent:     {}".format(SteeringSend))
#print("Sent:     {}".format(DriveSend))
#print("Received: {}".format(received))
 
#set the labels to an initial state
steeringlabel.set('idle')
drivelabel.set('idle')
connectionmessagevar.set ('PiBotController Initiated')
 
#initiate the root window main loop
root.mainloop()
 
 

PiBotServer_v1.1

import SocketServer
import Tkinter as Tk
from Tkinter import *
 
import RPi.GPIO as io
io.setmode(io.BCM)
 
in1_pin = 4
in2_pin = 17
in3_pin = 23
in4_pin = 24
in5_pin = 25
io.setup(in1_pin, io.OUT)
io.setup(in2_pin, io.OUT)
io.setup(in3_pin, io.OUT)
io.setup(in4_pin, io.OUT)
io.setup(in5_pin, io.OUT)
 
def set(property, value):
        try:
                f = open("/sys/class/rpi-pwm/pwm0/" + property, 'w')
                f.write(value)
                f.close()
        except:
                print("Error writing to: " + property +" value: " + value)
set("delayed", "0")
set("mode", "pwm")
set("frequency", "500")
set("active", "1")
 
def clockwise():
        io.output(in1_pin, True)
        io.output(in2_pin, False)
 
def counter_clockwise():
        io.output(in1_pin, False)
        io.output(in2_pin, True)
 
def stop():
        io.output(in1_pin, False)
        io.output(in2_pin, False)
 
def left():
        io.output(in3_pin, True)
        io.output(in4_pin, False)
        io.output(in5_pin, True)
 
def right():
        io.output(in3_pin, True)
        io.output(in4_pin, True)
        io.output(in5_pin, False)
 
def straight():
        io.output(in3_pin, False)
        io.output(in4_pin, False)
        io.output(in5_pin, False)
 
 
class MyTCPHandler(SocketServer.BaseRequestHandler):
        def handle(self):
                self.DriveRecieve = self.request.recv(1024).strip()
#              print(str(self.DriveRecieve))
                #print("{} wrote:".format(self.client_address[0]))
#              print(self.DriveSend)
#              print(self.SteeringSend)
                #self.request.sendall(self.DriveSend.upper())
                #self.request.sendall(self.SteeringSend.upper())
                MotorControl(self)
                return (self.DriveRecieve)
 
def MotorControl(motor_var):
        speed = 1
        Drive = str(motor_var.DriveRecieve)
        print(Drive)
#      print(Drive[:7])
        if Drive[:7] == "forward":
                speed = 60
#              print(Drive)
                counter_clockwise()
        elif Drive[:7] == "reverse":
                speed = 60
#              print(Drive)
                clockwise()
 
        else:
                stop()
 
        set("duty", str(speed))
 
#      print(Drive[-4:])
#      print(Drive[-5:])
        if Drive[-4:] == "left":
                left()
#              print('left')
        elif Drive[-5:] == "right":
                right()
#              print('right')
        else:
                straight()
 
if __name__ == "__main__":
        HOST, PORT = "192.168.2.12", 9999
        server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
        server.serve_forever()