Article under construction!
To install xdotool:
sudo apt install xdotool
Bash script (save as “airmouse” and “chmod 755 airmouse” to make it executable):
#!/bin/bash # Run these commands first in terminal (as root) # # stty -F /dev/ttyUSB0 raw # cat /dev/ttyUSB0 | ./airmouse # # Process input characters from arduino (u,d,l,r,c) while true; do read -n 1 INPUT if [ "$INPUT" = "u" ]; then xdotool mousemove_relative -- 0 -10 elif [ "$INPUT" = "d" ]; then xdotool mousemove_relative -- 0 10 elif [ "$INPUT" = "l" ]; then xdotool mousemove_relative -- -10 0 elif [ "$INPUT" = "r" ]; then xdotool mousemove_relative -- 10 0 elif [ "$INPUT" = "c" ]; then xdotool click 1 fi done
Arduino code:
// // AirMouse - Ted Burke - 2/4/2019 // void setup() { pinMode(2, OUTPUT); Serial.begin(9600); set_state(1); } int state = 1; unsigned long t; int direction = 0; // 0:up, 1:down, 2:left, 3:right void set_state(int n) { state = n; t = millis(); } void loop() { int v; unsigned long elapsed; delay(50); v = analogRead(7); elapsed = millis() - t; // time elapsed since entering current state if (state == 1) // STATE 1: WAIT FOR INPUT { digitalWrite(2, LOW); if (v > 512) set_state(2); } else if (state == 2) // STATE 2: IS THIS A CLICK OR A MOVE? { digitalWrite(2, HIGH); if (v <= 512) set_state(3); if (elapsed >= 200) set_state(4); } else if (state == 3) // STATE 3: SEND A CLICK { digitalWrite(2, LOW); Serial.print("c"); delay(250); set_state(1); } else if (state == 4) // STATE 4: MOVE MOUSE { digitalWrite(2, HIGH); if (v <= 512) set_state(5); else if (direction == 0) Serial.print("u"); else if (direction == 1) Serial.print("d"); else if (direction == 2) Serial.print("l"); else if (direction == 3) Serial.print("r"); } else if (state == 5) // STATE 5: CHANGE MOUSE DIRECTION { digitalWrite(2, LOW); direction = (direction + 1)%4; set_state(1); } }