Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Index du Forum



Projet e-board


 
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets
Sujet précédent :: Sujet suivant  
Auteur Message
Projet e-board
Débutant

Hors ligne

Inscrit le: 20 Fév 2015
Messages: 2
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Sam 21 Fév - 11:35 (2015)    Sujet du message: Projet e-board Répondre en citant

PublicitéSupprimer les publicités ?
Bonjour à vous tous!

(J'ai reposter le sujet dans la section vos projets car au départ je l'avais placé dans la présentation... Rolling Eyes )

Bon voilà ce qui m'amène ici... un délire !
Je suis en cours de réalisation d'une longboard électrique. Je suis parti sur le projet de mettre une télécommande nunchuck snakbyte sans fil avec un arduino uno pour piloter l'esc du/des moteur(s) Bruschless.

Pour info, je suis tombé sur l'arduino il y a 15 jours et je trouve ça top! un petit robot me trotte déjà dans la tête mais bon il faudra appendre déjà!

J'ai tout mis en œuvre, mais lors de mes tests, je n'arrive pas à récupérer les valeurs de mon nunchuck.
Et c'est là que mes lacunes en programmation se font sentir !
Ci-après le code qui fonctionne en partie, surtout la synchronisation.
Pour info, j'ai seulement réussi à synchroniser le nunchuck et sa base lorsque j'ai appliqué la tension de 5V au lieu des 3.3V théoriques. 

le but pour l'instant est de récupérer les valeurs des différentes commandes restituées pour voir leurs stabilités et ensuite pouvoir m'en servir dans un programme final.

Et encore merci aux créateurs de ce code!



Citation:


//  Wireless Nunchuck soft for third party wireless nunchucks)
//  Created by Ein([email protected]),[email protected]eher
//  Dedicated version for Snakebyte Wireless Motion XS controller

//Arduino Duemilanove (ATMEGA 328) data wireing
//S1 - SCK
//S2 - SDA

//Arduino Duemilanove (ATMEGA 328) power wireing
//3.3V
//Ground

//1900 Ohm resistor between 3.3V and S1(SCK) 
//1900 Ohm resistor between 3.3V and S2(SDA)


#include <Wire.h>
//  Wireless Nunchuck soft for third party wireless nunchucks)
//  Created by Ein([email protected]),[email protected]eher
//  Dedicated version for Snakebyte Wireless Motion XS controller

//Arduino Duemilanove (ATMEGA 328) data wireing
//S1 - SCK
//S2 - SDA

//Arduino Duemilanove (ATMEGA 328) power wireing
//3.3V
//Ground

//1900 Ohm resistor between 3.3V and S1(SCK) 
//1900 Ohm resistor between 3.3V and S2(SDA)

#define USE_NEW_WAY_INIT 1      // use "The New Way" of initialization <http://wiibrew.org/wiki/Wiimote#The_New_Way>
#define WII_IDENT_LEN ((byte)6)
#define WII_TELEGRAM_LEN ((byte)6)
#define WII_NUNCHUCK_TWI_ADR ((byte)0x52)

#include <Wire.h>
#include <string.h>
#include <twi.h>
#undef int
#include <stdio.h>
#include <WProgram.h>

static uint8_t outbuf[WII_TELEGRAM_LEN];        // array to store arduino output
static int cnt = 0;
static int ledPin = 13;
static int nunchuck_joy_x, nunchuck_joy_y, nunchuck_c_button, nunchuck_z_button, nunchuck_accel_x, nunchuck_accel_y, nunchuck_accel_z;
static int nunchuck_calibrate_joy_x = 128, nunchuck_calibrate_joy_y = 130;    //subtract these values from nunchuck_joy values to get 0 as centered value

static byte readControllerIdent(byte* pIdent)
{
  static byte rc = 1;

  // read identification
  Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);    // transmit to device 0x52
  Wire.write (0xFA);        // sends memory address of ident in controller
  if(Wire.endTransmission () == 0)    // stop transmitting
  {
    static byte i;
    Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);    // request data from nunchuck
    for (i = 0; (i < WII_TELEGRAM_LEN) && Wire.available (); i++)
    {
    pIdent = Wire.read();    // receive byte as an integer
    }
    if(i == WII_TELEGRAM_LEN)
    {
    rc = 0;
    }
  }
  return rc;
}


// params:
//   timeout: abort when timeout (in ms) expires, 0 for unlimited timeout
//   return:  0 == ok, 1 == timeout
static byte nunchuck_init (unsigned short timeout)
{
  static byte rc = 1;
  unsigned long time = millis();
    do
    {
        Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);    // transmit to device 0x52
    Wire.write (0xF0);        // sends memory address Snakebyte Wireless Motion XS controller
    Wire.write (0x55);        // sends data.
        Serial.println("Handshake 1/2....");
        if(Wire.endTransmission() == 0) { // stop transmitting
            Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);    // transmit to device 0x52
        Wire.write (0xA5);        // sends memory address for Snakebyte Wireless Motion XS controller
          Wire.write (0x00);        // sends sent a zero.
            Serial.println("Handshake 2/2....");
            if(Wire.endTransmission () == 0){
              rc = 0;
        }
        }
    }     
  while (rc != 0 && (!timeout || ((millis() - time) < timeout)));
  Serial.println("OK.");
  delay(3000);
  return rc;
}


