Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Utiliser un Wii Nunchuk avec Arduino

Composants et fournitures

Nintendo Nunchuk
× 1
SparkFun Level Shifter
× 1
Arduino UNO
× 1

À propos de ce projet

Préface

À l'origine, cet article a été publié sur www.xarg.org.

Utiliser un Wii Nunchuk avec Arduino

Nous avons tous grandi avec des manettes de jeu dans nos mains, ce qui les rend idéales pour les combiner avec littéralement toutes les applications possibles. Une grande invention de Nintendo est le Nunchuk, une extension bon marché pour la télécommande Wii U. Comme il utilise I2C comme protocole de transport, il est facile d'accéder aux données brutes du contrôleur. Comme c'est si simple, j'ai pensé qu'il devait y avoir une solution standard pour cela, mais je n'ai pas pu trouver une implémentation stable, mais seulement des tas d'extraits de code. C'est pourquoi je me suis concentré sur le comblement de cette lacune et la voici. Dans cet article, je vais vous guider à travers les détails et l'implémenter pour un Arduino.

Matériel

Le Nunchuk possède deux boutons à membrane, appelés bouton C et bouton Z. Au-dessus de l'appareil se trouve un joystick analogique à deux axes et l'ensemble de l'appareil est sensible aux mouvements, car un accéléromètre mesure les forces agissant sur les trois dimensions. Il est recommandé d'utiliser le Nunchuk avec 3v3 et vous devez absolument utiliser un décaleur de niveau si vous ne pouvez pas fournir cette tension pour augmenter sa durée de vie. Au minimum, vous aurez besoin des pièces suivantes pour cette configuration :

Pièces

  • Nintendo Nunchuk (ou réplique)
  • Arduino
  • Levier de niveau (facultatif)
  • Adaptateur Nunchuk (facultatif)

Nunchuk original ou réplique

La grande question est, devriez-vous acheter un Nintendo Nunchuk original ou une réplique chinoise ? Afin de tester mon pilote Nunchuk, j'ai acheté les deux - l'original et une copie bon marché. Les deux versions sont loin d'être chères, mais la différence est d'environ 10-15€. Ce que je peux dire, c'est que les fils du câble du Nunchuk d'origine sont blindés, ce qui les rend plus robustes contre les perturbations. Le joystick de l'original a une qualité supérieure, il peut résoudre tous les mouvements dans toute la plage de valeurs, tandis que la copie ne réagit pas aux mouvements minimes. Aussi la qualité de l'accéléromètre de l'original est meilleure. Cependant, j'ai appliqué un filtre de Kalman, qui nivelle ces différences. Donc, si vous voulez un contrôleur de longue durée, j'irais avec l'original, si vous avez juste besoin d'un périphérique d'entrée bon marché, vous pourriez avoir de la chance avec une copie Nunchuk.

Connecteur Nunchuk

Nintendo connecte tous les périphériques avec une prise propriétaire. Comme je n'ai pas de Wii et que je n'utiliserai pas les contrôleurs pour quelque chose lié au jeu, j'ai déchiré les connecteurs. Vous pouvez obtenir un adaptateur Nunchuk pour quelques dollars, si vous ne voulez pas faire cette étape drastique, mais avec quelques compétences en soudure, vous devriez quand même pouvoir réparer la prise. Je recommande d'ouvrir la prise, car vous pouvez voir comment les fils sont connectés aux broches. Ceci est particulièrement important pour les répliques Nunchuk, car les fils peuvent être connectés de manière aléatoire. Une autre chose étrange est que le contrôleur d'origine a 4 fils et la réplique en a 5, tandis que le connecteur a en fait 6 broches. Bon, allons au travail et ouvrons le connecteur :

Et coupez les fils :

En regardant de face sur la prise, vous verrez ces broches :

Pour le Nunchuk d'origine, voici la couleur et la disposition des broches du connecteur :

  • Vert → SDA
  • nc
  • Rouge → 3v3
  • Blanc → GND
  • nc
  • Jaune → SCL

Pour le clone Nunchuk que j'ai obtenu, voici la couleur et la disposition des broches du connecteur :

  • Jaune → SDA
  • Noir → nc
  • Vert → 3v3
  • Rouge → GND
  • nc
  • Blanc → SCL

Comme je l'ai dit, vous devez absolument regarder comment les fils sont disposés et ne rien connecter par sa couleur. Les acronymes utilisés sont :nc pour non connecté, SDA - la ligne de données (doit être connectée avec A4 sur la carte Arduino) et SCL - l'horloge (connectée avec A5). Arduino a un régulateur de tension, ce qui nous permet d'utiliser directement 3v3. Si vous souhaitez utiliser le WiiChuck ou un adaptateur Nunchuk similaire, connectez 3v3 avec A2 et GND avec A1 - vous devrez plus tard appeler nunchuk_init_power() pour initialiser ces connecteurs d'alimentation. Le croquis Fritzing suivant illustre la connexion :

