Arduino Leonardo + Joystick tietokoneen hiirenä

Kurssin viimeisenä tehtävänä oli tehdä jokin Arduino-projekti.Aiheeksi valitsin tietokoneen hiiren tekemisen Arduino Leonardon ja joystickin avulla.

Aloitus

Asensin ensiksi Arduino IDE:n Linux Arch:iin näiden ohjeiden mukaisesti.

Eli ensiksi latasin .tar.gz-paketin AUR:sta, joka sisältää tarvittavat tiedostot IDE:n asentamiseen

Tämän jälkeen purin ladatut tiedostot ja siirryin purettuun kansioon

$ tar zxvf arduino.tar.gz && cd arduino

Tämän jälkeen päivitin pakettivarastot hakemalla

$ sudo pacman -Syy # toinen y-kirjain tarkoituksena on hakea paketit uudestaan vaikka ne olisivat vasta haettu

Sitten tein perutuista tiedostoista asennuspaketin, joka voidaan pacmanilla asentaa.

$ makepkg -s  # Puretussa arduino-kansiossa. 
              # Ja kysymykseen vastasin yes
$ sudo pacman -U arduino-1\:1.0.4-1-x86_64.pkg.tar.xz

Asennuksen jälkeen lisäsin itseni tarvittavaan ryhmään ja kirjauduin ulos ja takaisin sisään.

# gpasswd -a <user> uucp

Tämän jälkeen kokeilin käynnistää arduino IDE:n, mutta komentopäätteessä oli ohjeissa mainittu omistajuusongelma, jonka takia jouduin muuttamaan oikeuksia. Sammutin ensin IDE:n ja sen jälkeen komensin:

# chown <user> /run/lock # HUOM! Tämä täytyy tehdä aina käynnistyksen 
                         # jälkeen, jos muutosta ei tehdä vakituiseksi. (En itse tehnyt).

Tämän jälkeen käynnistin IDE:n uudestaan ja se toimi hiukkasen heikosti, mutta kuitenki tarpeeksi hyvin. Esimerkiksi porttien ja piirin valitsemisessa oli vaikeuksia, mutta loppujen lopuksi sain toimimaan.

Kytkentöjen teko

Kytkentöjen tekemiseen menikin jonkin verran aikaa, mutta loppujen lopuksi onnistuin. Nappina minulla oli kuvasta poiketen kolmijalkainen Keyes-painike, jonka kuvaa ei kuitenkaa löytynyt Fritzing-ohjelmasta.

arduinoJoyMouse_bb

Ohjelman koodina käytin Arduinon sivuilta löytyvää oletuskoodia.

 

/*
JoystickMouseControl
created 15 Sept 2011
updated 28 Mar 2012
by Tom Igoe

this code is in the public domain

*/

// set pin numbers for switch, joystick axes, and LED:
const int switchPin = 2;      // switch to turn on and off mouse control
const int mouseButton = 3;    // input pin for the mouse pushButton
const int xAxis = A0;         // joystick X axis
const int yAxis = A1;         // joystick Y axis
const int ledPin = 13;         // Mouse control LED

// parameters for reading the joystick:
int range = 12;               // output range of X or Y movement
int responseDelay = 5;        // response delay of the mouse, in ms
int threshold = range/4;      // resting threshold
int center = range/2;         // resting position value

boolean mouseIsActive = false;    // whether or not to control the mouse
int lastSwitchState = LOW;        // previous switch state

void setup() {
pinMode(switchPin, INPUT);       // the switch pin
pinMode(ledPin, OUTPUT);         // the LED pin
// take control of the mouse:
Mouse.begin();
}

void loop() {
// read the switch:
int switchState = digitalRead(switchPin);
// if it's changed and it's high, toggle the mouse state:
if (switchState != lastSwitchState) {
if (switchState == HIGH) {
mouseIsActive = !mouseIsActive;
// turn on LED to indicate mouse state:
digitalWrite(ledPin, mouseIsActive);
}
}
// save switch state for next comparison:
lastSwitchState = switchState;

// read and scale the two axes:
int xReading = readAxis(A0);
int yReading = readAxis(A1);

// if the mouse control state is active, move the mouse:
if (mouseIsActive) {
Mouse.move(xReading, yReading, 0);
}

// read the mouse button and click or not click:
// if the mouse button is pressed:
if (digitalRead(mouseButton) == HIGH) {
// if the mouse is not pressed, press it:
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT);
}
}
// else the mouse button is not pressed:
else {
// if the mouse is pressed, release it:
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
}

delay(responseDelay);
}

/*
reads an axis (0 or 1 for x or y) and scales the
analog input range to a range from 0 to <range>
*/

int readAxis(int thisAxis) {
// read the analog input:
int reading = analogRead(thisAxis);

// map the reading from the analog input range to the output range:
reading = map(reading, 0, 1023, 0, range);

// if the output reading is outside from the
// rest position threshold,  use it:
int distance = reading - center;

if (abs(distance) < threshold) {
distance = 0;
}

// return the distance for this axis:
return distance;
}

Projektin jatkuminen

Projekti jatkuu vielä koulun aikana niin että lopuksi hiirtä tulee käyttämään asiakas, joka ei tällä hetkellä voi käyttää tietokonetta ollenkaa.

Projektiin tarvitsen vielä kaksi painiketta, jotka tulevat toimimaan aluksi PageUp- ja PageDown -painikkeina, jotta asiakas voi selata nettisivuja helpommmin.

Ja tarkoituksena on myös tulevaisuudessa kokeilla löytää helpompi tapa kirjoittaa tekstiä tietokoneella kuin puhallus-imemistapa. Vaihtoehtona on käyttää siinäki Arduino Leonardo hyväksi, mutta sen näkee sitten myöhemmin.

Lähteet

Tero Karvinen – Prototyyppi-kurssi

Lauri Peltomäki – Making that IDE work on your Arch system

Idea-dev-Storage – Arduino Leonardo + Joystick + Mouse Control

Arduino  – Joystick Mouse Control

-Jokela Antti-Ville

Tätä dokumenttia saa kopioida ja muokata GNU General Public License (versio 2 tai uudempi) mukaisesti. http://www.gnu.org/licenses/gpl.html

 

Bookmark the permalink.

Comments are closed