Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2017 15:31:45

debager
Зарегистрирован: 2017-12-24
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь поправить код телеуправления

Нужна помощь поправить код телеуправления
Ниже код на питоне который отлично работает но есть одна проблема .
Как только данные UDP перестают поступать должна проходить команда STOP.

  def MotorOff():
Но этого не происходит моторы продолжают вращается с последней полученной скоростью.
Код я нашел в сети 2 года назад переписал под себя и все забыл и питон и как писал .
Прошу измените программу так чтобы она проверяла поступление данных и если пропуски более 1сек или 30 пакетов то
 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()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version