Advertisement
IrvinHeslan

Arduino_Souris_Acceleromètre_Nunchuck_Final

Feb 18th, 2014
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.16 KB | None | 0 0
  1.     //Wii_Accéléromètre_Souris
  2.     //Irvin Heslan TS4
  3.     //Ce programme est basé sur celui existant créer par les concepteurs du logiciel Arduino
  4.     //Ce programme est une correction du précédent pour une meilleur calibration de l’accéléromètre
  5.     #define POWER_VIA_PORT_C2_C3 1 //définit les entrées d'alimentation de la carte Arduino pour le Nunchuck
  6.      
  7.     #define USE_NEW_WAY_INIT 1
  8.     #define WII_IDENT_LEN ((byte)8)  //définit la longueur de la donnée identité du Nunchuck
  9.     #define WII_TELEGRAM_LEN ((byte)8) //définit la longueur des données envoyés
  10.     #define WII_NUNCHUCK_TWI_ADR ((byte)0x52) //Adresse en I2C du Nunchuck
  11.      
  12.     #include <Wire.h>   //import de la librairie Wire qui permet la communication en I2C
  13.     #include <string.h> //import de la librairie string qui servira pour la conversion des données sortant du Nunchuck
  14.     #include <utility\twi.h>
  15.     #undef int
  16.     #include <stdio.h>
  17.     uint8_t outbuf[WII_TELEGRAM_LEN]; //on indique que les information seront de 8bits
  18.     int sensorPin = A2;
  19.     int magnetSensor;  
  20.     int cnt = 0;
  21.     void setup ()
  22.     {
  23.     Serial.begin (19200);
  24.     Serial.print("Start");
  25.     Mouse.begin(); //on indique que le protocole de prise de contrôle de la souris commence
  26.      
  27.     #ifdef POWER_VIA_PORT_C2_C3 //l'alimentation
  28.     delay(100);
  29.     #endif
  30.      
  31.     Wire.begin(); // la connection i2C s'initialise  
  32.     #define TWI_FREQ_NUNCHUCK 400000L //on indique la fréquence de l'horloge du nunchuck
  33.      
  34.      
  35.     nunchuck_init(0);
  36.     byte i;
  37.     if(readControllerIdent(outbuf) == 0)
  38.     {
  39.     Serial.print("Ident=");
  40.     for (i = 0; i < WII_TELEGRAM_LEN; i++)
  41.     {
  42.     Serial.print(outbuf[i], HEX);
  43.     Serial.print(' ');
  44.     }
  45.     Serial.println();
  46.     }
  47.      
  48.     Serial.println("Finished setup");
  49.     }
  50.      
  51.     byte nunchuck_init (unsigned short timeout)
  52.     {
  53.     byte rc = 1;
  54.      
  55.     #ifndef USE_NEW_WAY_INIT
  56.     Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
  57.     Wire.write (0x40);
  58.     Wire.write (0x00);
  59.     Wire.endTransmission ();
  60.     #else
  61.      
  62.      
  63.     unsigned long time = millis();
  64.     do
  65.     {
  66.     Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
  67.     Wire.write (0xF0);
  68.     Wire.write (0x55);
  69.     if(Wire.endTransmission() == 0)
  70.     {
  71.     Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
  72.     Wire.write (0xFB);
  73.     Wire.write (0x00);
  74.     if(Wire.endTransmission () == 0)
  75.     rc = 0;
  76.     }
  77.     }
  78.     while (rc != 0 && (!timeout || ((millis() - time) < timeout)));
  79.     #endif
  80.      
  81.     return rc;
  82.     }
  83.      
  84.      
  85.      
  86.     byte readControllerIdent(byte* pIdent)
  87.     {
  88.     byte rc = 1;
  89.      
  90.     Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
  91.     Wire.write (0xFA);
  92.     if(Wire.endTransmission () == 0)
  93.     {
  94.     byte i;
  95.     Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);
  96.     for (i = 0; (i < WII_TELEGRAM_LEN) && Wire.available (); i++)
  97.     {
  98.     pIdent[i] = Wire.read();
  99.     }
  100.     if(i == WII_TELEGRAM_LEN)
  101.     {
  102.     rc = 0;
  103.     }
  104.     }
  105.     return rc;
  106.     }
  107.      
  108.     void clearTwiInputBuffer(void)
  109.     {
  110.      
  111.     while( Wire.available ())
  112.     Wire.read ();
  113.     }
  114.      
  115.      
  116.     void write_zero ()
  117.     {
  118.      
  119.     for(byte i = 0; i < 3; i++)
  120.     {
  121.     Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);
  122.     Wire.write (0x00);
  123.     Wire.endTransmission ();
  124.     }
  125.     }
  126.      
  127.     void loop ()
  128.     {
  129.     Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);
  130.     for (cnt = 0; (cnt < WII_TELEGRAM_LEN) && Wire.available (); cnt++)
  131.     {
  132.     outbuf[cnt] = nunchuk_decode_byte (Wire.read ());
  133.     digitalWrite (ledPin, HIGH);
  134.     }
  135.      
  136.     // debug en cas de problème
  137.     #ifdef DEBUG_RCV_TEL
  138.     Serial.print("avail=");
  139.     Serial.print(Wire.available());
  140.     Serial.print(" cnt=");
  141.     Serial.println(cnt);
  142.     #endif
  143.      
  144.     clearTwiInputBuffer();
  145.      
  146.      
  147.     if (cnt >= WII_TELEGRAM_LEN)
  148.     {
  149.     print ();
  150.     }
  151.      
  152.     write_zero ();
  153.     delay (20);
  154.     }
  155.      
  156.      
  157.     void print ()
  158.     {
  159.     Serial.println(magnetSensor);
  160.     magnetSensor = digitalRead(sensorPin);
  161.     if(magnetSensor == HIGH){
  162.     int joy_x_axis = outbuf[0];
  163.     int joy_y_axis = outbuf[1];
  164.     int accel_x_axis = outbuf[2] * 2 * 2;
  165.     int accel_y_axis = outbuf[3] * 2 * 2;
  166.     int accel_z_axis = outbuf[4] * 2 * 2;
  167.      
  168.     int z_button = 0;
  169.     int c_button = 0;
  170.      
  171.      
  172.     if ((outbuf[5] >> 0) & 1)
  173.     {
  174.     z_button = 1;
  175.     }
  176.     if ((outbuf[5] >> 1) & 1)
  177.     {
  178.     c_button = 1;
  179.     }
  180.      
  181.     if ((outbuf[5] >> 2) & 1)
  182.     {
  183.     accel_x_axis += 2;
  184.     }
  185.     if ((outbuf[5] >> 3) & 1)
  186.     {
  187.     accel_x_axis += 1;
  188.     }
  189.      
  190.     if ((outbuf[5] >> 4) & 1)
  191.     {
  192.     accel_y_axis += 2;
  193.     }
  194.     if ((outbuf[5] >> 5) & 1)
  195.     {
  196.     accel_y_axis += 1;
  197.     }
  198.      
  199.     if ((outbuf[5] >> 6) & 1)
  200.     {
  201.     accel_z_axis += 2;
  202.     }
  203.     if ((outbuf[5] >> 7) & 1)
  204.     {
  205.     accel_z_axis += 1;
  206.     }
  207.      
  208.     //Partie permettant de bouger la souris lorsque l’accéléromètre est bougé
  209.    if (accel_x_axis <530) { //si l'axe de l’accéléromètre est inférieure alors
  210.   Mouse.move(10, 0, 0); //la souris bouge de 10 pixels en X
  211. }
  212. if (accel_x_axis <500) {
  213.   Mouse.move(10, 0, 0);
  214. }
  215. if (accel_x_axis >550){
  216.   Mouse.move(-10, 0, 0);
  217. }
  218. if (accel_y_axis <485){
  219.   Mouse.move(0, 10, 0);
  220. }
  221. if (accel_y_axis >530){
  222.   Mouse.move(0, -10, 0);
  223. }
  224.  
  225. if(digitalRead(z_button) == HIGH) { //Si la 1ère gâchette est appuyé alors
  226.    Serial.print("Clique Gauche");  //on affiche clique gauche dans la console
  227.    Mouse.press(MOUSE_LEFT);        //le clique droit est appuyé (simulé)
  228.    }
  229. if(digitalRead(z_button) == LOW){ //Si la 1ère gâchette n'est pas appuyé alors
  230.         Mouse.release(MOUSE_LEFT); //le clique gauche de la souris est relâché
  231.     }
  232. if(digitalRead(c_button) == HIGH) {
  233.    Serial.print("Clique Gauche");
  234.    Mouse.press(MOUSE_RIGHT);
  235.    }
  236. if(digitalRead(c_button) == LOW){
  237.         Mouse.release(MOUSE_RIGHT);
  238.     }
  239.  else{
  240.     Serial.println("Systeme a l'arret");
  241.       }    
  242. }
  243.      
  244.      
  245.     char nunchuk_decode_byte (char x)
  246.     {
  247.     #ifndef USE_NEW_WAY_INIT
  248.     x = (x ^ 0x17) + 0x17;
  249.     #endif
  250.     return x;
  251.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement