Étape 2: logiciel
Après avoir reçu mon Leonardo nouveau brillant, j’ai commencé à étudier comment j’allais obtenir tous les travailleurs. Puisque le Wiichuck utilise 5 V puissance et communique via I2C, le câblage a été relativement simple. J’ai simplement connecté les 5 lignes V, GND, SDA et SCL pour les ports correspondants de Leonardo et j’étais prêt à aller.Le logiciel a été un peu plus difficile. Il m’a fallu un certain temps et beaucoup d’expérimentation pour trouver le code qui allait travailler pour ce que j’avais besoin. Comme j’ai mentionné précédemment, les deux la bibliothèque de fonctions Nunchuck (qui je l’ai inclus dans ce instructable) et le code source original (que je n’arrive pas à obtenir de télécharger correctement, donc je vais juste copier et coller ci-dessous) ont été écrits par d’autres et ensuite modifiés pour mes fins.
Essentiellement, ce que fait le code, c’est utiliser la bibliothèque de Nunchuck pour obtenir des données de la ' Chuck chaque ms. 10 avoir définir une plage pour la souris pour se déplacer dans, le code utilise cette gamme afin de déterminer le seuil au repos du joystick. Après que la boucle principale lit le C et Z les boutons et les sorties comme la gauche et droit de la souris boutons, le code puis va sur lire x et y axes. Après avoir soustrait la valeur de la position du centre de lecture reçue, la valeur absolue qui en résulte est comparée à la variable de seuil. Si la valeur est inférieure au seuil pour le mouvement, la distance de déplacement est définie sur 0, sinon la distance de déplacement est la distance de lecture. Si x ou y la distance n’est pas 0, la souris déplace la distance correspondante.
Il est à noter que tout ce processus peut fonctionner aussi bien avec l’accéléromètre. Au lieu d’utiliser les fonctions nunchuck_joyx et y, on pourrait facilement utiliser nunchuck_accelx et y. Je ne le recommanderais pas, cependant. Les résultats lorsque vous tentez d’utiliser la souris peuvent être... réussissez.
Wiichuck souris
Brian Krukoski
Avril 2012
rouge-+ 5, blanc-gnd, vert-sda, yllw-clck
#include < Wire.h >
#include « nunchuck_funcs.h »
int loop_cnt = 0 ;
paramètres pour la lecture de la manette :
gamme int = 40 ; gamme de sortie de X ou Y mouvement
seuil d’int = rang/10 ; seuil de repos
Centre int = gamme/2 ; valeur de la position de repos
mouseIsActive booléen = false ; pour contrôler la souris ou non
int lastSwitchState = faible ; état antérieur de commutateur
void setup() {}
initialisation pour le Wiichuck
nunchuck_init() ;
Prenez le contrôle de la souris :
Mouse.Begin() ;
Serial.Begin(9600) ;
}
void loop() {}
Si (loop_cnt > 10) {/ / chaque 10 millisecondes pendant laquelle obtenir de nouvelles données
loop_cnt = 0 ;
nunchuck_get_data() ;
à droite et à gauche, cliquez sur contrôle
int leftState = nunchuck_cbutton() ;
Si (leftState) Mouse.press(MOUSE_LEFT) ; d’autre Mouse.release(MOUSE_LEFT) ;
int rightState = nunchuck_zbutton() ;
Si (rightState) Mouse.press(MOUSE_RIGHT) ; d’autre Mouse.release(MOUSE_RIGHT) ;
lire l’axe des x
int xReading = nunchuck_joyx() ; demande à la bibliothèque nunchuck_funcs pour x lecture axe
xReading = carte (xReading, 38, 232, 0, gamme) ; 38 et 232 arbitrairement déterminé par l’expérimentation, correspond à la gamme 0 et préréglage
int xDistance = xReading - center ;
Si (abs(xDistance) < seuil) valeur absolue //if de xDistance est inférieur au seuil prédéfini...
{
xDistance = 0 ;
}
lire l’axe y
int yReading = nunchuck_joyy() ; demande à la bibliothèque de nunchuck_funcs pour la lecture d’axe y
yReading = carte (yReading, 38, 232, 0, gamme) ; 38 et 232 arbitrairement déterminé par l’expérimentation, correspond à la gamme 0 et préréglage
int yDistance = yReading - center ;
Si (abs(yDistance) < seuil) valeur absolue //if d’yDistance est inférieur au seuil prédéfini...
{
yDistance = 0 ;
}
Déplacez la souris si les lectures sont au-dessus de 0
Si ((xDistance! = 0) || (yDistance! = 0)) {
Mouse.Move (xDistance, - yDistance, 0) ; yDistance - assure joystick style inversé
}
}
nunchuck_print_data() ; imprime les données nunchuck à serial monitor au débogage
loop_cnt ++ ;
Delay(1) ;
}