Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Usando un Wii Nunchuk con Arduino

Componentes y suministros

Nintendo Nunchuk
× 1
Cambiador de nivel SparkFun
× 1
Arduino UNO
× 1

Acerca de este proyecto

Prefacio

Originalmente, esta publicación se publicó en www.xarg.org.

Usando un Wii Nunchuk con Arduino

Todos hemos crecido con los pads de juego en nuestras manos, lo que los hace ideales para combinarlos literalmente con cualquier aplicación posible. Un gran invento de Nintendo es el Nunchuk, una extensión económica para el control remoto de Wii U. Como utiliza I2C como protocolo de transporte, es fácil acceder a los datos sin procesar del controlador. Como es tan fácil, pensé que debía haber una solución estándar para ello, pero no pude encontrar una implementación estable, pero solo un montón de fragmentos de código. Por eso me concentré en llenar este vacío y aquí está. En este artículo, lo guiaré a través de los detalles y lo implementaré para un Arduino.

Hardware

El Nunchuk tiene dos botones de membrana, llamados botón C y botón Z. En la parte superior del dispositivo hay un joystick analógico de dos ejes y todo el dispositivo es sensible a los movimientos, ya que un acelerómetro mide las fuerzas que actúan en las tres dimensiones. Se recomienda operar el Nunchuk con 3v3 y definitivamente debe usar un cambiador de nivel si no puede suministrar ese voltaje para aumentar su vida útil. Como mínimo, necesitará las siguientes piezas para esta configuración:

Piezas

  • Nintendo Nunchuk (o réplica)
  • Arduino
  • Cambiador de nivel (opcional)
  • Adaptador Nunchuk (opcional)

Nunchuk original o réplica

La gran pregunta es, ¿debería comprar un Nintendo Nunchuk original o una réplica china? Para probar mi controlador Nunchuk, compré ambos:el original y una copia barata. Ambas versiones están lejos de ser caras, pero la diferencia es de unos 10-15 €. Lo que puedo decir es que los hilos del cable del Nunchuk original están blindados, lo que los hace más robustos frente a perturbaciones. El joystick del original tiene una calidad superior, puede resolver todos los movimientos en el rango completo de valores, mientras que la copia no reacciona a movimientos mínimos. También la calidad del acelerómetro del original es mejor. Sin embargo, apliqué un filtro de Kalman, que nivela estas diferencias. Entonces, si quieres un controlador de larga duración, yo elegiría el original, si solo necesitas un dispositivo de entrada barato, es posible que tengas suerte con una copia de Nunchuk.

Conector Nunchuk

Nintendo conecta todos los periféricos con un enchufe propietario. Como no tengo una Wii y no usaré los controladores para algo relacionado con los juegos, rompí los conectores. Puede obtener un adaptador Nunchuk por unos pocos dólares, si no desea hacer este paso drástico, pero con algunas habilidades de soldadura, debería poder reparar el enchufe de todos modos. Recomiendo abrir el enchufe, ya que puedes ver cómo se conectan los cables a las clavijas. Esto es especialmente importante para las réplicas de Nunchuk, ya que los cables se pueden conectar al azar. Otra cosa extraña es que el controlador original tiene 4 cables y la réplica tiene 5, mientras que el conector en realidad tiene 6 pines. Bien, vayamos a trabajar y abramos el conector:

Y corta los cables:

Al mirar el frontal del enchufe, verá estos pines:

Para el Nunchuk original, el siguiente es el color y la disposición de los pines del conector:

  • Verde → SDA
  • nc
  • Rojo → 3v3
  • Blanco → GND
  • nc
  • Amarillo → SCL

Para el clon de Nunchuk que obtuve, el siguiente es el color y la disposición de los pines del conector:

  • Amarillo → SDA
  • Negro → nc
  • Verde → 3v3
  • Rojo → GND
  • nc
  • Blanco → SCL

Como dije, definitivamente deberías mirar cómo están dispuestos los cables y no conectar nada por su color. Las siglas utilizadas son: nc para no conectado, SDA - la línea de datos (debe estar conectada con A4 en la placa Arduino) y SCL - el reloj (conectado con A5). Arduino tiene un regulador de voltaje, que nos permite usar 3v3 directamente. Si desea utilizar WiiChuck o un adaptador Nunchuk similar, conecte 3v3 con A2 y GND con A1; luego deberá llamar a nunchuk_init_power () para inicializar estos conectores de fuente de alimentación. El siguiente boceto de Fritzing ilustra la conexión:

