산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Wii Nunchuk을 Arduino와 함께 사용

구성품 및 소모품

닌텐도 쌍절곤
× 1
SparkFun 레벨 시프터
× 1
Arduino UNO
× 1

이 프로젝트 정보

머리말

원래 이 게시물은 www.xarg.org에 게시되었습니다.

Arduino와 함께 Wii Nunchuk 사용

우리는 모두 게임 패드를 손에 들고 성장했으며 문자 그대로 가능한 모든 응용 프로그램과 결합하는 데 이상적입니다. Nintendo의 위대한 발명품은 Wii U 리모컨의 저렴한 확장 기능인 Nunchuk입니다. I2C를 전송 프로토콜로 사용하므로 컨트롤러의 원시 데이터에 쉽게 액세스할 수 있습니다. 너무 쉽기 때문에 표준 솔루션이 있어야한다고 생각했지만 안정적인 구현을 찾을 수 없었고 코드 조각이 많았습니다. 그래서 저는 이 공백을 채우는 데 집중했고 여기 있습니다. 이 기사에서는 세부 사항을 안내하고 Arduino용으로 구현합니다.

하드웨어

Nunchuk에는 버튼 C와 버튼 Z라는 두 개의 멤브레인 버튼이 있습니다. 장치 상단에는 아날로그 2축 조이스틱이 있으며 가속도계가 3차원 모두에 작용하는 힘을 측정하기 때문에 전체 장치가 움직임을 감지합니다. Nunchuk을 3v3으로 운용하는 것을 권장하며, 수명을 늘리기 위해 해당 전압을 공급할 수 없다면 반드시 레벨 시프터를 사용해야 합니다. 이 설정에는 최소한 다음 부품이 필요합니다.

부품

