Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

Componentes e Materiais

Nintendo Nunchuk (ou réplica) 1
Conversor de Nível Lógico (SparkFun Level Shifter) 1
Arduino UNO 1

Sobre o Projeto

Prefácio

Originalmente, este post foi publicado em www.xarg.org.

Usando Wii Nunchuk com Arduino

Todos crescemos com gamepads nas mãos, o que os torna ideais para combinar com qualquer aplicação. Uma grande invenção da Nintendo é o Nunchuk, uma extensão barata para o Wii U remote. Como usa I2C como protocolo de transporte, é fácil acessar os dados brutos do controle. Por ser tão fácil, pensei que haveria uma solução padrão, mas não encontrei implementação estável, apenas muitos snippets de código. Por isso foquei em preencher esta lacuna e aqui está. Neste artigo, guio pelos detalhes e implemento para Arduino.

Hardware

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

O Nunchuk tem dois botões de membrana: botão C e botão Z. No topo, um joystick analógico de dois eixos. O dispositivo todo detecta movimentos, pois um acelerômetro mede forças nas três dimensões. Recomenda-se operar o Nunchuk com 3,3V e definitivamente use um conversor de nível lógico se não puder fornecer essa tensão, para aumentar sua vida útil. No mínimo, precisa das seguintes peças:

Peças

Nunchuk Original ou Réplica

A grande questão: comprar Nunchuk original Nintendo ou réplica chinesa? Para testar meu driver, comprei ambos. Ambos são baratos, mas a diferença é ~10-15€. O que posso dizer: os fios do cabo do original são blindados, mais robustos contra interferências. O joystick do original tem qualidade superior, resolve todos movimentos na faixa completa de valores, enquanto a réplica não reage a movimentos mínimos. A qualidade do acelerômetro do original também é melhor. Porém, apliquei um Filtro de Kalman, que nivela estas diferenças. Se quer controle duradouro, vá de original; se só precisa input barato, pode ter sorte com réplica.

Conector do Nunchuk

Nintendo usa conector proprietário. Como não tenho Wii e não usarei para jogos, cortei os conectores. Pode comprar adaptador Nunchuk por poucos dólares se não quiser cortar, mas com habilidades de solda, dá para reparar o plug. Recomendo abrir o plug para ver como fios ligam aos pinos. Isso é especialmente importante para réplicas, pois fios podem vir ligados aleatoriamente. Outra coisa estranha: o original tem 4 fios e a réplica 5, enquanto o conector tem 6 pinos. Vamos abrir o conector:

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

E cortar os fios:

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

Olhando frontalmente no plug, vê estes pinos:

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

Para o Nunchuk original, layout de cores e pinos:

Para a réplica que comprei:

Verifique sempre como os fios estão dispostos e não conecte pela cor. Siglas: nc = não conectado, SDA = linha de dados (conectar ao A4 no Arduino), SCL = clock (conectar ao A5). Arduino tem regulador de tensão, permitindo usar 3,3V direto. Se usar WiiChuck ou adaptador similar, conecte 3,3V ao A2 e GND ao A1 - depois precisará chamar nunchuk_init_power() para inicializar estes pinos de alimentação. O sketch Fritzing abaixo ilustra a ligação:

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

Software

Escrevi uma pequena biblioteca header que implementa a comunicação com o Nunchuk. Não precisa se preocupar com o que acontece nos bastidores; deve funcionar out-of-the-box. Se interessado nos detalhes, explico em seguida.

Download da Biblioteca Nunchuk

A comunicação é via barramento TWI, outro nome para I2C (alguns detalhes diferem, mas não importa para nossos propósitos). Velocidade I2C definida como Fast Mode (400kHz) por padrão. Para usar o Nunchuk com Arduino, só precisa:

#include <Wire.h>
#include "nunchuk.h"

void setup() {
  Serial.begin(9600);
  Wire.begin();
  // nunchuk_init_power(); // A1 e A2 como alimentação
  nunchuk_init();
}

void loop() {
  if (nunchuk_read()) {
    // Trabalha com nunchuk_data
    nunchuk_print();
  }
  delay(10);
}

Ao rodar o arquivo Processing incluído na biblioteca, você pode equilibrar este cone com seu Nunchuk:

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

Em vez de nunchuk_print(), várias funções acessam os dados:

Funções do Nunchuk

Nota: Não existe nunchuk_yaw(), pois acelerômetro mede apenas forças direcionais, não velocidade rotacional. Isso limita pitch a 180° e força roll a ser incorreto quando pitch > 180°.

O cálculo de pitch e roll assume que a única velocidade atuando no controle é a gravidade. Funciona pois o Nunchuk fica parado ou sofre velocidade constante de força externa.

Calibração

