Arduino Mouse Wiggler

13K2548

Intro: Arduino Mouse Wiggler

It is kind of annoying every time when the computer goes into sleep, especially when you are in the middle of a PowerPoint presentation, or working from home but supposed to appear available online all the time. This simple device will wiggle (jiggle) your mouse for you every 30 seconds or so and keep your computer always awake. This device simply simulates the physical mouse movement, there's no App or driver to be installed, so it is 'stealth' and won't violate the company IT policy or expose yourself to dangerous software.

STEP 1: Make the Device

The entire mouse wiggler is 3D printed. The files are attached. Print the parts with your favorite color.

STEP 2: Hardware and Assembly

The mouse wiggler uses parts that are available from many retailers. Following hardware are needed:

  • Arduino Nano (or clone,don't solder the pins to the Nano)
  • SG90 Servo and hardware pack
  • Mini USB cable
  • Some wires

Following are the steps to wire the servo to the Arduino Nano and installation of the servo and wheel.

The servo has a connector with 3 female pins. The orange one is the PMW pin that needs to be connected to the D9 pin on the Arduino Nano. The center Red wire is Vcc that goes to the +5V on the Nano and the Brown is ground that is connected to the GND on the nano. I used 3 male pins and soldered it to the wires from the Nano to make the wiring easier.

Use one of the servo horn and the screws to secure the SG90 servo to the mouse wiggler body, and install the wheel on the servo output. Make sure the wheel is level and does not interfere with the mouse. Optionally you can print the pattern and place it on top of the wheel to improve aesthetics and make the mouse move more consistent. I used white address labels for this.

STEP 3: Code

The Arduino sketch is attached. Make sure you have the Servo.h and SimpleTimer.h libraries installed before uploading the sketch to your nano. You may change the angle in which the servo will travel, and the time interval that the servo will move. The default setting is the servo will move the wheel 30 degrees to the left then 30 degrees to the right every 30 seconds. This will make your mouse move for about 10 mm which is enough for keeping the computer from sleep, yet not too much to lost track of the mouse cursor. You may adjust these values as you desire.

STEP 4: Let the Mouse Move


Place your mouse on top of the Mouse Wiggler and make sure the optical sensor on top of the wheel. Power the device up use a USB power adapter and you're good to go.

30 Comments

I've update my code. I discovered that detaching the servo between moves eliminates the servo 'buzz' that often occurred. I also wanted a random move time, so set a min and max time to create a random move time.

I then went overboard and put in a load of (unnecessary) serial debug info which can be enabled by uncommenting 1 line :)

New code:

/**This is a modified version of the code found at:
https://www.instructables.com/Arduino-Mouse-Wiggl...
*/
#include <Servo.h>
#include <SimpleTimer.h>

int servoPin = 9; //Servo attached to in 9
int mousePos = 20; // set the limit of mouse move (20 was plenty for me)

//Comment out the following 2 lines if you only need a repeating 30 second timer
#define MinimumTime 45 //Minimum time (in seconds) between mouse movements
#define MaximumTime 210 //Maximum time (in seconds) between mouse movements

Servo servo;
int angle = 0; // servo position in degrees

SimpleTimer timer(30000L); //This is how to decalre a 30 second timer with the version of SimpleTimer used

//Uncomment this if you want debug messages sent to the Serial Monitor
//#define DebugInfo

void setup()
{
#ifdef DebugInfo
Serial.begin(115200);
Serial.println("Serial output enabled.");
#endif

servo.attach(servoPin); //Attach the servo
servo.write(0); // Set Servo to 0 degrees
delay(15);

#ifdef DebugInfo
Serial.println("Servo set to 0 degrees.");
#endif

servo.detach(); //Detaching when not in use seems to prevent servo chatter/buzzing

randomSeed(analogRead(0)); //Get as close ro a random number as easily possible
}