<울>
  • Nintendo Nunchuk(또는 복제품)
  • <울>
  • 아두이노
  • <울>
  • 레벨 시프터(선택 사항)
  • <울>
  • 눈척 어댑터(옵션)
  • 원본 Nunchuk 또는 복제품

    가장 큰 문제는 원래 Nintendo Nunchuk 또는 중국 복제품을 사야 합니까? 내 Nunchuk 드라이버를 테스트하기 위해 원본과 저렴한 사본을 모두 구입했습니다. 두 버전 모두 비싼 것과는 거리가 멀지만 차이는 약 10-15€입니다. 내가 말할 수 있는 것은 원래 Nunchuk의 케이블 전선이 차폐되어 있어 방해 요소에 대해 더 견고하다는 것입니다. 원본의 조이스틱은 품질이 더 높으며 전체 값 범위에서 모든 움직임을 해결할 수 있지만 복사본은 최소한의 움직임에 반응하지 않습니다. 또한 원본 가속도계의 품질이 더 좋습니다. 그러나 이러한 차이를 평준화하는 칼만 필터를 적용했습니다. 그래서 오래가는 컨트롤러를 원하신다면 오리지널로 가겠습니다. 저렴한 입력기기만 필요하시면 쌍절곤 카피가 나을 수도 있습니다.

    Nunchuk 커넥터

    Nintendo는 독점 플러그로 모든 주변 장치를 연결합니다. Wii가 없고 게임과 관련된 컨트롤러를 사용하지 않을 것이기 때문에 커넥터를 분리했습니다. 이 과감한 단계를 수행하고 싶지 않다면 몇 달러에 Nunchuk 어댑터를 얻을 수 있지만 약간의 납땜 기술이 있으면 어쨌든 플러그를 수리할 수 있습니다. 전선이 핀에 어떻게 연결되어 있는지 볼 수 있으므로 플러그를 여는 것이 좋습니다. 이것은 전선이 무작위로 연결될 수 있기 때문에 Nunchuk 복제본에서 특히 중요합니다. 또 다른 이상한 점은 원래 컨트롤러에는 4개의 와이어가 있고 복제본에는 5개의 와이어가 있는 반면 커넥터에는 실제로 6개의 핀이 있다는 것입니다. 자, 일을 시작하고 커넥터를 열겠습니다.

    그리고 전선을 잘라냅니다:

    플러그를 정면에서 보면 다음 핀이 표시됩니다.

    원래 Nunchuk의 경우 커넥터의 색상 및 핀 레이아웃은 다음과 같습니다.

    <울>
  • 녹색 → SDA
  • <울>
  • nc
  • <울>
  • 빨간색 → 3v3
  • <울>
  • 흰색 → GND
  • <울>
  • nc
  • <울>
  • 노란색 → SCL
  • 내가 얻은 Nunchuk 클론의 경우 커넥터의 색상과 핀 레이아웃은 다음과 같습니다.

    <울>
  • 노란색 → SDA
  • <울>
  • 검정 → nc
  • <울>
  • 녹색 → 3v3
  • <울>
  • 빨간색 → GND
  • <울>
  • nc
  • <울>
  • 흰색 → SCL
  • 내가 말했듯이 전선이 어떻게 배치되어 있는지 확인하고 색상으로 아무것도 연결하지 않아야합니다. 사용된 약어는 nc입니다. 연결되지 않은 경우 SDA - 데이터 라인(Arduino 보드의 A4에 연결해야 함) 및 SCL - 시계(A5에 연결). Arduino에는 3v3을 직접 사용할 수 있는 전압 조정기가 있습니다. WiiChuck 또는 유사한 Nunchuk 어댑터를 사용하려면 A2에 3v3을 연결하고 A1에 GND를 연결합니다. 나중에 nunchuk_init_power()를 호출해야 합니다. 이 전원 공급 장치 커넥터를 초기화합니다. 다음 Fritzing 스케치는 연결을 보여줍니다.

    소프트웨어

    나는 Nunchuk과의 통신을 구현하는 작은 헤더 라이브러리를 작성했습니다. 사실, 뒤에서 무슨 일이 일어나고 있는지 걱정할 필요가 없습니다. 바로 작동해야 합니다. 자세한 내용이 궁금하시다면 잠시 후에 설명해 드리겠습니다.

    눈축 라이브러리 다운로드

    Nunchuk과의 통신은 I2C의 또 다른 이름인 TWI 버스를 통해 이루어집니다. I2C 버스의 속도는 기본적으로 고속 모드(400kHz)로 설정되어 있습니다. Nunchuk을 Arduino와 함께 사용하려면 다음만 필요합니다.

    #include #include "nunchuk.h"void setup() { Serial.begin(9600); Wire.begin(); // nunchuk_init_power(); // A1 및 A2는 전원 공급 장치 nunchuk_init();}void loop() { if (nunchuk_read()) { // nunchuk_data로 작업 nunchuk_print(); } 지연(10);} 

    라이브러리와 함께 제공되는 처리 파일을 시작할 때 이 원뿔과 Nunchuk의 균형을 맞출 수 있습니다.

    nunchuk_print() 대신 많은 기능을 사용하여 실제 데이터에 액세스할 수 있습니다.

    쌍절곤 기능

    <울>
  • 눈척_버튼Z(): 1 또는 0, Z 버튼을 눌렀는지 여부
  • <울>
  • 눈척_버튼C(): 1 또는 0, C 버튼을 눌렀는지 여부
  • <울>
  • nunchuk_joystickX_raw() / nunchuk_joystickX() nunchuk_joystickY_raw() / nunchuk_joystickY(): 조이스틱의 x 또는 y 값입니다. 각 기능의 원시 버전을 사용하면 보정 없이 데이터에 액세스할 수 있습니다.
  • <울>
  • nunchuk_joystick_angle(): 조이스틱의 각도를 라디안 단위로 계산합니다.
  • <울>
  • nunchuk_accelX_raw() / nunchuk_accelX() nunchuk_accelY_raw() / nunchuk_accelY() nunchuk_accelZ_raw() / nunchuk_accelZ(): x-, y- 또는 z- 가속도계 값. 각 기능의 원시 버전을 사용하면 보정 없이 데이터에 액세스할 수 있습니다.
  • <울>
  • nunchuk_pitch(): 컨트롤러의 피치 각도를 라디안 단위로 계산합니다.
  • <울>
  • nunchuk_roll(): 컨트롤러의 롤 각도를 라디안 단위로 계산합니다.
  • 참고: nunchuk_yaw()가 없습니다. 가속도계는 방향력만 측정할 수 있고 회전 속도는 측정할 수 없기 때문입니다. 이 상황은 또한 피치를 180°로 제한하고 피치가 180°보다 클 때 롤 각도가 잘못되도록 합니다.

    피치 및 롤 각도의 계산은 또한 컨트롤러에 작용하는 유일한 속도가 중력이라는 단순화된 가정 하에 작동합니다. 이것은 Nunchuk이 정지 상태이거나 외부 힘으로부터 일정한 속도를 경험하기 때문에 작동합니다.

    보정

    기능 개요에 설명된 대로 조이스틱과 가속도계의 모든 기능은 보정된 원시 버전과 함께 제공됩니다. 라이브러리 파일의 시작 부분에서 일부 상수는 0 위치를 정의합니다. 가장 좋은 방법은 컨트롤러를 중립 위치에서 잡고 그에 따라 상수를 조정할 때 컨트롤러의 원시 측정값을 읽는 것입니다.

    I2C 프로토콜

    마지막 섹션에서는 실제 I2C 프로토콜에 대해 설명합니다. 컨트롤러만 사용하고 싶다면 이 정보는 필요없지만, 프로토콜을 이해하고 싶다면 조금이나마 시간을 아낄 수 있기를 바랍니다.

    나는 0x52인 I2C 스캐너로 Nunchuk의 실제 주소를 스캔하여 개발을 시작했습니다. I2C 버스를 통해 Nunchuk의 메모리에서 매개변수를 읽는 것은 일반 I2C EEPROM과의 통신과 매우 유사합니다. Nunchuk의 데이터를 읽기 전에 초기화 시퀀스를 보내야 합니다.

    Nunchuk에서 데이터를 읽으려면 Nunchuk의 컨트롤러가 읽을 때마다 주소를 증가시키기 때문에 읽을 주소를 보내야 합니다. 우리가 실제로 관심을 갖고 있는 데이터는 주소 0x00에 있으며 길이는 6바이트입니다. 주소 0x20 및 0x30(0x20에서 바이트의 정확한 복사본으로 보임)에는 16바이트의 교정 데이터가 저장됩니다. 주소 0xFA에서 장치의 식별 번호를 찾을 수 있습니다. Nunchuck의 경우 0xA4200000, Classic Controller의 경우 0xA4200101, Balance의 경우 0xA4200402 등입니다.

    Nunchuk에 데이터를 기록해야 하는 경우 형식은 읽기 명령과 유사합니다. 첫 번째 바이트는 주소이고 그 다음은 실제 데이터입니다.

    설명된 기능에 대해 Nunchuk의 실제 바이트 시퀀스를 살펴보겠습니다.

    1. Nunchuk 초기화:

    시작, 0x40, 0x00, 중지 

    이 시퀀스는 암호화 알고리즘을 기본값으로 설정하는 일반 초기화 시퀀스입니다. Nunchuk에서 읽은 모든 바이트는 (x ^ 0x17) + 0x17로 해독되어야 합니다. . 더 나은 방법은 다음 순서로 암호화를 비활성화하는 것입니다.

    2. 암호화 없이 Nunchuk 초기화:

    시작, 0xF0, 0x55, STOPSTART, 0xFB, 0x00, STOP 

    이것은 복호화 공식 없이도 실제 데이터를 사용할 수 있다는 이점이 있으며, Nunchuk 클론에서도 작동합니다.

    3. 확장 레지스터에서 장치 ID 읽기:

    START, 0xFA, STOPREAD 6바이트 

    데이터는 이미 언급한 ident인데, 연결된 장치가 Nunchuk 또는 Classic 컨트롤러 등인 경우입니다.

    4. 기기에서 측정값 읽기:

    START, 0x00, STOPREAD 6바이트 

    이에 대한 대가는 다음 개요에 설명되어 있습니다.

    <울>
  • 비트 바이트 7 6 5 4 3 2 1 0
  • <울>
  • 1 조이스틱 X축 [7:0]
  • <울>
  • 2 조이스틱 Y축 [7:0]
  • <울>
  • 3 가속도계 X축 [9:2]
  • <울>
  • 4 가속도계 Y축 [9:2]
  • <울>
  • 5 가속도계 Z축 [9:2]
  • <울>
  • 6 Az [1:0] Ay [1:0] 도끼 [1:0] ¬Bc ¬Bz
  • 따라서 버튼 값이 반전되고 가속도계의 LSB 비트가 바이트 6에 포함됩니다. 라이브러리에서 LSB 비트를 나머지와 결합합니다. 저는 사람들이 LSB 비트 없이 값을 사용하는 것을 보았는데, 이는 신호를 더 안정적으로 만드는 너무 단순화된 방법입니다. 저는 ADC의 잡음이 많은 신호를 선호합니다. 이 신호는 많은 정보를 잃게 되는 반올림으로 숫자를 자르는 대신 상보 필터나 칼만 필터로 쉽게 필터링할 수 있습니다.

    5. 기기에서 실제 보정 데이터 읽기:

    START, 0x20, STOP 읽기 16바이트 

    이에 대한 보상은 다음 개요에 설명되어 있습니다.

    바이트

    설명

    <울>
  • X축의 0G 값 1개[9:2]
  • <울>
  • 2 Y축의 0G 값[9:2]
  • <울>
  • Z축의 0G 값 3개[9:2]
  • <울>
  • X,Y,Z축의 Zero 값의 4개 LSB
  • <울>
  • 5 X축의 1G 값[9:2]
  • <울>
  • 6 Y축의 1G 값[9:2]
  • <울>
  • 7 Z축의 1G 값[9:2]
  • <울>
  • X,Y,Z축의 1G 값의 8개 LSB
  • <울>
  • 최대 조이스틱 X축 9개
  • <울>
  • 최소 조이스틱 X축 10개
  • <울>
  • 11 조이스틱 X축 중심
  • <울>
  • 최대 조이스틱 Y축 12개
  • <울>
  • 13 조이스틱 Y축 최소값
  • <울>
  • 14 조이스틱 Y축 중심
  • <울>
  • 15 체크섬
  • <울>
  • 16 체크섬
  • 바이트 0-3은 X, Y 및 Z 축의 0 값을 저장하는 반면 바이트 4-7은 1G(지구 중력)의 값을 저장합니다. 보정 데이터는 소프트웨어 구현에서 아직 사용되지 않습니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 코드 스니펫 #1
  • 코드 스니펫 #1일반 텍스트
    #include #include "nunchuk.h"void setup() { Serial.begin(9600); Wire.begin(); // nunchuk_init_power(); // A1 및 A2는 전원 공급 장치 nunchuk_init();}void loop() { if (nunchuk_read()) { // nunchuk_data로 작업 nunchuk_print(); } 지연(10);}
    깃허브
    https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk

    맞춤형 부품 및 인클로저


    제조공정

    1. LIRC 없이 Raspberry Pi와 함께 IR 리모컨 사용
    2. 푸시 버튼을 사용하여 PWM으로 조명 디밍
    3. Arduino를 사용하여 모니터 Ambilight 만들기
    4. Python과 함께 Arduino 및 RFID를 사용한 출석 시스템
    5. K30 센서로 CO2 모니터링
    6. 1Sheeld/Arduino를 사용한 청각 장애인용 통신
    7. Arduino로 코인 억셉터 제어
    8. Arduino와 스마트폰을 사용한 DIY 전압계
    9. IoT를 사용한 심박수 모니터
    10. Bluetooth가 탑재된 Arduino로 LED 제어!