Como descrito, toda função de joystick e acelerômetro tem versão calibrada e raw. No início do arquivo da biblioteca, constantes definem posições zero. Melhor ler medidas brutas do seu controle em posição neutra e ajustar as constantes.

Protocolo I2C

Última seção discute o protocolo I2C real. Se só quer usar o controle, não precisa disso, mas se quer entender o protocolo, espero poupar seu tempo.

Comecei escaneando endereço real do Nunchuk com meu scanner I2C: 0x52. Ler parâmetros da memória do Nunchuk via I2C é similar a comunicação com EEPROM I2C normal. Antes de ler dados, é necessário enviar sequência de inicialização.

Para ler dados, deve enviar endereço a ler, pois controlador do Nunchuk incrementa endereço a cada leitura. Dados de interesse estão no endereço 0x00 e têm 6 bytes. Nos endereços 0x20 e 0x30 (cópia exata de 0x20), 16 bytes de dados de calibração. No endereço 0xFA encontra número de identificação do dispositivo: 0xA4200000 para Nunchuk, 0xA4200101 para Classic Controller, 0xA4200402 para Balance Board, etc.

Quando dados precisam ser escritos no Nunchuk, formato análogo ao comando de leitura. Primeiro byte é endereço, seguido dos dados.

Vamos percorrer as sequências de bytes reais do Nunchuk para as funcionalidades descritas:

1. Inicializar o Nunchuk

START, 0x40, 0x00, STOP

Sequência de inicialização normal, define algoritmo de criptografia padrão. Todo byte lido deve ser descriptografado com (x ^ 0x17) + 0x17. Melhor desabilitar criptografia:

2. Inicializar Nunchuk sem Criptografia

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

Benefício: dados reais usáveis sem fórmula de descriptografia e funciona com clones.

3. Ler Identificação do Dispositivo do Registro de Extensão

START, 0xFA, STOP
READ 6 byte

Dados são a identificação mencionada.

4. Ler Medidas do Dispositivo

START, 0x00, STOP
READ 6 byte

Retorno descrito:

Valores dos botões são invertidos, e bits LSB do acelerômetro estão no byte 6. Na biblioteca, combino bits LSB com o resto. Vi gente usando valores sem bits LSB, forma simplificada demais de estabilizar sinal. Prefiro sinal ruidoso de ADC, filtrável com Filtro Complementar ou Kalman, em vez de cortar números por arredondamento - onde se perde muita informação.

5. Ler Dados de Calibração Reais do Dispositivo

START, 0x20, STOP
READ 16 byte

Retorno:

ByteDescrição
1Valor 0G eixo X [9:2]
2Valor 0G eixo Y [9:2]
3Valor 0G eixo Z [9:2]
4LSB valor zero X,Y,Z
5Valor 1G eixo X [9:2]
6Valor 1G eixo Y [9:2]
7Valor 1G eixo Z [9:2]
8LSB valor 1G X,Y,Z
9Joystick X-axis máximo
10Joystick X-axis mínimo
11Joystick X-axis centro
12Joystick Y-axis máximo
13Joystick Y-axis mínimo
14Joystick Y-axis centro
15Checksum
16Checksum

Bytes 0-3 armazenam valores zero dos eixos X, Y, Z; bytes 4-7 armazenam valores a 1G (gravidade terrestre). Dados de calibração ainda não usados na implementação de software.

Código

Snippet de Código #1 Plain text

#include <Wire.h>
#include "nunchuk.h"

void setup() {
  Serial.begin(9600);
  Wire.begin();
  // nunchuk_init_power(); // A1 e A2 como alimentação
  nunchuk_init();
}

void loop() {
  if (nunchuk_read()) {
    // Trabalha com nunchuk_data
    nunchuk_print();
  }
  delay(10);
}

GitHub

https://github.com/infusion/Fritzing/tree/master/Nunchuk

Peças Personalizadas e Gabinetes

Integrando Wii Nunchuk com Arduino: Guia Passo a Passo

Processo de manufatura

  1. Capturar Comandos de Controle Remoto IR no Raspberry Pi sem LIRC: Abordagem Python UART
  2. Controle de Brilho de LED com PWM via Botão no Arduino Mega
  3. Crie um Sistema Ambilight Impressionante para Monitor com Arduino
  4. Sistema de Presença RFID Confiável com Arduino e Python
  5. Sensor K30 CO₂: Monitoramento de Qualidade do Ar Interno em Tempo Real
  6. Facilitando Comunicação Surdo-Cego com 1Sheeld e Arduino
  7. Mealheiro Inteligente: Controlar Aceitador de Moedas com Arduino Nano
  8. Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
  9. Monitor de Frequência Cardíaca IoT em Tempo Real com Arduino e MAX30100
  10. Controlar um LED via Bluetooth com Arduino – Guia DIY Simples