static void nunchuck_pre_init()
{
  Wire.begin(); // initialize i2c
  // we need to switch the TWI speed, because the nunchuck uses Fast-TWI
  // normally set in hardware\libraries\Wire\utility\twi.c twi_init()
  // this is the way of doing it without modifying the original files
  #define TWI_FREQ_NUNCHUCK 400000L
  TWBR = ((16000000 / TWI_FREQ_NUNCHUCK) - 16) / 2;

  nunchuck_init(0); // send the initialization handshake

  static byte i;
  if(readControllerIdent(outbuf) == 0)
  {
    Serial.print("Ident=");
    for (i = 0; i < WII_TELEGRAM_LEN; i++)
    {
    Serial.print(outbuf, HEX);
    Serial.print(' ');
    }
    Serial.println();
  }
}


static void clearTwiInputBuffer(void)
{
  // clear the receive buffer from any partial data
  while( Wire.available ())
    Wire.read ();
}


static void send_zero ()
{
  // I don't know why, but it only works correct when doing this exactly 3 times
  // otherwise only each 3rd call reads data from the controller (cnt will be 0 the other times)
  for(byte i = 0; i < 3; i++)
  {
    Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);    // transmit to device 0x52
    Wire.write (0x00);        // sends one byte
    Wire.endTransmission ();    // stop transmitting
    delay(5);
  }
}


// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits.  That is why I
// multiply them by 2 * 2
static void nunchuck_save ()
{
  nunchuck_joy_x = outbuf[0] - nunchuck_calibrate_joy_x;
  nunchuck_joy_y = outbuf[1] - nunchuck_calibrate_joy_y;
  nunchuck_accel_x = outbuf[2] * 2 * 2;
  nunchuck_accel_y = outbuf[3] * 2 * 2;
  nunchuck_accel_z = outbuf[4] * 2 * 2;

  nunchuck_z_button = 0;
  nunchuck_c_button = 0;

  // byte outbuf[5] contains bits for z and c buttons
  // it also contains the least significant bits for the accelerometer data
  // so we have to check each bit of byte outbuf[5]
  if ((outbuf[5] >> 0) & 1)
  {
    nunchuck_z_button = 1;
  }
  if ((outbuf[5] >> 1) & 1)
  {
    nunchuck_c_button = 1;
  }

  if ((outbuf[5] >> 2) & 1)
  {
    nunchuck_accel_x += 2;
  }
  if ((outbuf[5] >> 3) & 1)
  {
    nunchuck_accel_x += 1;
  }

  if ((outbuf[5] >> 4) & 1)
  {
    nunchuck_accel_y += 2;
  }
  if ((outbuf[5] >> 5) & 1)
  {
    nunchuck_accel_y += 1;
  }

  if ((outbuf[5] >> 6) & 1)
  {
    nunchuck_accel_z += 2;
  }
  if ((outbuf[5] >> 7) & 1)
  {
    nunchuck_accel_z += 1;
  }

}


static void nunchuck_save_data()
{
  clearTwiInputBuffer();

  // If we recieved the 6 bytes, then go print them
  if (cnt >= WII_TELEGRAM_LEN)
  {
    nunchuck_save ();
  }
}


// Decode data format that original Nunchuck uses with old init sequence. This never worked with
// other controllers (e.g. wireless Nunchuck from other vendors)
static char nunchuk_decode_byte (char x)
{
  x = (x ^ 0x17) + 0x17;
  return x;
}


static void nunchuck_get_data()
{
  send_zero (); // send the request for next bytes
  Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);    // request data from nunchuck

  for (cnt = 0; (cnt < WII_TELEGRAM_LEN) && Wire.available (); cnt++)
  {
    outbuf[cnt] = nunchuk_decode_byte (Wire.read ());    // receive byte as an integer
    digitalWrite (ledPin, HIGH);    // sets the LED on
  }
}

void setup()
{
  Serial.begin(38400);
  nunchuck_pre_init();
  Serial.println("Finished setup");
}

void loop()
{
  delay(20);  // Change for speed/accuracy of results

  nunchuck_get_data();
  nunchuck_save_data();

  Serial.print (nunchuck_joy_x, DEC);
  Serial.print ("\t");
  Serial.print (nunchuck_joy_y, DEC);
  Serial.print ("\t");
  Serial.print (nunchuck_c_button, DEC);
  Serial.print ("\t");
  Serial.print (nunchuck_z_button, DEC);
  Serial.print ("\t");
  Serial.print (nunchuck_accel_x, DEC);
  Serial.print ("\t");
  Serial.print (nunchuck_accel_y, DEC);
  Serial.print ("\t");
  Serial.print (nunchuck_accel_z, DEC);
  Serial.print ("\t");
  Serial.print ("\r\n");

  delay(1);
}





Et voici le résultat sur le port série:


23    1023    1023   
127    125    1    1    1023    1023    1023   
Handshake 1/2....
Handshake 2/2....
OK.
Finished setup
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
0    0    0    0    0    0    0   
127    125    1    1    1023    1023    1023   
127    125    1    1    1023    1023    1023   
127    125    1    1    1023    1023    1023   
127    125    1    1    1023    1023    1023   
127    125    1    1    1023    1023    1023   
127    125    1    1    1023    1023    1023   
127    125    1    1    1023    1023    1023   


les mouvements du nunchuck ne changeront pas les valeurs de sortie.

Alors pour moi le problème c'est au niveau du WII_TELEGRAM_LEN mais bon...
Je suis largué au niveau des buffers et autres découpage de bytes ...



Je vais allé me garer là
en attendant une âme charitable!
Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 09:06 (2017)    Sujet du message: Projet e-board

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino