Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Menggunakan Wii Nunchuk dengan Arduino

Komponen dan persediaan

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

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)
  • Arduino
  • 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:

  • Hijau → SDA
  • nc
  • Merah → 3v3
  • Putih → GND
  • nc
  • Kuning → SCL

Untuk klon Nunchuk yang saya dapatkan, berikut ini adalah warna dan tata letak pin konektornya:

  • Kuning → SDA
  • Hitam → nc
  • Hijau → 3v3
  • Merah → GND
  • nc
  • Putih → SCL

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:

  • Bit Byte 7 6 5 4 3 2 1 0
  • 1 Joystick X-Axis [7:0]
  • 2 Joystick Y-Axis [7:0]
  • 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

  • 1 0G nilai sumbu X [9:2]
  • 2 0G nilai sumbu Y [9:2]
  • 3 0G nilai sumbu Z [9:2]
  • 4 LSB nilai nol sumbu X,Y,Z
  • 5 Nilai sumbu X 1G [9:2]
  • 6 Nilai sumbu Y 1G [9:2]
  • 7 Nilai sumbu Z 1G [9:2]
  • 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
  • 15 Ceksum
  • 16 Ceksum

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 #1
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


Proses manufaktur

  1. Menggunakan IR Remote dengan Raspberry Pi tanpa LIRC
  2. Peredupan Lampu dengan PWM menggunakan Tombol Tekan
  3. Membuat Monitor Ambilight Menggunakan Arduino
  4. Sistem Kehadiran Menggunakan Arduino dan RFID dengan Python
  5. Pemantauan CO2 dengan Sensor K30
  6. Komunikasi Tunarungu dengan 1Sheeld/Arduino
  7. Kontrol Penerima Koin dengan Arduino
  8. Voltmeter DIY Menggunakan Arduino dan Smartphone
  9. Pemantau Detak Jantung Menggunakan IoT
  10. Arduino dengan Bluetooth untuk Mengontrol LED!