I2C를 통해 Wii Nunchuk을 ESP32와 함께 사용하기 위한 라이브러리입니다. Arduino IDE 또는 ESP-IDF를 직접 사용하는 코드와 함께 사용할 수 있습니다. Arduino IDE 스케치에서 라이브러리를 사용하려면 wii_i2c.c
및 wii_i2c.h
파일을 스케치 디렉터리에 복사하면 됩니다.
Arduino Wire 라이브러리는 Wii 컨트롤러가 있는 ESP32에서 안정적으로 작동하지 않기 때문에 이 라이브러리는 ESP-IDF I2C API를 사용합니다.
이 라이브러리는 Wii Nunchuk 및 Wii 클래식 컨트롤러를 지원합니다. Wiibrew 프로젝트에서 사용할 수 있는 정보를 사용하여 Wiimote(예: Classic Controller Pro, Wii Motion Plus 등)에 연결되는 다른 I2C 장치와 작동하도록 조정하는 것은 어렵지 않을 것입니다. 그러나 이러한 장치가 없습니다. 그래서 잘 모르겠습니다.
ESP32용 Arduino Wire Library( Wire.h
)는 Wire
객체에 I2C 포트 0을 사용하고 Wire1
객체에 포트 1을 사용합니다. 따라서 이 라이브러리에서 I2C 포트 0을 사용하는 경우 Wire
사용하지 말고 I2C 포트 1을 사용하는 경우 Wire1
사용하지 마십시오.
다음은 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
}