Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Wii_Accéléromètre_Souris
- //Irvin Heslan TS4
- //Ce programme est basé sur celui existant créer par les concepteurs du logiciel Arduino
- #define POWER_VIA_PORT_C2_C3 1 //définit les entrées d'alimentation de la carte Arduino pour le Nunchuck
- #define USE_NEW_WAY_INIT 1
- #define WII_IDENT_LEN ((byte)8) //définit la longueur de la donnée identité du Nunchuck
- #define WII_TELEGRAM_LEN ((byte)8) //définit la longueur des données envoyés
- #define WII_NUNCHUCK_TWI_ADR ((byte)0x52) //Adresse en I2C du Nunchuck
- #include <Wire.h> //import de la librairie Wire qui permet la communication en I2C
- #include <string.h> //import de la librairie string qui servira pour la conversion des données sortant du Nunchuck
- #include <utility\twi.h>
- #undef int
- #include <stdio.h>
- uint8_t outbuf[WII_TELEGRAM_LEN]; //on indique que les information seront de 8bits
- int cnt = 0;
- void setup ()
- {
- Serial.begin (19200);
- Serial.print("Start");
- Mouse.begin(); //on indique que le protocole de prise de contrôle de la souris commence
- #ifdef POWER_VIA_PORT_C2_C3 //l'alimentation
- delay(100);
- #endif
- Wire.begin(); // la connection i2C s'initialise
- #define TWI_FREQ_NUNCHUCK 400000L //on indique la fréquence de l'horloge du nunchuck
- nunchuck_init(0);
- byte i;
- if(readControllerIdent(outbuf) == 0)
- {
- Serial.print("Ident=");
- for (i = 0; i < WII_TELEGRAM_LEN; i++)
- {
- Serial.print(outbuf[i], HEX);
- Serial.print(' ');
- }
- Serial.println();
- }
- Serial.println("Finished setup");
- }
- byte nunchuck_init (unsigned short timeout)
- {
- byte rc = 1;
- #ifndef USE_NEW_WAY_INIT
- Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
- Wire.write (0x40);
- Wire.write (0x00);
- Wire.endTransmission ();
- #else
- unsigned long time = millis();
- do
- {
- Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
- Wire.write (0xF0);
- Wire.write (0x55);
- if(Wire.endTransmission() == 0)
- {
- Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
- Wire.write (0xFB);
- Wire.write (0x00);
- if(Wire.endTransmission () == 0)
- rc = 0;
- }
- }
- while (rc != 0 && (!timeout || ((millis() - time) < timeout)));
- #endif
- return rc;
- }
- byte readControllerIdent(byte* pIdent)
- {
- byte rc = 1;
- Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
- Wire.write (0xFA);
- if(Wire.endTransmission () == 0)
- {
- byte i;
- Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);
- for (i = 0; (i < WII_TELEGRAM_LEN) && Wire.available (); i++)
- {
- pIdent[i] = Wire.read();
- }
- if(i == WII_TELEGRAM_LEN)
- {
- rc = 0;
- }
- }
- return rc;
- }
- void clearTwiInputBuffer(void)
- {
- while( Wire.available ())
- Wire.read ();
- }
- void write_zero ()
- {
- for(byte i = 0; i < 3; i++)
- {
- Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
- Wire.write (0x00);
- Wire.endTransmission ();
- }
- }
- void loop ()
- {
- Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);
- for (cnt = 0; (cnt < WII_TELEGRAM_LEN) && Wire.available (); cnt++)
- {
- outbuf[cnt] = nunchuk_decode_byte (Wire.read ());
- digitalWrite (ledPin, HIGH);
- }
- // debug en cas de problème
- #ifdef DEBUG_RCV_TEL
- Serial.print("avail=");
- Serial.print(Wire.available());
- Serial.print(" cnt=");
- Serial.println(cnt);
- #endif
- clearTwiInputBuffer();
- if (cnt >= WII_TELEGRAM_LEN)
- {
- print ();
- }
- write_zero ();
- delay (20);
- }
- void print ()
- {
- int joy_x_axis = outbuf[0];
- int joy_y_axis = outbuf[1];
- int accel_x_axis = outbuf[2] * 2 * 2;
- int accel_y_axis = outbuf[3] * 2 * 2;
- int accel_z_axis = outbuf[4] * 2 * 2;
- int z_button = 0;
- int c_button = 0;
- if ((outbuf[5] >> 0) & 1)
- {
- z_button = 1;
- }
- if ((outbuf[5] >> 1) & 1)
- {
- c_button = 1;
- }
- if ((outbuf[5] >> 2) & 1)
- {
- accel_x_axis += 2;
- }
- if ((outbuf[5] >> 3) & 1)
- {
- accel_x_axis += 1;
- }
- if ((outbuf[5] >> 4) & 1)
- {
- accel_y_axis += 2;
- }
- if ((outbuf[5] >> 5) & 1)
- {
- accel_y_axis += 1;
- }
- if ((outbuf[5] >> 6) & 1)
- {
- accel_z_axis += 2;
- }
- if ((outbuf[5] >> 7) & 1)
- {
- accel_z_axis += 1;
- }
- //Partie permettant de bouger la souris lorsque l’accéléromètre est bougé
- if (accel_x_axis <530) { //si l'axe de l’accéléromètre est inférieure alors
- Mouse.move(10, 0, 0); //la souris bouge de 10 pixels en X
- }
- if (accel_x_axis >540){
- Mouse.move(-10, 0, 0);
- }
- if (accel_y_axis <470){
- Mouse.move(0, 10, 0);
- }
- if (accel_y_axis >550){
- Mouse.move(0, -10, 0);
- }
- if(digitalRead(z_button) == HIGH) { //Si la 1ère gâchette est appuyé alors
- Serial.print("Clique Gauche"); //on affiche clique gauche dans la console
- Mouse.press(MOUSE_LEFT); //le clique droit est appuyé (simulé)
- }
- if(digitalRead(z_button) == LOW){ //Si la 1ère gâchette n'est pas appuyé alors
- Mouse.release(MOUSE_LEFT); //le clique gauche de la souris est relâché
- }
- if(digitalRead(c_button) == HIGH) {
- Serial.print("Clique Gauche");
- Mouse.press(MOUSE_RIGHT);
- }
- if(digitalRead(c_button) == LOW){
- Mouse.release(MOUSE_RIGHT);
- }
- }
- char nunchuk_decode_byte (char x)
- {
- #ifndef USE_NEW_WAY_INIT
- x = (x ^ 0x17) + 0x17;
- #endif
- return x;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement