2015-09-27 2 views
0

Я реализую Python (2.7.9) в качестве интерфейса между моим Arduino с джойстиком и несколькими кнопками и моей машиной Linux для управления Megaman на эмуляторе. Джойстик выполняет движения x/y и кнопки стреляют и прыгают. Мой код получает строку, отформатированную как (X_Y_FIRE_JUMP), и анализирует значения, чтобы увидеть, что она должна вводить на клавиатуре, используя библиотеку PyUserInput.Странные элементы управления при использовании интерфейса Python

Происходит одна странная ошибка: всякий раз, когда я двигаюсь вправо, даже не нажимая ни одну из кнопок, Мегаман огрызается. Я проверил свой серийный выход, чтобы убедиться, что это аппаратное обеспечение, и это не так; принимаемая последовательная строка чиста, так как она должна выглядеть примерно так: «[X> 510] _ [Y ~ 510] _k_t». Итак, X говорит ему двигаться вправо, Y ничего не делает, k говорит ему не прыгать, и t говорит ему, чтобы он не стрелял. Почему я все же получаю отрывочный неожиданный выстрел только, когда я двигаюсь вправо?

Python код:

import serial 
from pykeyboard import PyKeyboard 


control = PyKeyboard() 


def getxy(): 
    while True: 
     try: 
      ab = arduino.readline() 
      a, b, c, d = ab.split("_") 
      a = int(a) 
      a = a - 512 
    # This is pure jiggery-pokery and apple sauce. The joystick controller is 
    # totally kaput (#german) and I didn't want to mess with the wiring (damn 
    # color wires. Don't touch this, it will hurt your family.) 
      b = int(b) 
      b = (b - 512) * -1 
      return a, b, c, d 
     except Exception: 
      continue 
     break 


def procxy(): 
    x, y, s, j = getxy() 
    mov = "" 
    if (x > 100): 
     mov = mov + "r" 
    if (x < -100): 
     mov = mov + "l" 
    if (y > 100): 
     mov = mov + "u" 
    if (y < -100): 
     mov = mov + "d" 
    if ("f" in s): 
     mov = mov + "f" 
    if ("j" in j): 
     mov = mov + "j" 
    return mov 


def doshot(instr): 
    if ("f" in instr): 
     control.press_key('z') 
    if ("f" not in instr): 
     control.release_key('z') 


def dojump(instr): 
    if ("j" in instr): 
     control.press_key('s') 
    if ("j" not in instr): 
     control.release_key('s') 


def domove(): 
    movstr = procxy() 
    doshot(movstr) 
    dojump(movstr) 
    while ("r" in movstr): 
     control.press_key(control.right_key) 
     movstr = procxy() 
     doshot(movstr) 
     dojump(movstr) 
    control.release_key(control.right_key) 
    while ("l" in movstr): 
     control.press_key(control.left_key) 
     movstr = procxy() 
     doshot(movstr) 
     dojump(movstr) 
    control.release_key(control.left_key) 


try: 
    arduino = serial.Serial('/dev/ttyACM1', 9600) 
except: 
    print ("Failed to connect on /dev/ttyACM0") 
while True: 
    x, y, s, j = getxy() 
    domove() 
    print ("X = {0}\nY = {1}".format(x, y)) 

Arduino C код:

int y = 0; 
int x = 0; 
int fire = 0; 
int jump = 0; 
void setup(){ 
    Serial.begin(9600); 
} 

void loop(){ 
    y = analogRead(A0); 
    x = analogRead(A1); 
    fire = analogRead(A2); 
    jump = analogRead(A3); 
    String out = ""; 
    out.concat(x); 
    out.concat("_"); 
    out.concat(y); 
    if(fire > 900) 
    { 
    out.concat("_"); 
    out.concat("f"); 
    } 
    else 
    { 
    out.concat("_"); 
    out.concat("t"); 
    } 
    if (jump > 900) 
    { 
    out.concat("_"); 
    out.concat("j"); 
    } 
    else 
    { 
    out.concat("_"); 
    out.concat("k"); 
    } 
    out.concat("\n"); 
    Serial.print(out); 
} 
+0

Почему analogRead вместо digitalRead для кнопки? Как вы проверяете свой серийный выход? –

+0

@ Ôrel Я использую аналоговое чтение, потому что мои кнопки были изнурительными и включенными. Серийный выход проверяется на первую строку попытки функции GetXY. –

+0

Что я имею в виду, так как вы уверены, что результат хорош, основываясь на нашем коде, вы должны получить несколько строк на секунду. Проверяете ли вы все полученные строки?. –

ответ

0

ошибка, как оказалось, было связано с плохим сопротивлением вызывает Arduino иметь небольшое перенапряжение на это аналог порты и, таким образом, создают помехи. Поскольку джойстик является аналоговым, проблема будет возникать только тогда, когда эта конкретная ось будет более активной, и, следовательно, особенность ошибки будет происходить только тогда, когда символ перемещается вправо.

Смежные вопросы