هذه مكتبة لاستخدام Wii Nunchuk مع ESP32 عبر I2C. يمكن استخدامه مع Arduino IDE أو مع التعليمات البرمجية باستخدام ESP-IDF مباشرة. لاستخدام المكتبة في رسم Arduino IDE الخاص بك، ما عليك سوى نسخ الملفات wii_i2c.c
و wii_i2c.h
إلى دليل الرسم الخاص بك.
تستخدم هذه المكتبة ESP-IDF I2C API لأن مكتبة Arduino Wire لا تعمل بشكل موثوق في ESP32 مع وحدات تحكم Wii.
تدعم هذه المكتبة جهاز Wii Nunchuk ووحدة تحكم Wii Classic . لن يكون من الصعب تكييفه للعمل مع أجهزة I2C الأخرى التي تقوم بتوصيل Wiimote (مثل Classic Controller Pro، وWii Motion Plus، وما إلى ذلك) بالمعلومات المتوفرة في مشروع Wiibrew، ولكن ليس لدي أي من هذه الأجهزة لذلك لا أعرف على وجه اليقين.
تستخدم مكتبة Arduino Wire Library لـ ESP32 (من Wire.h
) منفذ I2C 0 لكائن Wire
، والمنفذ 1 لكائن Wire1
. لذلك لا تستخدم Wire
إذا كنت تستخدم منفذ I2C 0 مع هذه المكتبة، ولا تستخدم Wire1
إذا كنت تستخدم منفذ I2C 1.
إليك مثال بسيط باستخدام Wii Nunchuk. للحصول على مثال أكثر اكتمالًا لاكتشاف أنواع وحدات التحكم المتعددة والتعامل معها، راجع 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 );
}
إذا كان لديك تعليمات برمجية حساسة للوقت ولا يمكنها الانتظار حتى تستجيب وحدة التحكم، فاستخدم وظيفة API التي تولد مهمة تقرأ حالة وحدة التحكم في مركز مختلف. على سبيل المثال:
# 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
}