My Solution to using a computer efficiently
For when you've figured out everything else except for the existance of the mouse
If you use a computer everyday, then the way you interact with it has a large impact on the amount of time spent on the computer. For example, if all you use your computer for is to check your emails and edit some documents, and you find that on average the amount of time you are spending on the computer is 2 hours per day, then this number is almost completely variable on how you interact with your computer.
- Suppose you know how to touch type, then the amount of time you spend writing your documents on average, should reduce. Although now you'll have more time to think about what you're writing, so that depends. Although you've just reduced the amount of time you have to spend doing a mundane task, and increased the amount of time you spent thinking about what you've written, so that's a win too, your Human Ratio has increased!.
- If you're still hunting and pecking then the amount of time you spend could double
In general, the faster you are at the mundane tasks of using a comptuer, then the less time you have to spend using your computer and the more time you have to think about what you're doing, in other words, increasing your Human Ratio
As you interact with a computer more, you might learn fast ways of inputting text and while you use the keyboard you see that you're reaching a plateau, while on the other hand some programs are making you literally remove one hand from the keyboard to interact with the program. I have seen this so often: you have someone who is able to use their computer almost completely through the keyboard at very high efficiency and then you throw a gui program at them and their efficiency lowers drastically, they might argue "But who needs gui programs", well they probably do if they at least browse the web, we are not at a point right now where editing an image through the commandline is going to be more efficent then with a mouse, maybe it is for very simple tasks like cropping or changing the color, but finding exact placements and looking at the result while editing is going to be hard.
- This is not a rant against people who would rather use the terminal to do perform tasks which can also be completed via a gui, I also would much rather if there existed a method of editing photos which uses only keyboard input and is as efficient as the gui with a mouse
There are some solutions, such as key nav which lets you warp your mouse around the screen by using the keyboard, as well as using keyboards similar to the ones you find on lenovo computers, aka: they have the trackpoint, but mechanical keyboards with trackpoints will break the bank, plus keyboards should focus on being keyboards and do that well not split 50% of the quality onto the mouse and 50% of the quality to the keyboard, if they are putting effort into a trackpoint on the keyboard, then that is effort that could have been used to make the keyboard itself better.
So what if you could keep your fingers on the homerow of the keyboard, while also having the abililty to use the mouse and not have to buy a new special keyboard or learn a total new way of controlling the mouse? Well now you can with this!
Oops, I mean:
Before I put rubber over the pins it felt like that sometimes, now it is fine.
How does this work?
- We will place the device between the keyboard and a wrist rest so that it can be operated using our two thumbs. This allows the user to completely operator the computer without moving their arm/hand to a new position.
- The image above is a shield, it attches on the top of an arduino uno, although I'm sure you can get any joystick type device to work correctly with the right amount of work
- At a high level, we will move the joystick and it will move the mouse on the screen, we will map the the other buttons to the default mouse controls, also note that since there are more buttons on this device than on a usual mouse we can implement more functionality.
- At a lower level, we will use a python program to read the input from the device, once we get the input into our program we are free to do as we please with the input
- Therefore we will have two programs, one that reads the input from the "mouse" and sends it elsewhere, the other one will read that input and do as it pleases(python)
What will you need
- An arduino - I am using the UNO
- A joystick shield for your arduino - I am using the one that is in that picture directly
- The arduino IDE to load the program onto the arduino
- The python programming language and the packages: serial, pyautogui, numpy (for vectors, as in linear algebra)
What to do
- Load the project onto the arudino
- Run the python file mouse.py
- You can now operate the mouse with the joystick
The hardware side
- The arduino program sets up serial data flow
- The joystick data looks like an x,y coordinate from 0 to 1024, we will instead subtract -512 from whatever the data looks like so that it ranges from -512 to 512 for symmetry, note in the code I had to subtract 14 and 7 to perfectly center my joystick as there were imperfections at it's resting state.
- Next we get the button data by encoding which buttons are pressed into a binary number, if the i-th position in the binary representation of the number is a one, than that means that the button corresponding to i is being pressed. This allows us to encode the state of all seven buttons in a number which is at most 2^7 - 1 = 127
- Then the data is sent through serial in the format x,y,buttonStates
The software side
- There are a 2 classes, mouse and button, the mouse object has a one to many relationship with the buttons
- Knows if it can repeat the action, or only does it once when it's pressed down. It has both a down action and up action, most of the time when it comes back up nothing occurs and the action is over, it knows when it's pressed down, counts the number of times it is pressed and stores it original settings
- It can reset to it's original settings
- It can run it's down or up action and has different behavior based on if it is a repeating action (like a scroll, aka: scoll until I let go)
- It's base speed coefficient
- It's current speed coefficient
- It's alternative speed coefficients (normal, fast slow)
- It has a movement function which can put acceleration on the mouse (unused right now)
- It's list of buttons
- Scrolling options
- It's current mode (scrolling, speed control, auto scrolling)
- Take the x,y data from arduino, turn into vector, normalize the vector apply the speed (and optionally a movevemnt function) and then move the mouse that much. Uses a dead zone.
- Performs automatic operations: If in autoscroll mode, start scrolling without any user input
- Set the mouse speed
- Revert to the original mouse state
- Switch to various modes (as mentioned in what a mouse knows)
The program is not perfect, if you see any way to improve it please send me an email (find it on the main page) or make a pull request with the change!
How to use it
- I made a video about how to use the mouse, you can watch it on my diode.zone peertube account or youtube account, both can be found on the main page of the site