Форум сайта python.su
Нужна помощь поправить код телеуправления
Ниже код на питоне который отлично работает но есть одна проблема .
Как только данные UDP перестают поступать должна проходить команда STOP.
def MotorOff():
def MotorOff():
#!/usr/bin/env python # coding: utf-8 # Load library functions we want import SocketServer import serial import time #***************INIT BLOK************************ port = serial.Serial("/dev/ttyACM0", baudrate=9600, timeout=3.0) #для отладки #port = serial.Serial("/dev/ttyS2", baudrate=9600, timeout=3.0) #для робота #структура массива для передачи команд [x1,y1,x2,y2,x3,x4,key_axis_L ... key_B] и того 6-Осей 10-Кнопок #utp_command_resiv = ['X', 'X', 'X', 'X','X', 'X', 'X', 'X','X', 'X', 'X', 'X','X', 'X', 'X', 'X'] # Map of drives to pins lDrives = ["a", "a", 'a', "a"] #port.write("\xAA\x0A\x04\x01\x05\x55\x2A") #motor pwm= 150hz save #rcv = port.readline () # читаем ответ конроллера #print ("\r\return:" + repr(rcv)) # return =0 ok иначе команда не принята #*****************END INIT BLOK******************** # Function to set all drives off def MotorOff(): port.write("\xAA\x0A\x06\x00") # motor M0 stop!!! port.write("\xAA\x0A\x07\x00") # motor M1 stop!!! pass def Motor_M0(value_M0): if value_M0 > 255 : value_M0 = 255 elif value_M0 < -255: value_M0 = -255 #print (value_M0) if value_M0 < -15 and value_M0 > -256 : # -15 до -255 зона джойстика X1 Назад if abs(value_M0) > 127: #print ("M0= ", value_M0) port.write(("\xAA\x0A\x0B")+chr(abs(value_M0)-128)) # else: #print ("M0-1= ",value_M0) port.write (("\xAA\x0A\x0A")+chr(abs(value_M0))) # pass elif value_M0 > 15 and value_M0 < 256 : # 15 до 255 зона джойстика X1 Вперед if value_M0 > 127: #print ("M0= ",value_M0) port.write (("\xAA\x0A\x09")+chr(abs(value_M0)-128)) # else: #print ("M0= ",value_M0) port.write (("\xAA\x0A\x08")+chr(abs(value_M0))) # pass else : # значение в районе 0 остановим двигатель port.write("\xAA\x0A\x06\x00") # motor M0 stop!!! #port.write("\xAA\x0A\x07\x00") # motor M1 stop!!! print ("M0= 0") pass def Motor_M1(value_M1): if value_M1 > 255 : value_M1 = 255 elif value_M1 < -255: value_M1 = -255 #print (value_M1) if value_M1 < -15 and value_M1 > -256 : # -15 до -255 зона джойстика X1 Назад if abs(value_M1) > 127: #print ("M1= ",value_M1) port.write (("\xAA\x0A\x0F")+chr(abs(value_M1)-128)) # else: #print ("M1= ",value_M1) port.write (("\xAA\x0A\x0E")+chr(abs(value_M1))) # pass elif value_M1 > 15 and value_M1 < 256 : # 15 до 255 зона джойстика X1 Вперед if value_M1 > 127: #print ("M1= ",value_M1) port.write (("\xAA\x0A\x0D")+chr(abs(value_M1)-128)) # else: #print ("M1= ",value_M1) port.write (("\xAA\x0A\x0C")+chr(abs(value_M1))) # pass else : # значение в районе 0 остановим двигатель #port.write("\xAA\x0A\x06\x00") # motor M0 stop!!! port.write("\xAA\x0A\x07\x00") # motor M1 stop!!! print ("M1= 0") pass # Settings for the RemoteKeyBorg server portListen = 9038 # What messages to listen for (LEDB on an LCD) # Class used to handle UDP messages class PicoBorgHandler(SocketServer.BaseRequestHandler): # Function called when a new message has been received def handle(self): global isRunning #global var_x1 #global var_y1 request, socket = self.request # Read who spoke to us and what they said request = request.upper() # Convert command to upper case driveCommands = request.split(',') # Separate the command into individual drives if len(driveCommands) == 1: # Special commands if request == 'ALLOFF': # Turn all drives off MotorOff() print 'All drives off' elif request == 'EXIT': # Exit the program isRunning = False else: # Unknown command print 'Special command "%s" not recognised' % (request) elif len(driveCommands) == 16: # 16 - длинна принятого массива команд #print (driveCommands, ) #для отладки #print (driveCommands[0]) #для отладки #структура массива для передачи команд [x1,y1,x2,y2,x3,x4,key_axis_L ... key_B] и того 6-Осей 10-Кнопок #utp_command_resiv = ['X', 'X', 'X', 'X','X', 'X', 'X', 'X','X', 'X', 'X', 'X','X', 'X', 'X', 'X'] # for driveNo in range(len(driveCommands)): # command = driveCommands[driveNo] pass Motor_M0 ((int(driveCommands[0])+int(driveCommands[1]))) Motor_M1 ((int(driveCommands[0])-int(driveCommands[1]))) else: # Did not get the right number of drive commands print 'Command "%s" did not have %d parts!' % (request, len(lDrives)) try: global isRunning #начало **************************** value_M0 = 0 value_M1 = 0 # Start by turning all drives off MotorOff() #raw_input('Теперь вы можете включить питание, нажмите клавишу ВВОД') # слушать UDP remoteKeyBorgServer = SocketServer.UDPServer(('', portListen), PicoBorgHandler) isRunning = True while isRunning: # проверка пока приходит телеметрия ***************************** remoteKeyBorgServer.handle_request() # Выключите driver и освободить контакты GPIO закончилась телеметрия print 'Finished' MotorOff() raw_input('Выключите питание, нажмите клавишу ВВОД, чтобы продолжить') #GPIO.cleanup() pass except KeyboardInterrupt: # если нажали CTRL+C *********************** # CTRL + C выход, отключить диски и освободить контакты GPIO print 'Terminated' MotorOff() raw_input('Выключите питание, нажмите клавишу ВВОД, чтобы продолжить') MotorOff() pass #GPIO.cleanup()
Офлайн