void loop()
{
if (timer.isReady()) //Check if Simple Timer has reached it's trigger time
{
//Mouse Move
servo.attach(servoPin);

#ifdef DebugInfo
if (servo.attached())
{
Serial.println("Servo attached.");
}
else
{
Serial.println("Servo failed to attach.");
}
#endif

// scan from 0 to mousePos degrees
for(angle = 0; angle <= mousePos; angle++)
{
servo.write(angle);
delay(15);
}
// now scan back from mousePos to 0 degrees
for(angle = mousePos; angle >= 0; angle--)
{
servo.write(angle);
delay(15);
}

#ifdef DebugInfo
Serial.println("Servo move complete.");
#endif

servo.detach();

#ifdef DebugInfo
if (!servo.attached())
{
Serial.println("Servo detached.");
}
else
{
Serial.println("Servo failed to detach.");
}
#endif

#ifdef MinimumTime //only use random time if Min and Max are defined
#ifdef MaximumTime
#ifdef DebugInfo
long RandomTime = random(MinimumTime, MaximumTime);
timer.setInterval((RandomTime*1000));
Serial.print("Next Activation: "); Serial.print(RandomTime);Serial.println(" seconds.");
#else
timer.setInterval((random(MinimumTime, MaximumTime)*1000));
#endif
#endif
#else
#ifdef DebugInfo
Serial.println("30 second timer used.");
#endif
#endif

timer.reset(); //Restart the timer
}
}
I downloaded the code and when I try to compile / verify it I get the error message SimpleTimer.h: no such file or directory.
Have you installed simple timer? If you're using the Arduino IDE you'll find it by clicking Sketch then Include Library then Manage Libraries. Type in SimpleTimer (no spaces) and one by Alexander Kiryanenko will appear. That's the one I used.

You'll probably find it on GitHub too.
Thank you for the information.

Ed
Hey great project, I have run into a snag while compiling the Arduino sketch. I received this error and was wondering if anybody knew how to fix it. The code seems right and is unchanged, so it could be a version issue. ANy help is appreciated, Thanks!
Same error here. The modified code I posted in another comment works.
It looks like you might be trying to use a different version of SimpleTimer. You can obtain a compatible version of the SimpleTimer used from Arduino Playground. https://playground.arduino.cc/Code/SimpleTimer/#Ge...

You just need to get the SimpleTimer.ccp file and the SimpleTimer.h file. Then replace one line in the main code that is posted in the article.

In the main code, change the include line to:
#include "SimpleTimer.h"

See images below:
Hi, its the second "wiggler" I am trying to make after the long break. I am doing everything the same as last time but no success this time. Need some help here please..
I'm 4 months later to the party but I had the same error when I used the SimpleTimer downloaded from the Arduino Library Manager.

I've posted code that works in another comment.
Try moving the entire function of "void mouseMove" above the "void setup" function and then compile. See attached image for example. Hope that helps.
Hey did you ever figure this out?
Looks there are some grammatical errors in your sketch. Did you try to download the sketch again? The article hasn't changed since it was published.
This code will work for the version of SimpleTimer that I got from the Ardiono Library Manager:

/**This is a modified version of the code found at:
https://www.instructables.com/Arduino-Mouse-Wiggler/
*/
#include <Servo.h>
#include <SimpleTimer.h>
int servoPin = 9;
int mousePos = 20; // set the limit of mouse move (20 degrees was plenty for me)
Servo servo;
SimpleTimer timer(30000L); //This is how to decalre a 30 second timer with the version of SimpleTimer used
int angle = 0; // servo position in degrees
void setup()
{
servo.attach(servoPin);
servo.write(0); // Set Servo to 0 degrees
}
void mouseMove()
{
// scan from 0 to mousePos degrees
for(angle = 0; angle <= mousePos; angle++)
{
servo.write(angle);
delay(15);
}
// now scan back from mousePos to 0 degrees
for(angle = mousePos; angle >= 0; angle--)
{
servo.write(angle);
delay(15);
}
}
void loop()
{
//Thetimer.run() line is replaced by this code which triggers the mouse when the timer reaches 30 seconds
if (timer.isReady()) {
mouseMove();
timer.reset(); //Reset the timer
}
}

could you put out the code in the article because i cant open the file.

I just tried the sketch can be downloaded without issue. It can be opened by Arduino IDE, or a text editor.

Could you send me an email or something because the computer I use cannot open the file.
*email text file of the code or a picture of the code
You can open the file with Notepad++

Here is the code:

/**The MIT License (MIT)
Copyright (c) 2017 by Bin Sun
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include <Servo.h>
#include <SimpleTimer.h>
int servoPin = 9;
int mousePos = 30; // set the limit of mouse move
Servo servo;
SimpleTimer timer;
int angle = 0; // servo position in degrees
void setup()
{
servo.attach(servoPin);
timer.setInterval(30000L, mouseMove); //wiggle every 30 seconds
}
void mouseMove()
{
// scan from 0 to mousePos degrees
for(angle = 0; angle < mousePos; angle++)
{
servo.write(angle);
delay(15);
}
// now scan back from mousePos to 0 degrees
for(angle = mousePos; angle > 0; angle--)
{
servo.write(angle);
delay(15);
}
}
void loop()
{
timer.run(); //Initiate SimpleTimer
}

just get an Atmega32u4 and send mouse commands. no empty mouse batteries, no loud servo, 1-2 lines of code in the loop

I'd be interested in this, you should do an instructable on it.
More Comments