Il s'agit d'une bibliothèque pour utiliser le Wii Nunchuk avec l'ESP32 via I2C. Il peut être utilisé à la fois avec l'IDE Arduino ou avec du code utilisant directement l'ESP-IDF. Pour utiliser la bibliothèque dans votre sketch Arduino IDE, copiez simplement les fichiers wii_i2c.c
et wii_i2c.h
dans votre répertoire de sketch.
Cette bibliothèque utilise l'API ESP-IDF I2C car la bibliothèque Arduino Wire ne fonctionne pas de manière fiable dans l'ESP32 avec les contrôleurs Wii.
Cette bibliothèque prend en charge le Wii Nunchuk et la manette Wii Classic . Il ne devrait pas être difficile de l'adapter pour qu'il fonctionne avec d'autres appareils I2C qui branchent la Wiimote (comme le Classic Controller Pro, le Wii Motion Plus, etc.) avec les informations disponibles dans le projet Wiibrew, mais je n'ai aucun de ces appareils donc je ne sais pas avec certitude.
La bibliothèque Arduino Wire pour l'ESP32 (de Wire.h
) utilise le port I2C 0 pour l'objet Wire
et le port 1 pour l'objet Wire1
. N'utilisez donc pas Wire
si vous utilisez le port I2C 0 avec cette bibliothèque, et n'utilisez pas Wire1
si vous utilisez le port I2C 1.
Voici un exemple simple utilisant le Wii Nunchuk. Pour un exemple plus complet qui détecte et gère plusieurs types de contrôleurs, consultez 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 );
}
Si vous disposez d'un code urgent qui ne peut pas attendre la réponse du contrôleur, utilisez la fonction API qui génère une tâche qui lit l'état du contrôleur dans un autre noyau. Par exemple:
# 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
}