2015-05-20 5 views
0

Я пытаюсь использовать DirectIN Rotary Controller на Mac OS X (yosemite) с помощью PsychoPy2 (версия 1.82.01). Я хотел бы провести двухсторонний эксперимент принудительного выбора и использовать кнопки на кнопке, чтобы ответить; однако я не могу заставить психопата признать устройство.Использование DirectIN Rotary Controller в PsychoPy2 в builder

Кто-то, у кого есть аналогичная проблема, смог сделать окно с кнопками в кодере (see here), и есть аналогичный вопрос, используя другой игровой контроллер here. До сих пор я собрал следующую информацию:

  1. Психопат распознает коробку кнопок в качестве джойстика.
  2. Мне нужно использовать компонент кода в пробной процедуре.

Сообщение от emprisoft форума дает следующий код:

import pyglet 
joysticks = pyglet.input.get_joysticks() 


for joy in joysticks: 
    if joy.device.name == 'Analog Scale Device': 
     joy.open() 
     break 

def present_pair_joystick(trial,isi,curdata): #trial is a sound object, isis is the time to wait after response/end of sound, and curdata is a dictionary used to store response data 
    event.clearEvents() 
    while joy.buttons[0] or joy.buttons[1]: 
     continue 
    curdata['trial_start']=time.time() 
    trial.play() 
    dur = trial.getDuration() 
    while True: 
     if not (joy.buttons[0] and joy.buttons[1]): 
      if joy.buttons[0]: 
       curdata['rt'] = time.time() - curdata['trial_start'] 
       curdata['resp'] = 'Word' 
       break 
      elif joy.buttons[1]: 
       curdata['rt'] = time.time() - curdata['trial_start'] 
       curdata['resp'] = 'Nonword' 
       break 
      if 'escape' in event.getKeys(): 
       core.quit() 
    if time.time() - curdata['trial_start'] > dur: 
     core.wait(isi) 
    else: 
     core.wait((dur - (time.time() - curdata['trial_start'])) + isi) 
    curdata['dur'] = dur 
    return 

Так что я считаю, что я могу получить коробку кнопки, чтобы работать, если я включить этот код в коде компонент в строителе, но у меня есть не имел успеха с этим (я могу запустить эксперимент без ошибок, но ключевые ответы не записываются). Любая помощь будет оценена по достоинству.

ответ

1

Вы говорите, что «я не могу заставить PsychoPy распознавать устройство», но на самом деле не говорю, что вы сделали, поэтому трудно диагностировать проблему.

Простое вложение в код выше не сделает ничего видимого для вас, так как он создает функцию (present_pair_joystick()), которую вы иначе не вызываете явно.

Первый бит кода обращается к джойстику, но не дает вам никакой видимой обратной связи относительно того, удалось ли это сделать, поэтому давайте обратимся к этому вопросу. Я не знаком с джойстиками, поэтому просто изменим код, который вы нашли выше, и предположите, что он уместен. например Поместите это в закладке «Begin Эксперимента» компонента коды:

import pyglet 
joysticks = pyglet.input.get_joysticks() 

joystickFound = False 

for joy in joysticks: 
    if joy.device.name == 'Analog Scale Device': 
     joy.open() 
     joystickFound = True 
     break 

if joystickFound: 
    print('Joystick found!') 
else: 
    print('Joystick NOT found.') 
    core.quit() # no point continuing 

Предполагая, что соединение прошло успешно, то мы можем начать дело с ответами, в начале каждого испытания и при каждом обновлении экрана.

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

Так положить что-то подобное в «Begin Обычной» вкладку компонента кода:

buttonReleased = False 

И что-то вроде этого на вкладке «Каждый кадр»:

# check that the buttons go through a period of NOT being pressed 
# before we check if they HAVE been pressed: 
if not (joy.buttons[0] or joy.buttons[1]): 
    buttonReleased = True # the previous trial's press has been released 

if buttonReleased: 
    response = '' 
    if joy.buttons[0]: 
     response = '0' 
    elif joy.buttons[1]: 
     response = response + '1' # allows you to capture if both buttons pressed simultaneously 

    if response != '': 
     thisExp.addData('buttonResponse', response) # save the response in the data 
     thisExp.addData('buttonRT', t) # store current time since trial start 
     continueRoutine = False # end trial once response received 

event.clearEvents(eventType='joystick') 

Предостережение: Я 'не совсем уверен в размещении вызова clearEvents и не имеет джойстика для проверки этой кнопки при нажатии/отпускании.

+0

Большое спасибо за ваш ответ. Я следовал вашим советам, и эксперимент не удался после ввода информации о участниках. Это результат: nameOfSomeTextComponent.text = 'Ожидание ответа ...' NameError: имя' nameOfSomeTextComponent 'не определено – babylinguist

+0

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

+0

Вам нужно прочитать код, а не просто копировать и вставлять его :-) 'nameOfSomeTextComponent' явно необходимо заменить фактическим именем созданного вами текстового компонента. –