Software

Escribí una pequeña biblioteca de encabezados, que implementa la comunicación con el Nunchuk. De hecho, no debe preocuparse por lo que sucede detrás de escena, debería funcionar de inmediato. Si está interesado en los detalles, lo explicaré en un minuto de todos modos.

Descarga la biblioteca Nunchuk

La comunicación con el Nunchuk se realiza a través del bus TWI, que es solo otro nombre para I2C (bueno, algunos detalles son diferentes, lo que no importa para nuestros propósitos). La velocidad del bus I2C está configurada en modo rápido (400 kHz) de forma predeterminada. Para usar el Nunchuk con su Arduino, solo se necesita lo siguiente:

  #include  #include "nunchuk.h" void setup () {Serial.begin (9600); Wire.begin (); // nunchuk_init_power (); // A1 y A2 es fuente de alimentación nunchuk_init ();} void loop () {if (nunchuk_read ()) {// Trabaja con nunchuk_data nunchuk_print (); } retraso (10);}  

Al iniciar el archivo de procesamiento enviado con la biblioteca, puede equilibrar este cono con su Nunchuk:

En lugar de nunchuk_print () Se pueden utilizar muchas funciones para acceder a los datos reales:

Funciones de Nunchuk

  • nunchuk_buttonZ (): 1 o 0, ya sea que se presione el botón Z o no
  • nunchuk_buttonC (): 1 o 0, ya sea que se presione el botón C o no
  • nunchuk_joystickX_raw () / nunchuk_joystickX () nunchuk_joystickY_raw () / nunchuk_joystickY (): El valor x o y del joystick. Una versión sin procesar para cada función da acceso a los datos sin calibración.
  • nunchuk_joystick_angle (): Calcula el ángulo del joystick en radianes.
  • nunchuk_accelX_raw () / nunchuk_accelX () nunchuk_accelY_raw () / nunchuk_accelY () nunchuk_accelZ_raw () / nunchuk_accelZ (): El x-, y- o z- valor del acelerómetro. Una versión sin procesar para cada función da acceso a los datos sin calibración.
  • nunchuk_pitch (): Calcula el ángulo de inclinación del controlador en radianes.
  • nunchuk_roll (): Calcula el ángulo de balanceo del controlador en radianes.

Nota: No hay nunchuk_yaw () función, ya que un acelerómetro puede medir sólo fuerzas direccionales y no velocidad de rotación. Esta circunstancia también limita el cabeceo a solo 180 ° y obliga a que el ángulo de balanceo sea incorrecto cuando el cabeceo es superior a 180 °.

El cálculo del ángulo de cabeceo y balanceo también funciona bajo el supuesto simplificador de que la única velocidad que actúa sobre el controlador es la gravedad. Esto funciona ya que el Nunchuk se mantiene quieto o experimenta una velocidad constante de una fuerza externa.

Calibración

Como se describe en la descripción general de funciones, todas las funciones del joystick y el acelerómetro vienen con una versión calibrada y otra sin procesar. Al comienzo del archivo de la biblioteca, algunas constantes definen las posiciones cero. Lo mejor sería leer las medidas sin procesar de su controlador, cuando lo mantiene en posición neutral y adaptar las constantes en consecuencia.

Protocolo I2C

La última sección aquí analiza el protocolo I2C real. Si solo desea utilizar el controlador, esta información no es necesaria, pero si desea comprender el protocolo, espero poder ahorrarle algo de tiempo.

Comencé a desarrollar escaneando la dirección real del Nunchuk con mi escáner I2C, que es 0x52. La lectura de parámetros de la memoria del Nunchuk a través del bus I2C es bastante similar a la comunicación con una EEPROM I2C normal. Antes de que se puedan leer los datos del Nunchuk, es necesario enviar una secuencia de inicialización.

Para leer datos del Nunchuk, es necesario enviar la dirección para leer, ya que el controlador del Nunchuk incrementa la dirección con cada lectura. Los datos que realmente nos interesan se encuentran en la dirección 0x00 y tienen una longitud de 6 bytes. En la dirección 0x20 y 0x30 (parece ser una copia exacta de los bytes en 0x20), se almacenan 16 bytes de datos de calibración. En la dirección 0xFA puede encontrar el número de identificación del dispositivo, que es 0xA4200000 para Nunchuck, 0xA4200101 para Classic Controller, 0xA4200402 para Balance, etc.

Cuando es necesario escribir datos en el Nunchuk, el formato es análogo al comando de lectura. El primer byte es la dirección, seguido de los datos reales.