Logiciel

J'ai écrit une petite bibliothèque d'en-têtes, qui implémente la communication avec le Nunchuk. En fait, vous ne devriez pas vous soucier de ce qui se passe dans les coulisses, cela devrait fonctionner immédiatement. Si les détails vous intéressent, je vous l'expliquerai dans une minute.

Télécharger la bibliothèque Nunchuk

La communication avec le Nunchuk se fait via le bus TWI, qui n'est qu'un autre nom pour I2C (d'accord, certains détails sont différents, ce qui n'a pas d'importance pour notre propos). La vitesse du bus I2C est réglée par défaut sur le mode rapide (400 kHz). Pour utiliser le Nunchuk avec votre Arduino, seuls les éléments suivants sont nécessaires :

#include #include "nunchuk.h"void setup() { Serial.begin(9600); Fil.begin(); // nunchuk_init_power(); // A1 et A2 sont l'alimentation nunchuk_init();}void loop() { if (nunchuk_read()) { // Fonctionne avec nunchuk_data nunchuk_print(); } délai(10);} 

Lors du démarrage du fichier de traitement livré avec la bibliothèque, vous pouvez équilibrer ce cône avec votre Nunchuk :

Au lieu de nunchuk_print() de nombreuses fonctions peuvent être utilisées pour accéder aux données réelles :

Fonctions Nunchuk

  • nunchuk_buttonZ() : 1 ou 0, que la touche Z soit enfoncée ou non
  • nunchuk_buttonC() : 1 ou 0, que la touche C soit enfoncée ou non
  • nunchuk_joystickX_raw() / nunchuk_joystickX() nunchuk_joystickY_raw() / nunchuk_joystickY() : La valeur x ou y du joystick. Une version brute pour chaque fonction donne accès aux données sans calibration.
  • nunchuk_joystick_angle() : Calcule l'angle du joystick en radians.
  • nunchuk_accelX_raw() / nunchuk_accelX() nunchuk_accelY_raw() / nunchuk_accelY() nunchuk_accelZ_raw() / nunchuk_accelZ() : Le x-, y- ou z- valeur de l'accéléromètre. Une version brute pour chaque fonction donne accès aux données sans calibration.
  • nunchuk_pitch() : Calcule l'angle d'inclinaison du contrôleur en radians.
  • nunchuk_roll() : Calcule l'angle de roulis du contrôleur en radians.

Remarque : Il n'y a pas de nunchuk_yaw() fonction, car un accéléromètre ne peut mesurer que les forces directionnelles et aucune vitesse de rotation. Cette circonstance limite également le tangage à seulement 180° et force l'angle de roulis à être erroné lorsque le tangage est supérieur à 180°.

Le calcul de l'angle de tangage et de roulis fonctionne également sous une hypothèse simplificatrice, que la seule vitesse agissant sur le contrôleur est la gravité. Cela fonctionne puisque le Nunchuk est soit maintenu immobile, soit subit une vitesse constante d'une force externe.

Étalonnage

Comme décrit dans l'aperçu des fonctions, chaque fonction du joystick et de l'accéléromètre est livrée avec une version calibrée et une version brute. Au début du fichier bibliothèque, certaines constantes définissent les positions zéro. Le mieux serait de lire les mesures brutes de votre contrôleur, lorsque vous le maintenez en position neutre et d'adapter les constantes en conséquence.

Protocole I2C

La dernière section présente ici le protocole I2C réel. Si vous souhaitez simplement utiliser le contrôleur, ces informations ne sont pas nécessaires, mais si vous souhaitez comprendre le protocole, j'espère pouvoir vous faire gagner du temps.

J'ai commencé à développer en recherchant l'adresse réelle du Nunchuk avec mon scanner I2C, qui est 0x52. La lecture des paramètres de la mémoire du Nunchuk via le bus I2C est assez similaire à la communication avec une EEPROM I2C normale. Avant de pouvoir lire les données du Nunchuk, il est nécessaire d'envoyer une séquence d'initialisation.

Afin de lire les données du Nunchuk, il est nécessaire d'envoyer l'adresse à lire, car le contrôleur du Nunchuk incrémente l'adresse à chaque lecture. Les données qui nous intéressent réellement se trouvent à l'adresse 0x00 et font 6 octets de long. Aux adresses 0x20 et 0x30 (semble être une copie exacte des octets à 0x20), 16 octets de données d'étalonnage sont stockés. À l'adresse 0xFA, vous pouvez trouver le numéro d'identification de l'appareil, qui est 0xA4200000 pour Nunchuck, 0xA4200101 pour Classic Controller, 0xA4200402 pour Balance et ainsi de suite.

Lorsque des données doivent être écrites sur le Nunchuk, le format est analogue à la commande de lecture. Le premier octet est l'adresse, suivi des données réelles.

Parcourons les séquences d'octets réelles du Nunchuk pour les fonctionnalités décrites :

1. Initialisez le Nunchuk :

START, 0x40, 0x00, STOP 

Cette séquence est la séquence d'initialisation normale, qui définit l'algorithme de chiffrement par défaut. Chaque octet lu depuis le Nunchuk doit ensuite être déchiffré avec (x ^ 0x17) + 0x17 . Une meilleure façon est de désactiver le cryptage avec cette séquence :

2. Initialisez le Nunchuk sans cryptage :

START, 0xF0, 0x55, STOPSTART, 0xFB, 0x00, STOP 

Cela présente l'avantage que les données réelles peuvent être utilisées sans la formule de décryptage et cela fonctionnera également avec les clones Nunchuk.

3. Lisez l'identifiant de l'appareil dans le registre d'extension :

START, 0xFA, STOPREAD 6 octets 

Les données sont l'identifiant, que j'ai déjà mentionné, si l'appareil connecté est un contrôleur Nunchuk ou Classic et ainsi de suite.

4. Lisez les mesures de l'appareil :

START, 0x00, STOPREAD 6 octets 

Ce que vous obtenez en retour est décrit dans cet aperçu :

  • Bit Octet 7 6 5 4 3 2 1 0
  • 1 Joystick Axe X [7:0]
  • 2 Joystick Axe Y [7:0]
  • 3 Accéléromètre Axe X [9:2]
  • 4 axe Y de l'accéléromètre [9:2]
  • 5 Accéléromètre Axe Z [9:2]
  • 6 Az [1:0] Ay [1:0] Ax [1:0] ¬Bc ¬Bz

Ainsi, les valeurs des boutons sont inversées et les bits LSB de l'accéléromètre sont contenus dans l'octet 6. Dans la bibliothèque, je combine les bits LSB avec le reste. J'ai vu des gens utiliser les valeurs sans les bits LSB, ce qui est un moyen trop simplifié d'obtenir un signal plus stable. Pour moi, je préfère un signal bruyant d'un CAN, qui peut être facilement filtré avec un filtre complémentaire ou un filtre de Kalman au lieu de couper les nombres en arrondissant - où vous perdez beaucoup d'informations.

5. Lisez les données d'étalonnage réelles de l'appareil :

START, 0x20, STOP LECTURE 16 octets 

Ce que vous obtenez en retour est décrit dans cet aperçu :

octet

Description

  • 1 valeur 0G de l'axe X [9:2]
  • Valeur 2 0G de l'axe Y [9:2]
  • 3 0G valeur de l'axe Z [9:2]
  • 4 LSB de la valeur zéro des axes X,Y,Z
  • 5 valeur 1G de l'axe X [9:2]
  • 6 Valeur 1G de l'axe Y [9:2]
  • 7 valeur 1G de l'axe Z [9:2]
  • 8 LSB de la valeur 1G des axes X,Y,Z
  • 9 Joystick axe X maximum
  • 10 axes X du joystick au minimum
  • Centre de l'axe X du joystick 11
  • 12 axes Y du joystick maximum
  • 13 axe Y du joystick au minimum
  • Centre de l'axe Y du joystick 14
  • 15 Somme de contrôle
  • 16 Somme de contrôle

Les octets 0-3 stockent les valeurs zéro des axes X, Y et Z, tandis que les octets 4-7 stockent les valeurs à 1G (gravitation terrestre). Les données d'étalonnage ne sont pas encore utilisées dans l'implémentation du logiciel.

Code

  • Extrait de code n° 1
Extrait de code n°1Texte brut
#include #include "nunchuk.h"void setup() { Serial.begin(9600); Fil.begin(); // nunchuk_init_power(); // A1 et A2 sont l'alimentation nunchuk_init();}void loop() { if (nunchuk_read()) { // Fonctionne avec nunchuk_data nunchuk_print(); } délai(10);}
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk

Pièces et boîtiers personnalisés


Processus de fabrication

  1. Utilisation de la télécommande infrarouge avec Raspberry Pi sans LIRC
  2. Variation des lumières avec PWM à l'aide du bouton-poussoir
  3. Créer un moniteur Ambilight à l'aide d'Arduino
  4. Système de présence utilisant Arduino et RFID avec Python
  5. Surveillance du CO2 avec le capteur K30
  6. Communication sourds-aveugles avec 1Sheeld/Arduino
  7. Contrôler l'accepteur de pièces avec Arduino
  8. Voltmètre DIY utilisant Arduino et Smartphone
  9. Moniteur de fréquence cardiaque utilisant l'IoT