Tentang proyek ini
Kata Pengantar
Awalnya, posting ini diterbitkan di www.xarg.org.
Menggunakan Wii Nunchuk dengan Arduino
Kita semua tumbuh dengan bantalan permainan di tangan kita, yang membuatnya ideal untuk menggabungkannya dengan aplikasi apa pun yang memungkinkan. Penemuan hebat Nintendo adalah Nunchuk, ekstensi murah untuk remote Wii U. Karena menggunakan I2C sebagai protokol transportasi, mudah untuk mengakses data mentah pengontrol. Karena sangat mudah, saya pikir harus ada solusi standar untuk itu, tetapi tidak dapat menemukan implementasi yang stabil, tetapi hanya memuat potongan kode. Itu sebabnya saya fokus mengisi celah ini dan ini dia. Dalam artikel ini, saya akan memandu Anda melalui detail dan mengimplementasikannya untuk Arduino.
Perangkat Keras
Nunchuk memiliki dua tombol membran, yang disebut tombol C dan tombol Z. Di atas perangkat ada joystick dua sumbu analog dan seluruh perangkat peka terhadap gerakan, karena akselerometer mengukur gaya yang bekerja pada ketiga dimensi. Direkomendasikan untuk mengoperasikan Nunchuk dengan 3v3 dan Anda harus benar-benar menggunakan level shifter jika Anda tidak dapat mensuplai voltase itu untuk meningkatkan masa pakainya. Minimal, Anda memerlukan bagian berikut untuk penyiapan ini:
Bagian - Nintendo Nunchuk (atau replika)
- Penggeser Level (opsional)
- Adaptor Nunchuk (opsional)
Nunchuk atau replika asli
Pertanyaan besarnya adalah, haruskah Anda membeli Nintendo Nunchuk asli atau replika Cina? Untuk menguji driver Nunchuk saya, saya membeli keduanya - asli dan salinan murah. Kedua versi jauh dari mahal, tetapi perbedaannya sekitar 10-15€. Apa yang bisa saya katakan adalah, kabel kabel Nunchuk asli terlindung, yang membuatnya lebih kuat terhadap gangguan. Joystick asli memiliki kualitas yang lebih tinggi, dapat menyelesaikan semua gerakan dalam rentang nilai penuh, sementara salinan tidak bereaksi terhadap gerakan minimal. Kualitas akselerometer aslinya juga lebih baik. Namun, saya menerapkan Filter Kalman, yang menyamakan perbedaan ini. Jadi, jika Anda menginginkan pengontrol yang tahan lama, saya akan menggunakan yang asli, jika Anda hanya membutuhkan perangkat input yang murah, Anda mungkin beruntung dengan salinan Nunchuk.
Konektor Nunchuk
Nintendo menghubungkan semua periferal dengan steker berpemilik. Karena saya tidak memiliki Wii dan tidak akan menggunakan pengontrol untuk sesuatu yang berhubungan dengan game, saya merobek konektornya. Anda bisa mendapatkan adaptor Nunchuk untuk beberapa dolar, jika Anda tidak ingin melakukan langkah drastis ini, tetapi dengan beberapa keterampilan menyolder, Anda tetap bisa memperbaiki stekernya. Saya sarankan membuka steker, karena Anda dapat melihat bagaimana kabel terhubung ke pin. Ini sangat penting untuk replika Nunchuk, karena kabel dapat dihubungkan secara acak. Hal aneh lainnya adalah, controller asli memiliki 4 kabel dan replika mendapat 5, sedangkan konektor sebenarnya memiliki 6 pin. Oke, mari kita mulai bekerja dan membuka konektor:
Dan potong kabelnya:
Saat melihat bagian depan steker, Anda akan melihat pin ini:
Untuk Nunchuk asli, berikut ini adalah warna dan tata letak pin konektor:
Untuk klon Nunchuk yang saya dapatkan, berikut ini adalah warna dan tata letak pin konektornya:
Seperti yang saya katakan, Anda pasti harus melihat bagaimana kabel diletakkan dan tidak menghubungkan apa pun dengan warnanya. Singkatan yang digunakan adalah:nc
untuk tidak terhubung, SDA - jalur data (harus terhubung dengan A4 di papan Arduino) dan SCL - jam (terhubung dengan A5). Arduino mendapat pengatur tegangan, yang memungkinkan kita untuk menggunakan 3v3 secara langsung. Jika Anda ingin menggunakan WiiChuck atau adaptor Nunchuk serupa, sambungkan 3v3 dengan A2 dan GND dengan A1 - nanti Anda perlu memanggil nunchuk_init_power()
untuk menginisialisasi konektor catu daya ini. Sketsa Fritzing berikut mengilustrasikan hubungannya:
Perangkat Lunak
Saya menulis perpustakaan header kecil, yang mengimplementasikan komunikasi dengan Nunchuk. Bahkan, Anda tidak perlu khawatir tentang apa yang terjadi di balik layar, itu harus bekerja di luar kotak. Jika Anda tertarik dengan detailnya, saya akan menjelaskannya sebentar lagi.
Unduh Perpustakaan Nunchuk
Komunikasi dengan Nunchuk dilakukan melalui bus TWI, yang merupakan nama lain untuk I2C (oke, beberapa detail berbeda, yang tidak masalah untuk tujuan kami). Kecepatan bus I2C diatur ke Mode Cepat (400kHz) secara default. Untuk menggunakan Nunchuk dengan Arduino Anda, hanya berikut ini yang diperlukan:
#include #include "nunchuk.h"void setup() { Serial.begin(9600); Kawat.mulai(); // nunchuk_init_power(); // A1 dan A2 adalah catu daya nunchuk_init();}void loop() { if (nunchuk_read()) { // Bekerja dengan nunchuk_data nunchuk_print(); } delay(10);}
Saat memulai file Pemrosesan yang dikirimkan bersama perpustakaan, Anda dapat menyeimbangkan kerucut ini dengan Nunchuk Anda:
Alih-alih nunchuk_print()
banyak fungsi yang dapat digunakan untuk mengakses data aktual:
Fungsi Nunchuk nunchuk_buttonZ():
1 atau 0, apakah tombol Z ditekan atau tidak
nunchuk_buttonC():
1 atau 0, apakah tombol C ditekan atau tidak
nunchuk_joystickX_raw() / nunchuk_joystickX() nunchuk_joystickY_raw() / nunchuk_joystickY():
Nilai x atau y dari joystick. Versi mentah untuk setiap fungsi memberikan akses ke data tanpa kalibrasi.
nunchuk_joystick_angle():
Menghitung sudut joystick dalam radian.
nunchuk_accelX_raw() / nunchuk_accelX() nunchuk_accelY_raw() / nunchuk_accelY() nunchuk_accelZ_raw() / nunchuk_accelZ():
x-, y- atau z-
nilai akselerometer. Versi mentah untuk setiap fungsi memberikan akses ke data tanpa kalibrasi.
nunchuk_pitch():
Menghitung sudut nada pengontrol dalam radian.
nunchuk_roll():
Menghitung sudut gulungan pengontrol dalam radian.
Catatan: Tidak ada nunchuk_yaw()
fungsi, karena akselerometer hanya dapat mengukur gaya arah dan tidak ada kecepatan rotasi. Keadaan ini juga membatasi pitch hanya 180° dan memaksa sudut roll menjadi salah saat pitch lebih besar dari 180°.
Perhitungan sudut pitch dan roll juga bekerja di bawah asumsi penyederhanaan, bahwa satu-satunya kecepatan yang bekerja pada pengontrol adalah gravitasi. Ini bekerja karena Nunchuk tidak bergerak atau mengalami kecepatan konstan dari gaya eksternal.
Kalibrasi
Seperti yang dijelaskan dalam ikhtisar fungsi, setiap fungsi joystick dan akselerometer dilengkapi dengan versi yang dikalibrasi dan mentah. Di awal file library, beberapa konstanta menentukan posisi nol. Hal terbaik adalah membaca pengukuran mentah pengontrol Anda, saat Anda menahannya di posisi netral dan menyesuaikan konstanta yang sesuai.
Protokol I2C
Bagian terakhir di sini membahas protokol I2C yang sebenarnya. Jika Anda hanya ingin menggunakan pengontrol, informasi ini tidak diperlukan, tetapi jika Anda ingin memahami protokolnya, saya harap saya dapat menghemat waktu Anda.
Saya mulai mengembangkan dengan memindai alamat Nunchuk yang sebenarnya dengan pemindai I2C saya, yaitu 0x52. Membaca parameter dari memori Nunchuk melalui bus I2C sangat mirip dengan komunikasi dengan EEPROM I2C normal. Sebelum data dari Nunchuk dapat dibaca, perlu mengirimkan urutan inisialisasi.
Untuk membaca data dari Nunchuk, perlu mengirim alamat untuk dibaca, karena pengontrol Nunchuk menambah alamat dengan setiap pembacaan. Data yang sebenarnya kami minati terletak pada alamat 0x00 dan panjangnya 6 byte. Pada alamat 0x20 dan 0x30 (tampaknya merupakan salinan persis dari byte pada 0x20), 16 byte data kalibrasi disimpan. Di alamat 0xFA Anda dapat menemukan nomor identitas perangkat, yaitu 0xA4200000 untuk Nunchuck, 0xA4200101 untuk Classic Controller, 0xA4200402 untuk Balance dan seterusnya.
Ketika data perlu ditulis ke Nunchuk, formatnya analog dengan perintah baca. Byte pertama adalah alamat, diikuti dengan data sebenarnya.
Mari menelusuri urutan byte Nunchuk yang sebenarnya untuk fitur yang dijelaskan:
1. Inisialisasi Nunchuk: MULAI, 0x40, 0x00, BERHENTI
Urutan ini adalah urutan inisialisasi normal, yang menetapkan algoritma enkripsi ke default. Setiap byte yang dibaca dari Nunchuk kemudian harus didekripsi dengan (x ^ 0x17) + 0x17
. Cara yang lebih baik adalah menonaktifkan enkripsi dengan urutan ini:
2. Inisialisasi Nunchuk tanpa enkripsi: MULAI, 0xF0, 0x55, STOPSTART, 0xFB, 0x00, STOP
Ini memiliki keuntungan bahwa data aktual dapat digunakan tanpa rumus dekripsi dan akan bekerja dengan klon Nunchuk juga.
3. Baca ID perangkat dari register ekstensi: MULAI, 0xFA, BERHENTI 6 byte
Datanya adalah ident yang sudah saya sebutkan, jika perangkat yang terhubung adalah Nunchuk atau Classic controller dan sebagainya.
4. Baca pengukuran dari perangkat: MULAI, 0x00, BERHENTI 6 byte
Apa yang Anda dapatkan sebagai imbalan dijelaskan dalam ikhtisar ini:
- 3 Akselerometer Sumbu X [9:2]
- 4 Akselerometer Sumbu Y [9:2]
- 5 Akselerometer Sumbu Z [9:2]
- 6 Az [1:0] Ay [1:0] Kapak [1:0] Bc Bz
Jadi, nilai tombol dibalik, dan bit LSB dari akselerometer terkandung dalam byte 6. Di perpustakaan, saya menggabungkan bit LSB dengan sisanya. Saya telah melihat orang menggunakan nilai tanpa bit LSB, yang merupakan cara yang terlalu disederhanakan untuk mendapatkan sinyal yang lebih stabil. Bagi saya, saya lebih suka sinyal bising dari ADC, yang dapat dengan mudah disaring dengan Filter Pelengkap atau Kalman daripada memotong angka dengan pembulatan - di mana Anda kehilangan banyak informasi.
5. Baca data kalibrasi aktual dari perangkat: MULAI, 0x20, BERHENTI BACA 16byte
Apa yang Anda dapatkan sebagai imbalan dijelaskan dalam ikhtisar ini:
Byte
Deskripsi
- 4 LSB nilai nol sumbu X,Y,Z
- 8 LSB nilai 1G sumbu X,Y,Z
- 9 sumbu X Joystick maksimum
- Minimum 10 sumbu X Joystick
- 11 Pusat sumbu X joystick
- 12 sumbu Y maksimum joystick
- Minimum 13 sumbu Y joystick
- 14 pusat sumbu Y joystick
Byte 0-3 menyimpan nilai nol dari sumbu X, Y dan Z, sedangkan byte 4-7 menyimpan nilai pada 1G (gravitasi bumi). Data kalibrasi belum digunakan dalam implementasi perangkat lunak.
Kode
Cuplikan kode #1Teks biasa
#include #include "nunchuk.h"void setup() { Serial.begin(9600); Kawat.mulai(); // nunchuk_init_power(); // A1 dan A2 adalah catu daya nunchuk_init();}void loop() { if (nunchuk_read()) { // Bekerja dengan nunchuk_data nunchuk_print(); } delay(10);}
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk Suku cadang dan penutup khusus