Repasemos las secuencias de bytes reales del Nunchuk para las funciones descritas:

1. Inicialice el Nunchuk:

  START, 0x40, 0x00, STOP  

Esta secuencia es la secuencia de inicialización normal, que establece el algoritmo de cifrado por defecto. Cada byte que se lee del Nunchuk debe ser descifrado con (x ^ 0x17) + 0x17 . Una mejor manera es deshabilitar el cifrado con esta secuencia:

2. Inicialice el Nunchuk sin cifrado:

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

Esto tiene la ventaja de que los datos reales se pueden usar sin la fórmula de descifrado y también funcionará con clones de Nunchuk.

3. Lea la identificación del dispositivo del registro de extensión:

  START, 0xFA, STOPREAD 6 bytes  

Los datos son el ident, que ya mencioné, si el dispositivo conectado es un controlador Nunchuk o Classic y así sucesivamente.

4. Lea las medidas del dispositivo:

  START, 0x00, STOPREAD 6 bytes  

Lo que obtiene a cambio se describe en esta descripción general:

  • Bit Byte 7 6 5 4 3 2 1 0
  • 1 joystick del eje X [7:0]
  • 2 joystick en eje Y [7:0]
  • 3 Acelerómetro Eje X [9:2]
  • Acelerómetro de 4 ejes Y [9:2]
  • 5 Acelerómetro Eje Z [9:2]
  • 6 Az [1:0] Ay [1:0] Ax [1:0] ¬Bc ¬Bz

Entonces, los valores de los botones están invertidos y los bits LSB del acelerómetro están contenidos en el byte 6. En la biblioteca, combino los bits LSB con el resto. He visto gente que usa los valores sin los bits LSB, que es una forma demasiado simplificada de conseguir que la señal sea más estable. Para mí, prefiero una señal ruidosa de un ADC, que se puede filtrar fácilmente con un filtro complementario o de Kalman en lugar de cortar los números redondeando, donde se pierde mucha información.

5. Lea los datos de calibración reales del dispositivo:

  START, 0x20, STOP READ 16byte  

Lo que obtiene a cambio se describe en esta descripción general:

Byte

Descripción

  • 1 valor 0G del eje X [9:2]
  • Valor 2 0G del eje Y [9:2]
  • Valor 3 0G del eje Z [9:2]
  • 4 LSB de valor cero de los ejes X, Y, Z
  • 5 valor 1G del eje X [9:2]
  • 6 Valor 1G del eje Y [9:2]
  • 7 Valor 1G del eje Z [9:2]
  • 8 LSB del valor 1G de los ejes X, Y, Z
  • 9 joystick en el eje X como máximo
  • 10 joystick en el eje X como mínimo
  • 11 Centro del eje X del joystick
  • Máximo 12 joystick en el eje Y
  • 13 Joystick mínimo en el eje Y
  • 14 Centro del eje Y del joystick
  • 15 Sumas de comprobación
  • 16 Sumas de comprobación

Los bytes 0-3 almacenan los valores cero de los ejes X, Y y Z, mientras que los bytes 4-7 almacenan los valores en 1G (gravitación terrestre). Los datos de calibración aún no se utilizan en la implementación del software.

Código

  • Fragmento de código n. ° 1
Fragmento de código n. ° 1 Texto sin formato
 #include  #include "nunchuk.h" void setup () {Serial.begin (9600); Wire.begin (); // nunchuk_init_power (); // A1 y A2 es fuente de alimentación nunchuk_init ();} void loop () {if (nunchuk_read ()) {// Trabaja con nunchuk_data nunchuk_print (); } retraso (10);} 
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk

Piezas y carcasas personalizadas


Proceso de manufactura

  1. Uso del control remoto por infrarrojos con Raspberry Pi sin LIRC
  2. Atenuación de luces con PWM usando el botón pulsador
  3. Hacer Monitor Ambilight usando Arduino
  4. Sistema de asistencia que usa Arduino y RFID con Python
  5. Monitoreo de CO2 con sensor K30
  6. Comunicación para personas sordociegas con 1Sheeld / Arduino
  7. Controlar el aceptador de monedas con Arduino
  8. Voltímetro de bricolaje con Arduino y un teléfono inteligente
  9. Monitor de frecuencia cardíaca con IoT
  10. ¡Arduino con Bluetooth para controlar un LED!
  11. Brazo robótico controlado por Nunchuk (con Arduino)