140 likes | 284 Vues
This tutorial introduces key functionalities in MATLAB for precise timing and key press detection using the Psychtoolbox. Learn how to implement the GetSecs function for accurate timing and the KbCheck function to detect key presses and get their timing. Engage with hands-on examples such as a speed test game that measures reaction times and a moving dot task controlled by arrow keys. Enhance your MATLAB programming skills with practical tasks that highlight the power of timing functions and keyboard input handling.
E N D
Introduction To MatlabClass 5 Instructors: Hristiyan (Chris) Kourtev and Xiaotao Su, PhD
Accurate Timing • GetSecs is a psychtoolbox function that provides highly accurate timing. • It returns the number of seconds since the machine has started up • To test precision on your machine, type:GetSecsTick Command Window: a = GetSecs GetSecs – a GetSecs – a GetSecs – a GetSecs – a
KbCheck • KbCheck is used to check if a key is being pressed and to find out what key is being pressed. • Returns three values • [key_press, secs, key_code]=KbCheck
KbCheck • KbCheck is used to check if a key is being pressed and to find out what key is being pressed. • Returns three values • [key_press, secs, key_code]=KbCheck Vector representing all of the input keys. Elements in the vector are set to 1 if pressed or 0 if not Time that this test took place (This is from GetSecs function) 1 or 0 depending on if there was a key press
Speed Test Game disp('NOW!'); timer = GetSecs; while 1 [key_is_down, secs, key_code] = KbCheck; if(key_is_down) break end end elapsed_time = secs - timer; disp(['Your time was ', num2str(elapsed_time)]); end %speed_test.m %tests your reaction time WaitSecs(1); disp('Ready?'); num_sec_to_start = rand*5+1; WaitSecs(num_sec_to_start); too_soon = 0; timer = GetSecs; while ((GetSecs-timer)<num_sec_to_start) ... && (~too_soon) [too_soon, secs, keyCode] = KbCheck; if(too_soon) break; end end if(too_soon) disp('you pressed the key too early'); else
Task 1 • Make it so if someone presses a key too early, the program give a message and exits. (Tip:first remove WaitSecs • [key_press, secs, key_code]=KbCheck Vector representing all of the input keys. Elements in the vector are set to 1 if pressed or 0 if not Time that this test took place (This is from GetSecs function) 1 or 0 depending on if there was a key press
Speed Test Game disp('NOW!'); timer = GetSecs; while 1 [key_is_down, secs, key_code] = KbCheck; if(key_is_down) break end end elapsed_time = secs - timer; disp(['Your time was ', num2str(elapsed_time)]); end %speed_test.m %tests your reaction time WaitSecs(1); disp('Ready?'); num_sec_to_start = rand*5+1; WaitSecs(num_sec_to_start); too_soon = 0; timer = GetSecs; while ((GetSecs-timer)<num_sec_to_start) ... && (~too_soon) [too_soon, secs, keyCode] = KbCheck; if(too_soon) break; end end if(too_soon) disp('you pressed the key too early'); else
What key was pressed? • The third returned value is a vector representing all the keys with 1’s for pressed keys and zeros for keys that aren’t pressed • To find the value of the key, use: key_name = KbName(key_code); This will return a string corresponding to that key_code
Simple program to find key mapping names % get_key_name.m %find out what the name of the key is WaitSecs(1); KbWait; [key_is_down, secs, key_code] = KbCheck; name = KbName(key_code); disp(name);
KbName works the other way around as well As you have seen: • key_name = KbName(key_code); You can also do the following: • return_key = KbName(‘return’); • esc_key = KbName(‘esc’); • up_key = KbName(‘up’); And this will get you the index of the element in the key_code vector that corresponds to that key
key_code vector when esc is pressed esc’s key code is 27 key_code vector: Values: Indexes So, key_code(27) is 1
Exit on esc %exit_on_esc.m esc_key = KbName('esc'); i = 0; while 1 i = i+1 [key_is_down, secs, key_code] = KbCheck; if(key_code(esc_key)) break; end end disp('Good Bye');
Moving Dot %moving_dot.m clear all; screen_setup; up_key = KbName('up'); down_key = KbName('down'); left_key = KbName('left'); right_key = KbName('right'); esc_key = KbName('esc'); shape = [20, 20, 100, 100]; color = [255, 0, 255]; tic whiletoc<10 Screen(window, 'DrawOval', … color, shape); flip; [key_is_down, secs, key_code] … = KbCheck; if(key_code(esc_key)) break end end clear screen;
Task 2 • Make it so the arrow keys will move the dot