parent
d388d116af
commit
d0e08458f4
@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* AUTHOR: Thomas Ballantine
|
||||||
|
* Website: thomasballantine.com
|
||||||
|
* Licence: GNU Lesser General Public License v3.0
|
||||||
|
* Created: 19/05/2023
|
||||||
|
*
|
||||||
|
* A program to enable usage of a Nintendo Wii Nunchuk as a computer mouse
|
||||||
|
* All design and test carried out using an MKR1000 and 2 nunchuks, one genuine,
|
||||||
|
* one fake, on Arduino IDE 1.8.19
|
||||||
|
* For SAMD usage, roll back to Arduino SAMD boards 1.6.21 in board manager as per
|
||||||
|
* https://github.com/arduino/ArduinoCore-samd/issues/423
|
||||||
|
*
|
||||||
|
* Inspiration:
|
||||||
|
* https://www.raphnet.net/electronique/wusbmote/index_en.php
|
||||||
|
*
|
||||||
|
* Please get in touch if you make this spaghetti work better
|
||||||
|
* At present all values are hard coded, adjust as necessary for your needs
|
||||||
|
*
|
||||||
|
* TODO: Implement proper scrolling. Perhaps use accelerometer?
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <WiiChuck.h> //Can be found in Library manager
|
||||||
|
#include <Mouse.h> //Arduino builtin library
|
||||||
|
int mouse_x_axis = 0;
|
||||||
|
int mouse_y_axis = 0;
|
||||||
|
int flag_1 = 0;
|
||||||
|
int flag_z = 0;
|
||||||
|
int flag_c = 0;
|
||||||
|
//https://github.com/arduino/ArduinoCore-samd/issues/423 Must use Arduino SAMD boards 1.6.21 to compile
|
||||||
|
Accessory nunchuck;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Mouse.begin();
|
||||||
|
nunchuck.begin();
|
||||||
|
if (nunchuck.type == Unknown) {
|
||||||
|
nunchuck.type = NUNCHUCK;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
nunchuck.readData(); // Read inputs
|
||||||
|
|
||||||
|
// Determining mouse movement amounts from joystick values
|
||||||
|
//Only 2 levels of speed here, nunchuk doesn't have great sensitivity
|
||||||
|
if (nunchuck.getJoyX() > 140) mouse_x_axis = 1;
|
||||||
|
if (nunchuck.getJoyX() > 170) mouse_x_axis = 3;
|
||||||
|
if (nunchuck.getJoyX() < 116) mouse_x_axis = -3;
|
||||||
|
if (nunchuck.getJoyX() < 88) mouse_x_axis = -1;
|
||||||
|
if (nunchuck.getJoyY() > 140) mouse_y_axis = -1;
|
||||||
|
if (nunchuck.getJoyY() > 170) mouse_y_axis = -3;
|
||||||
|
if (nunchuck.getJoyX() < 116) mouse_y_axis = 1;
|
||||||
|
if (nunchuck.getJoyY() < 88) mouse_y_axis = 3;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Lots of ifs here, to set and unset the press/release flags
|
||||||
|
//Works much smoother than when it was using the mouse.click() method
|
||||||
|
if (nunchuck.getButtonZ() == 1 && nunchuck.getButtonC() == 0){
|
||||||
|
Mouse.press(MOUSE_RIGHT);
|
||||||
|
flag_z = 1;
|
||||||
|
if (flag_1 == 1){
|
||||||
|
Mouse.release(MOUSE_MIDDLE);
|
||||||
|
flag_1 = 0;
|
||||||
|
}
|
||||||
|
if (flag_c == 1){
|
||||||
|
Mouse.release();
|
||||||
|
flag_c = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (nunchuck.getButtonC() == 1 && nunchuck.getButtonZ() == 0){
|
||||||
|
Mouse.press();
|
||||||
|
flag_c = 1;
|
||||||
|
if (flag_1 == 1){
|
||||||
|
Mouse.release(MOUSE_MIDDLE);
|
||||||
|
flag_1 = 0;
|
||||||
|
}
|
||||||
|
if (flag_z == 1){
|
||||||
|
Mouse.release(MOUSE_RIGHT);
|
||||||
|
flag_z = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (nunchuck.getButtonC() == 1 && nunchuck.getButtonZ() == 1){
|
||||||
|
Mouse.press(MOUSE_MIDDLE);
|
||||||
|
flag_1 = 1;
|
||||||
|
if (flag_z == 1){
|
||||||
|
Mouse.release(MOUSE_RIGHT);
|
||||||
|
flag_z = 0;
|
||||||
|
}
|
||||||
|
if (flag_c == 1){
|
||||||
|
Mouse.release();
|
||||||
|
flag_c = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nunchuck.getButtonC() == 0 && nunchuck.getButtonZ() == 0){
|
||||||
|
if (flag_1 == 1){
|
||||||
|
Mouse.release(MOUSE_MIDDLE);
|
||||||
|
flag_1 = 0;
|
||||||
|
}
|
||||||
|
if (flag_c == 1){
|
||||||
|
Mouse.release();
|
||||||
|
flag_c = 0;
|
||||||
|
}
|
||||||
|
if (flag_z == 1){
|
||||||
|
Mouse.release(MOUSE_RIGHT);
|
||||||
|
flag_z = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Mouse.move(mouse_x_axis, mouse_y_axis,0); //sending mouse movement data
|
||||||
|
mouse_x_axis = 0; //resetting the mouse movements
|
||||||
|
mouse_y_axis = 0;
|
||||||
|
delay(5); // polling at about 200Hz, plenty fast enough for anyone
|
||||||
|
}
|
Loading…
Reference in new issue