USB Wiichuck mus med en Arduino Leonardo (2 / 3 steg)
Steg 2: programvara
Efter att ha fått min skinande nya Leonardo, började jag undersöka hur jag skulle få det alla arbetar. Eftersom Wiichuck använder 5 V power och kommunicerar via I2C, ledningarna var relativt enkel. Jag kopplade bara upp 5 V, GND, SDA och SCL raderna till motsvarande portar på Leonardo och jag var redo att gå.Programmet var lite svårare. Det tog mig ganska lång tid och en hel del experimenterande att hitta kod som skulle fungera för vad jag behövde. Som jag nämnde tidigare, både Nunchuck funktionsbiblioteket (som jag har tagit i detta instructable) och den ursprungliga källkoden (som jag inte verkar få ladda upp korrekt, så jag ska bara kopiera och klistra in nedan) var skriven av andra och sedan för mina syften.
I huvudsak vad koden gör är använda Nunchuck biblioteket för att hämta data från den "Chuck varje 10 ms. att ha satt en rad för musen för att flytta koden använder detta intervall för att avgöra vila tröskeln till joystick. Efter huvudloop läser C och Z knappar och utgångar dem som vänster och rätt musen knappar, koden då går på att läsa x- och y-axeln. Efter att subtrahera värdet center position från den mottagna behandlingen, är det resulterande absoluta värdet jämfört med variabeln tröskel. Om värdet är mindre än tröskelvärdet för rörelse, flytta avståndet är satt till 0, annars flytta avståndet Läs avståndet. Om antingen x eller y avståndet är inte 0, musen flyttas motsvarande avstånd.
Det bör noteras att hela denna process fungerar lika bra med accelerometern. Istället för att använda funktionerna nunchuck_joyx och y, kan man lämpligen använda nunchuck_accelx och y. Jag skulle inte rekommendera det, emellertid. Resultaten vid försök att använda musen kan vara... squirrely.
Wiichuck mus
Brian Krukoski
April 2012
rött-+ 5, vit-gnd, grön-sda, yllw-clck
#include < Wire.h >
#include "nunchuck_funcs.h"
int loop_cnt = 0;
parametrar för att läsa joysticken:
int utbud = 40; utgående sortiment av X eller Y rörelse
int tröskel = utbud/10; vilande tröskel
int center = range/2; vilande position värde
booleska mouseIsActive = false; även att styra musen
int lastSwitchState = låg; tidigare switch tillstånd
void setup() {
initilization för Wiichuck
nunchuck_init();
ta kontroll över musen:
Mouse.BEGIN();
Serial.BEGIN(9600);
}
void loop() {
om (loop_cnt > 10) {/ / varje 10 uppdateringsförsök få nya data
loop_cnt = 0;
nunchuck_get_data();
höger och vänster klicka kontroll
int leftState = nunchuck_cbutton();
om (leftState) Mouse.press(MOUSE_LEFT); annat Mouse.release(MOUSE_LEFT);
int rightState = nunchuck_zbutton();
om (rightState) Mouse.press(MOUSE_RIGHT); annat Mouse.release(MOUSE_RIGHT);
Läs x-axeln
int xReading = nunchuck_joyx(); samtal på nunchuck_funcs bibliotek för x-axeln behandlingen
xReading = karta (xReading, 38, 232, 0, intervall); 38 och 232 godtyckligt bestämmas genom experiment, kartor till 0 och förinställda utbud
int xDistance = xReading - center;
om (abs(xDistance) < tröskel) //if absolutvärdet för xDistance är mindre än fördefinierade tröskel...
{
xDistance = 0;
}
Läs y-axeln
int yReading = nunchuck_joyy(); samtal på nunchuck_funcs bibliotek för y-axeln läsning
yReading = karta (yReading, 38, 232, 0, intervall); 38 och 232 godtyckligt bestämmas genom experiment, kartor till 0 och förinställda utbud
int yDistance = yReading - center;
om (abs(yDistance) < tröskel) //if absolutvärdet för yDistance är mindre än fördefinierade tröskel...
{
yDistance = 0;
}
flytta musen om avläsningarna var högre än 0
om ((xDistance! = 0) || (yDistance! = 0)) {
Mouse.Move (xDistance, -yDistance, 0); -yDistance garanterar inverterad stil joystick
}
}
nunchuck_print_data(); skriver ut nunchuck data till seriell monitor för felsökning
loop_cnt ++;
Delay(1);
}