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

Usando um Wii Nunchuk com Arduino

Componentes e suprimentos

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

Sobre este projeto





Prefácio


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





Usando um Wii Nunchuk com Arduino


Todos nós crescemos com gamepads em nossas mãos, o que os torna ideais para combiná-los com qualquer aplicação possível. Uma grande invenção da Nintendo é o Nunchuk, uma extensão barata para o controle remoto Wii U. Por usar I2C como protocolo de transporte, é fácil acessar os dados brutos do controlador. Como é tão fácil, pensei que deveria haver uma solução padrão para isso, mas não consegui encontrar uma implementação estável, mas apenas um monte de trechos de código. É por isso que me concentrei em preencher essa lacuna e aqui está. Neste artigo, vou guiá-lo pelos detalhes e implementá-los em um Arduino.





Hardware


O Nunchuk possui dois botões de membrana, chamados de botão C e botão Z. No topo do aparelho está um joystick analógico de dois eixos e todo o aparelho é sensível aos movimentos, já que um acelerômetro mede as forças que atuam nas três dimensões. É recomendado operar o Nunchuk com 3v3 e você deve usar um deslocador de nível se não puder fornecer essa tensão para aumentar sua vida útil. No mínimo, você precisará das seguintes peças para esta configuração:





Peças

  • Nintendo Nunchuk (ou réplica)
  • Arduino
  • Level Shifter (opcional)
  • Adaptador Nunchuk (opcional)





Nunchuk original ou réplica


A grande questão é:você deveria comprar um Nintendo Nunchuk original ou uma réplica chinesa? Para testar meu driver do Nunchuk, comprei os dois - o original e uma cópia barata. Ambas as versões são longe de serem caras, mas a diferença é de cerca de 10-15 €. O que posso dizer é que os fios do cabo do Nunchuk original são blindados, o que os torna mais robustos contra distúrbios. O joystick do original tem uma qualidade superior, pode resolver todos os movimentos em toda a gama de valores, enquanto a cópia não reage aos movimentos mínimos. Além disso, a qualidade do acelerômetro do original é melhor. No entanto, apliquei um Filtro de Kalman, que nivela essas diferenças. Então, se você quer um controlador de longa duração, eu escolheria o original, se você só precisa de um dispositivo de entrada barato, pode ter sorte com uma cópia do Nunchuk.





Conector Nunchuk


A Nintendo conecta todos os periféricos com um plugue proprietário. Como não tenho Wii e não vou usar os controladores para algo relacionado a jogos, rasguei os conectores. Você pode obter um adaptador Nunchuk por alguns dólares, se não quiser fazer essa etapa drástica, mas com algumas habilidades de soldagem, você deve conseguir consertar o plugue de qualquer maneira. Recomendo abrir o plugue, pois dá para ver como os fios estão conectados aos pinos. Isso é especialmente importante para réplicas Nunchuk, uma vez que os fios podem ser conectados aleatoriamente. Outra coisa estranha é que o controlador original tem 4 fios e a réplica tem 5, enquanto o conector na verdade tem 6 pinos. Ok, vamos trabalhar e abrir o conector:

E corte os fios:

Ao olhar frontalmente no plugue, você verá estes pinos:

Para o Nunchuk original, o seguinte é a cor e o layout dos pinos do conector:
  • Verde → SDA
  • nc
  • Vermelho → 3v3
  • Branco → GND
  • nc
  • Amarelo → SCL

Para o clone do Nunchuk que obtive, o seguinte é a cor e o layout dos pinos do conector:
  • Amarelo → SDA
  • Preto → nc
  • Verde → 3v3
  • Vermelho → GND
  • nc
  • Branco → SCL

Como eu disse, você definitivamente deveria observar como os fios estão dispostos e não conectar nada pela cor. Os acrônimos usados ​​são: nc para não conectado, SDA - a linha de dados (deve ser conectado com A4 na placa Arduino) e SCL - o relógio (conectado com A5). O Arduino tem um regulador de tensão, que nos permite usar 3v3 diretamente. Se você quiser usar o WiiChuck ou um adaptador Nunchuk semelhante, conecte 3v3 com A2 e GND com A1 - mais tarde você precisará chamar nunchuk_init_power () para inicializar esses conectores de fonte de alimentação. O seguinte esboço de Fritzing ilustra a conexão:





Software


Eu escrevi uma pequena biblioteca de cabeçalho, que implementa a comunicação com o Nunchuk. Na verdade, você não deve se preocupar com o que está acontecendo nos bastidores, deve funcionar imediatamente. Se você estiver interessado nos detalhes, explicarei isso em um minuto de qualquer maneira.

Baixar Biblioteca Nunchuk

A comunicação com o Nunchuk é feita através do ônibus TWI, que é apenas outro nome para I2C (ok, alguns detalhes são diferentes, o que não importa para nossos propósitos). A velocidade do barramento I2C é configurada para Modo rápido (400kHz) por padrão. Para usar o Nunchuk com o Arduino, apenas o seguinte é necessário:
  #include  #include "nunchuk.h" void setup () {Serial.begin (9600); Wire.begin (); // nunchuk_init_power (); // A1 e A2 são fontes de alimentação nunchuk_init ();} void loop () {if (nunchuk_read ()) {// Trabalhar com nunchuk_data nunchuk_print (); } atraso (10);}  

Ao iniciar o processamento do arquivo enviado com a biblioteca, você pode equilibrar este cone com o seu Nunchuk:

Em vez de nunchuk_print () muitas funções podem ser usadas para acessar os dados reais:





Funções Nunchuk

  • nunchuk_buttonZ (): 1 ou 0, quer o botão Z esteja pressionado ou não
  • nunchuk_buttonC (): 1 ou 0, quer o botão C esteja pressionado ou não
  • nunchuk_joystickX_raw () / nunchuk_joystickX () nunchuk_joystickY_raw () / nunchuk_joystickY (): O valor x ou y do joystick. Uma versão bruta para cada função dá acesso aos dados sem calibração.
  • nunchuk_joystick_angle (): Calcula o ângulo do joystick em radianos.
  • nunchuk_accelX_raw () / nunchuk_accelX () nunchuk_accelY_raw () / nunchuk_accelY () nunchuk_accelZ_raw () / nunchuk_accelZ (): O x-, y- ou z- valor do acelerômetro. Uma versão bruta para cada função dá acesso aos dados sem calibração.
  • nunchuk_pitch (): Calcula o ângulo de inclinação do controlador em radianos.
  • nunchuk_roll (): Calcula o ângulo de rotação do controlador em radianos.

Nota: Não há nunchuk_yaw () função, uma vez que um acelerômetro pode medir apenas forças direcionais e nenhuma velocidade de rotação. Essa circunstância também limita a inclinação a apenas 180 ° e força o ângulo de rolagem a ficar errado quando a inclinação é maior que 180 °.

O cálculo do ângulo de inclinação e rotação também funciona sob uma suposição simplificadora de que a única velocidade agindo sobre o controlador é a gravidade. Isso funciona porque o Nunchuk fica parado ou experimenta uma velocidade constante de uma força externa.





Calibração


Conforme descrito na visão geral das funções, cada função do joystick e do acelerômetro vem com uma versão calibrada e uma versão bruta. No início do arquivo de biblioteca, algumas constantes definem as posições zero. A melhor coisa seria ler as medidas brutas de seu controlador, quando você o mantém na posição neutra e adaptar as constantes de acordo.





Protocolo I2C


A última seção aqui discute o protocolo I2C real. Se você quer apenas usar o controlador, esta informação não é necessária, mas se você quiser entender o protocolo, espero poder economizar algum tempo.

Comecei a desenvolver procurando o endereço real do Nunchuk com meu scanner I2C, que é 0x52. A leitura dos parâmetros da memória do Nunchuk através do barramento I2C é bastante semelhante à comunicação com uma EEPROM I2C normal. Antes que os dados do Nunchuk possam ser lidos, é necessário enviar uma seqüência de inicialização.

Para ler os dados do Nunchuk, é necessário enviar o endereço a ser lido, pois o controlador do Nunchuk incrementa o endereço a cada leitura. Os dados nos quais estamos realmente interessados ​​estão no endereço 0x00 e têm 6 bytes de comprimento. No endereço 0x20 e 0x30 (parece ser uma cópia exata dos bytes em 0x20), 16 bytes de dados de calibração são armazenados. No endereço 0xFA você pode encontrar o número de identificação do dispositivo, que é 0xA4200000 para Nunchuck, 0xA4200101 para Classic Controller, 0xA4200402 para Balance e assim por diante.

Quando os dados precisam ser gravados no Nunchuk, o formato é análogo ao do comando de leitura. O primeiro byte é o endereço, seguido pelos dados reais.

Vamos examinar as sequências de bytes reais do Nunchuk para os recursos descritos:





1. Inicialize o Nunchuk:

  START, 0x40, 0x00, STOP  

Esta sequência é a sequência de inicialização normal, que define o algoritmo de criptografia como padrão. Cada byte que é lido do Nunchuk deve ser descriptografado com (x ^ 0x17) + 0x17 . A melhor maneira é desabilitar a criptografia com esta sequência:





2. Inicialize o Nunchuk sem criptografia:

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

Isso tem a vantagem de que os dados reais podem ser usados ​​sem a fórmula de descriptografia e também funcionará com clones do Nunchuk.





3. Leia a identificação do dispositivo no registro de extensão:

  START, 0xFA, STOPREAD 6 bytes  

O dado é o ident, que já mencionei, se o dispositivo conectado é um controlador Nunchuk ou Classic e assim por diante.





4. Leia as medições do dispositivo:

  START, 0x00, STOPREAD 6 bytes  

O que você recebe em troca é descrito nesta visão geral:
  • Bit Byte 7 6 5 4 3 2 1 0
  • 1 joystick de eixo X [7:0]
  • 2 joystick de eixo Y [7:0]
  • 3 Acelerômetro do eixo X [9:2]
  • 4 Acelerômetro Eixo Y [9:2]
  • 5 Acelerômetro de eixo Z [9:2]
  • 6 Az [1:0] Ay [1:0] Machado [1:0] ¬Bc ¬Bz

Portanto, os valores do botão são invertidos e os bits LSB do acelerômetro estão contidos no byte 6. Na biblioteca, eu combino os bits LSB com o resto. Já vi pessoas usando os valores sem os bits LSB, que é uma maneira muito simplificada de tornar o sinal mais estável. Para mim, prefiro um sinal ruidoso de um ADC, que pode ser facilmente filtrado com um filtro complementar ou de Kalman em vez de cortar os números por arredondamento - onde você perde muitas informações.





5. Leia os dados de calibração reais do dispositivo:

  START, 0x20, STOP READ 16byte  

O que você recebe em troca é descrito nesta visão geral:

Byte

Descrição
  • 1 valor 0G do eixo X [9:2]
  • 2 valor 0G do eixo Y [9:2]
  • 3 valor 0G do eixo Z [9:2]
  • 4 LSB de valor zero dos eixos X, Y, Z
  • 5 valor 1G do eixo X [9:2]
  • 6 valor 1G do eixo Y [9:2]
  • 7 valor 1G do eixo Z [9:2]
  • 8 LSB de valor 1G dos eixos X, Y, Z
  • 9 joystick no máximo para o eixo X
  • Mínimo de 10 joysticks no eixo X
  • 11 Joystick no centro do eixo X
  • 12 joystick de eixo Y máximo
  • Mínimo de 13 joystick com eixo Y
  • 14 Joystick no centro do eixo Y
  • 15 checksum
  • 16 Checksum

O byte 0-3 armazena os valores zero dos eixos X, Y e Z, enquanto os bytes 4-7 armazenam os valores em 1G (gravitação terrestre). Os dados de calibração ainda não foram usados ​​na implementação do software.

Código

  • Snippet de código # 1
Snippet de código # 1 Texto simples
 #include  #include "nunchuk.h" void setup () {Serial.begin (9600); Wire.begin (); // nunchuk_init_power (); // A1 e A2 são fontes de alimentação nunchuk_init ();} void loop () {if (nunchuk_read ()) {// Trabalhar com nunchuk_data nunchuk_print (); } atraso (10);} 
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk

Peças personalizadas e gabinetes


Processo de manufatura

  1. Usando remoto infravermelho com Raspberry Pi sem LIRC
  2. Luzes de dimerização com PWM usando o botão de ação
  3. Faça Monitor Ambilight usando Arduino
  4. Sistema de atendimento usando Arduino e RFID com Python
  5. Monitoramento de CO2 com Sensor K30
  6. Comunicação para surdos-cegos com 1Sheeld / Arduino
  7. Aceitar moeda de controle com Arduino
  8. Faça você mesmo voltímetro usando Arduino e Smartphone
  9. Monitor de freqüência cardíaca usando IoT
  10. Arduino com Bluetooth para controlar um LED!