Difference between revisions of "WiiMouse"
From Mech
Jump to navigationJump to search| Line 10: | Line 10: | ||
==MATLAB Code== |
==MATLAB Code== |
||
The initialization code opens up a graphical user interface with a single button, allowing the user to turn on and off mouse control. The figure that is called can be found here. |
|||
<pre> |
<pre> |
||
function varargout = wiimouse(varargin) |
function varargout = wiimouse(varargin) |
||
| Line 45: | Line 47: | ||
% --- Executes on button press in pushbutton1. |
% --- Executes on button press in pushbutton1. |
||
function pushbutton1_Callback(hObject, eventdata, handles) |
function pushbutton1_Callback(hObject, eventdata, handles) %When button is clicked, do the following: |
||
delete(instrfind) |
delete(instrfind) |
||
if get(hObject, 'Value') |
if get(hObject, 'Value') %If button was toggled on: |
||
import java.awt.*; |
import java.awt.*; %Java bot that simulates mouse clicks |
||
import java.awt.event.*; |
import java.awt.event.*; %Java bot that simulates mouse clicks |
||
rob=Robot; |
rob=Robot; %Assign Java bot functions to variable Rob |
||
s = serial('COM7','BAUD',9600); |
s = serial('COM7','BAUD',9600); %Pick serial port sets |
||
fopen(s) |
fopen(s) %Open Serial port |
||
set(hObject, 'String', 'Stop Mouse control') |
set(hObject, 'String', 'Stop Mouse control') %Change text in button to "Stop Mouse Control" |
||
hold_but = [0 0]; %Initialize with no buttons being held down |
hold_but = [0 0]; %Initialize with no buttons being held down |
||
screen_res = get(0, 'ScreenSize'); %Get screen resolution |
screen_res = get(0, 'ScreenSize'); %Get screen resolution |
||
| Line 62: | Line 64: | ||
%~~~Main Loop of Program~~~ |
%~~~Main Loop of Program~~~ |
||
while 1 |
while 1 %Keep running indefinitely |
||
if ~get(handles.pushbutton1, 'Value'); |
if ~get(handles.pushbutton1, 'Value'); %If the button is toggled to off: |
||
set(hObject, 'String', 'Start Mouse control') |
set(hObject, 'String', 'Start Mouse control') %Change button text bacl to "Start Mouse Control" |
||
s = serial('COM7','BAUD',9600); %Get serial port settings |
s = serial('COM7','BAUD',9600); %Get serial port settings |
||
fclose(instrfind); |
fclose(instrfind); %Close the serial port |
||
delete(instrfind); |
delete(instrfind); %Delete the serial port |
||
break; |
break; %End While loop |
||
end |
end |
||
%~~~Get Serial Data~~~ |
%~~~Get Serial Data~~~ |
||
serial_data = fscanf(s); |
serial_data = fscanf(s); %Import serial data in the format 'Xdata Ydata LeftClick RightClick MouseMove' |
||
serial_data = str2num(serial_data); |
serial_data = str2num(serial_data); %Turn the serial data into numbers, a 5 x 1 matrix |
||
if length(serial_data) ~=5 %If bad data comes in. |
if length(serial_data) ~=5 %If bad data comes in. |
||
serial_data = fscanf(s); %Rescan |
serial_data = fscanf(s); %Rescan |
||
| Line 138: | Line 140: | ||
%~~~Handle Left and Right Mouse Clicks~~~ |
%~~~Handle Left and Right Mouse Clicks~~~ |
||
if serial_data(3) && ~hold_but(1) |
if serial_data(3) && ~hold_but(1) %If a left click is detected, and the left button is not already down |
||
rob.mousePress(InputEvent.BUTTON1_MASK); |
rob.mousePress(InputEvent.BUTTON1_MASK); %Using Java bot, left click down |
||
hold_but(1) = 1; %Remember that the left click is down |
hold_but(1) = 1; %Remember that the left click is down |
||
elseif ~serial_data(3) && hold_but(1) %If the left click is not detected, and the left button was previously down |
elseif ~serial_data(3) && hold_but(1) %If the left click is not detected, and the left button was previously down |
||
rob.mouseRelease(InputEvent.BUTTON1_MASK); |
rob.mouseRelease(InputEvent.BUTTON1_MASK); %Using Java bot, left click up |
||
hold_but(1) = 0; %Remember that the left click is up |
hold_but(1) = 0; %Remember that the left click is up |
||
elseif serial_data(4) && ~hold_but(2) %If the right click is detected, and it is not already down |
elseif serial_data(4) && ~hold_but(2) %If the right click is detected, and it is not already down |
||
rob.mousePress(InputEvent.BUTTON3_MASK); |
rob.mousePress(InputEvent.BUTTON3_MASK); %Using Java bot, right click down |
||
hold_but(2) = 1; %Remember that the right click is down |
hold_but(2) = 1; %Remember that the right click is down |
||
elseif serial_data(4) && hold_but(2) %If the right click is no longer detected, and the button was previously down |
elseif serial_data(4) && hold_but(2) %If the right click is no longer detected, and the button was previously down |
||
rob.mouseRelease(InputEvent.BUTTON3_MASK); |
rob.mouseRelease(InputEvent.BUTTON3_MASK); %Using Java bot, right click up |
||
hold_but(3) = 0; %Remember that the right click is up |
hold_but(3) = 0; %Remember that the right click is up |
||
end |
end |
||
Revision as of 15:09, 13 March 2008
The WiiMouse
Introduction
Components
Circuit Diagram
PIC Code
MATLAB Code
The initialization code opens up a graphical user interface with a single button, allowing the user to turn on and off mouse control. The figure that is called can be found here.
function varargout = wiimouse(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @wiimouse_OpeningFcn, ...
'gui_OutputFcn', @wiimouse_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before wiimouse is made visible.
function wiimouse_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
delete(instrfind)
% --- Outputs from this function are returned to the command line.
function varargout = wiimouse_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles) %When button is clicked, do the following:
delete(instrfind)
if get(hObject, 'Value') %If button was toggled on:
import java.awt.*; %Java bot that simulates mouse clicks
import java.awt.event.*; %Java bot that simulates mouse clicks
rob=Robot; %Assign Java bot functions to variable Rob
s = serial('COM7','BAUD',9600); %Pick serial port sets
fopen(s) %Open Serial port
set(hObject, 'String', 'Stop Mouse control') %Change text in button to "Stop Mouse Control"
hold_but = [0 0]; %Initialize with no buttons being held down
screen_res = get(0, 'ScreenSize'); %Get screen resolution
origin = [51 35]; %Pick mouse origin (when accx and accy produce min position)
buffx = []; %Initialize position buffer in x direction
buffy = []; %Initialize position buffer in y direction
end
%~~~Main Loop of Program~~~
while 1 %Keep running indefinitely
if ~get(handles.pushbutton1, 'Value'); %If the button is toggled to off:
set(hObject, 'String', 'Start Mouse control') %Change button text bacl to "Start Mouse Control"
s = serial('COM7','BAUD',9600); %Get serial port settings
fclose(instrfind); %Close the serial port
delete(instrfind); %Delete the serial port
break; %End While loop
end
%~~~Get Serial Data~~~
serial_data = fscanf(s); %Import serial data in the format 'Xdata Ydata LeftClick RightClick MouseMove'
serial_data = str2num(serial_data); %Turn the serial data into numbers, a 5 x 1 matrix
if length(serial_data) ~=5 %If bad data comes in.
serial_data = fscanf(s); %Rescan
serial_data = str2num(serial_data); %Turn into number array
end
pause(0.02) %Pause to allow time to loop through
%~~~Move Mouse~~~
if length(serial_data)~=5 %If good data is still didn't come through
serial_data(5) = 0; %Make all missing values zero
end
if ~serial_data(5) %If the side toggle button is not pressed
if length(buffx) <10 %If the buffer has not been filled yet
buffx = [buffx serial_data(1)]; %Add the new serial x value to the buffer
buffy = [buffy serial_data(2)]; %Add the new serial y value to the buffer
else %If the buffer has been filled
buffx = [buffx(2:10) serial_data(1)]; %Delete the first point, add a new point to the end
buffy = [buffy(2:10) serial_data(2)]; %Delete the first point, add a new point to the end
end
accx = mean(buffx); %Get the average of all buffered values
accy = mean(buffy); %Get the average of all buffered values
lastpt = get(0, 'PointerLocation'); %Get te previous cursor position
posx = 5*(accx) + origin(1); %Scaling factor for x, and translation
posy = 5*(accy) + origin(2); %Scaling factor for y, and translation
diffx = posx - lastpt(1); %Get difference between last point and new point in x
diffy = posy - lastpt(2); %Get difference between last point and new point in y
nx=0; %Reset x movement step size
ny=0; %Reset y movement step size
if abs(diffx)> 15 %If the change in x position is large enough
if lastpt(1) > posx %If the movement is negative
nx = -1; %Make the x step size -1
else
nx = 1; %If movement is positive, make x step size + 1
end
end
if abs(diffy)> 15 %If the change in y position is large enough
if lastpt(2) > posy %If the movement is negative
ny = -1; %Make the y step size -1
else
ny = 1; %If movement is positive, make y step size + 1
end
end
for i= lastpt(2):ny:posy
set(0, 'PointerLocation', [lastpt(1) i]) %This interpolates and moves cursor between actual acquired data
end
for i= lastpt(1):nx:posx
set(0, 'PointerLocation', [i posy]) %This interpolates and moves cursor between actual acquired data
end
else %If the red side button is pressed
accx = serial_data(1); %Still save acceleration data in x
accy = serial_data(2); %Still save acceleration data in y
origin(1) = posx - 5*accx; %Set the new origin based on new position, and current acceleration value
origin(2) = posy - 5*accy; %Set new origin in y direction
buffx = []; %Reset the buffer
buffy = []; %Reset the buffer
end
%~~~Handle Left and Right Mouse Clicks~~~
if serial_data(3) && ~hold_but(1) %If a left click is detected, and the left button is not already down
rob.mousePress(InputEvent.BUTTON1_MASK); %Using Java bot, left click down
hold_but(1) = 1; %Remember that the left click is down
elseif ~serial_data(3) && hold_but(1) %If the left click is not detected, and the left button was previously down
rob.mouseRelease(InputEvent.BUTTON1_MASK); %Using Java bot, left click up
hold_but(1) = 0; %Remember that the left click is up
elseif serial_data(4) && ~hold_but(2) %If the right click is detected, and it is not already down
rob.mousePress(InputEvent.BUTTON3_MASK); %Using Java bot, right click down
hold_but(2) = 1; %Remember that the right click is down
elseif serial_data(4) && hold_but(2) %If the right click is no longer detected, and the button was previously down
rob.mouseRelease(InputEvent.BUTTON3_MASK); %Using Java bot, right click up
hold_but(3) = 0; %Remember that the right click is up
end
end