MATLAB Examples

accKeyboardControl.m demo example.

This example shows how to use Accelerometer on the Engduino as a game controller. The accelerometer data is calculated and mapped to simulate keypress on the keyboard with the use of external Java library for the key mapping.

July 2015, MathWorks & Engduino team: support@engduino.org

Contents

Import External Library

Import Java robot for keyboard control. This Java class is not officially supported by Matlab. Please refer to Java website for more information on this class

import java.awt.Robot;

Initialize variables

Declare the java object

robot = Robot;
% Set reading frequency [Hz] - readings per second.
frequency = 150 ;
% Set the left right steering sensitivity
LRsensitivity = 30;
% Set the up down steering sensitivity
UpDownSensitivity = 10;

% Check if the Engduino object already exists. Otherwise initialize it.
if (~exist('e', 'var'))
    e = engduino('Bluetooth', 'HC-05');
end

Wait to start calculation

while(not(e.getButton()))
    pause(0.1);
end

pause(0.3);

% initialise starting accelerometer position
newReading = e.getAccelerometer();
gx = newReading(1);
gy = newReading(2);
gz = newReading(3);
% set the initial tilt position of the acceleromter
thetaUD_init = atand(gx/gz);

Main loop

while (1)
    % Read acceleration vector from Engduino's accelerometer sensor.
    newReading = e.getAccelerometer();
    gx = newReading(1);
    gy = newReading(2);
    gz = newReading(3);

    % calculate the angle of the resultant acceleration Left Right
    thetaLR = atand(gy/gx);

    % calculate the angle of the resultant acceleration Up Down
    thetaUD = atand(gx/gz);

    % offset the up/down tilt axis
    upDownAxis = thetaUD - thetaUD_init;

    if(thetaLR<-LRsensitivity&&thetaUD<0)
        % Simulate keypress on left arrow key
        robot.keyPress(java.awt.event.KeyEvent.VK_LEFT);
    elseif(thetaLR>LRsensitivity&&thetaUD<0)
        % Simulate keypress on right arrow key
        robot.keyPress(java.awt.event.KeyEvent.VK_RIGHT);
    elseif(thetaLR<-LRsensitivity&&thetaUD>=0)
        % inverse the control when up/down tilt angle >=0
        % Simulate keypress on right arrow key
        robot.keyPress(java.awt.event.KeyEvent.VK_RIGHT);
    elseif(thetaLR>LRsensitivity&&thetaUD>=0)
        % Simulate keypress on left arrow key
        robot.keyPress(java.awt.event.KeyEvent.VK_LEFT);
    else
        % Simulate release of the keypress
        robot.keyRelease(java.awt.event.KeyEvent.VK_LEFT);
        robot.keyRelease(java.awt.event.KeyEvent.VK_RIGHT);
    end

    if(upDownAxis<-UpDownSensitivity)
        % Simulate keypress on down arrow key
        robot.keyPress(java.awt.event.KeyEvent.VK_DOWN);
    elseif (upDownAxis>UpDownSensitivity)
        % Simulate keypress on up arrow key
        robot.keyPress(java.awt.event.KeyEvent.VK_UP);
    else
        % Simulate release of the keypress
        robot.keyRelease(java.awt.event.KeyEvent.VK_UP);
        robot.keyRelease(java.awt.event.KeyEvent.VK_DOWN);
    end

    % Map the button on Engduino to a Key
    if (e.getButton())
        % Simulate keypress on spacebar
        robot.keyPress(java.awt.event.KeyEvent.VK_SPACE);
    elseif (not(e.getButton()))
        % Simulate release of the keypress
        robot.keyRelease(java.awt.event.KeyEvent.VK_SPACE );
    end

    % display the tilt angle calculated
    title(['LeftRight tilt angle: ' num2str(thetaLR, '%.0f'), ...
        ' UpDown tilt angle: ' num2str(thetaUD, '%.0f')]);

    % Pause for one time interval.
    pause(1/frequency);

end