Ini adalah perpustakaan untuk menggunakan Wii Nunchuk dengan ESP32 melalui I2C. Ini dapat digunakan baik dengan Arduino IDE atau dengan kode menggunakan ESP-IDF secara langsung. Untuk menggunakan perpustakaan di sketsa Arduino IDE Anda, cukup salin file wii_i2c.c
dan wii_i2c.h
ke direktori sketsa Anda.
Pustaka ini menggunakan API ESP-IDF I2C karena pustaka Arduino Wire tidak berfungsi dengan baik di ESP32 dengan pengontrol Wii.
Perpustakaan ini mendukung Wii Nunchuk dan Wii Classic Controller . Seharusnya tidak sulit untuk mengadaptasinya agar berfungsi dengan perangkat I2C lain yang menyambungkan Wiimote (seperti Classic Controller Pro, Wii Motion Plus, dll.) dengan informasi yang tersedia di proyek Wiibrew, tetapi saya tidak memiliki satu pun dari perangkat ini jadi saya tidak tahu pasti.
Perpustakaan Arduino Wire untuk ESP32 (dari Wire.h
) menggunakan port I2C 0 untuk objek Wire
, dan port 1 untuk objek Wire1
. Jadi jangan gunakan Wire
jika menggunakan I2C port 0 dengan perpustakaan ini, dan jangan gunakan Wire1
jika menggunakan I2C port 1.
Berikut contoh sederhana penggunaan Wii Nunchuk. Untuk contoh lebih lengkap yang mendeteksi dan menangani beberapa tipe pengontrol, lihat esp32-wii-nunchuk.ino
.
# include " wii_i2c.h "
// pins connected to the Nunchuk:
# define PIN_SDA 32
# define PIN_SCL 33
// ESP32 I2C port (0 or 1):
# define WII_I2C_PORT 0
void setup ()
{
Serial. begin ( 115200 );
if ( wii_i2c_init (WII_I2C_PORT, PIN_SDA, PIN_SCL) != 0 ) {
Serial. printf ( " Error initializing nunchuk :( " );
return ;
}
wii_i2c_request_state ();
}
void loop ()
{
const unsigned char *data = wii_i2c_read_state ();
wii_i2c_request_state ();
if (! data) {
Serial. printf ( " no data available :( " )
} else {
wii_i2c_nunchuk_state state;
wii_i2c_decode_nunchuk (data, &state);
Serial. printf ( " Stick position: (%d,%d) n " , state. x , state. y );
Serial. printf ( " C button is %s n " , (state. c ) ? " pressed " : " not pressed " );
Serial. printf ( " Z button is %s n " , (state. z ) ? " pressed " : " not pressed " );
}
delay ( 1000 );
}
Jika Anda memiliki kode yang sensitif terhadap waktu dan tidak dapat menunggu hingga pengontrol merespons, gunakan fungsi API yang memunculkan tugas yang membaca status pengontrol di inti yang berbeda. Misalnya:
# include " wii_i2c.h "
// pins connected to the controller:
# define PIN_SDA 32
# define PIN_SCL 33
// ESP32 I2C port (0 or 1):
# define WII_I2C_PORT 0
// CPU id where the task will run (1=the core
// where your code usually runs, 0=the other core):
# define READ_TASK_CPU 0
// delay in milliseconds between controller reads:
# define READ_DELAY 30
static unsigned int controller_type;
void setup ()
{
Serial. begin ( 115200 );
if ( wii_i2c_init (WII_I2C_PORT, PIN_SDA, PIN_SCL) != 0 ) {
Serial. printf ( " Error initializing nunchuk :( " );
return ;
}
// if you want to read the controller identity,
// do it BEFORE starting the read task:
const unsigned char *ident = wii_i2c_read_ident ();
controller_type = wii_i2c_decode_ident (ident);
// start the a task that reads the controller state in a different CPU:
if ( wii_i2c_start_read_task (READ_TASK_CPU, READ_DELAY) != 0 ) {
Serial. printf ( " Error creating task to read controller state " );
return ;
}
}
void loop ()
{
// this function always returns quickly, either
// with new data or NULL if data isn't ready:
const unsigned char *data = wii_i2c_read_data_from_task ();
if (data) {
// decode data according to controller_type:
// wii_i2c_decode_nunchuk(data, &nunchuk_state);
// wii_i2c_decode_classic(data, &classic_state);
}
// do other timing-sensitive stuff
}