Go Down

Topic: Arduino+nunchuk (Read 28 times) previous topic - next topic

thorhamhe

I'm trying to connect a logic 3 wireless nunchuk to my arduino uno. I use a wichuck to connect it. When i test the progamm using breadboard my both motors buging and dont do as i want. The program is the following, please help me to resolve it thanks you anyway  ;) :


#include <LiquidCrystal.h>
#include <Wire.h>

const byte Nombre_de_bit = 6; //constante du nombre de bit à prélever lors de l'acquisition
const byte Adresse_nunchuk = 0x52; //adresse  I2C du nunchuk

const byte droitplus = 0; // controle moteur droit plus
const byte droitmoins = 1; // controle moteur droit moins

const byte gaucheplus = 2; // controle moteur gauche plus
const byte gauchemoins = 3; // controle moteur gauche moins

const byte joy_x_mid = 124; // Valeur correspondant au décalage du joystick en x
const byte joy_y_mid = 132; // Valeur correspondant au décalage du joystick en y
LiquidCrystal lcd(7,12,11,10,9,8);// Initialisation du LCD


byte tableaubits[Nombre_de_bit]; //Définition d'un tableau contenant les valeurs des 6 bits envoyés par le nunchuk
int cnt = 0;

void setup (){
  Wire.begin(); // Initialise la communication i2c
  lcd.begin(16,2);
  pinMode(droitplus, OUTPUT);
  lcd.setCursor(0,1);
  lcd.write("mode manuel");
  pinMode(droitmoins, OUTPUT);
  pinMode(gaucheplus, OUTPUT);
  pinMode(gauchemoins, OUTPUT);
  pinMode(droitplus,OUTPUT);
}


/* Paramètres: timeout correspond à la limite de temps avec 0 illimité
Le retour de la fonction est 0 pour temps écoulé et 1 pour ok*/
byte initialisation_nunchuk (unsigned short timeout)
{
  byte resultat = 1;
  unsigned long time = millis();
  do
  {
    Wire.beginTransmission (Adresse_nunchuk); // On commence la transmission
    Wire.write (0xF0); // On envoie l'adresse
    Wire.write (0x55); // On envoie des données
    if(Wire.endTransmission() == 0) // Si la transmission est un succès
    {
        Wire.beginTransmission (Adresse_nunchuk); //On recommence la transmission
      Wire.write (0xFB); // On envoie une autre adresse
      Wire.write (0x00); // On envoie des données
      if(Wire.endTransmission () == 0) //si la transmission est de nouveau un succes
       {
        resultat = 0;//si le nunchuk ne répond pas on définit la valeur de renvoi sur 0: ne répond pas
       }
     }
   }
   while (resultat!= 0 && (!timeout || ((millis() - time) < timeout)));
   return resultat;
}



void effacer_memoire_recepteur(){
// efface du récepteur des données éventuelles
  while( Wire.available ())
  {
    Wire.read ();
  }
}


void mise_a_zero (){
  for(byte i = 0; i < 3; i++)
  {
    Wire.beginTransmission (Adresse_nunchuk); // On commence la transmission avec le réceteur
    Wire.write (0x00); // On envoie un bits de test
    Wire.endTransmission (); // on stoppe la transmission
  }
}

void loop (){
  initialisation_nunchuk(0); // Initialisation, on attend que le nunchuk réponde
  mise_a_zero (); // initialisation du nunchuk
  Wire.requestFrom (Adresse_nunchuk, Nombre_de_bit); // Récupération des données du nunchk
  for (cnt = 0; (cnt < Nombre_de_bit); cnt++)
  {
    tableaubits[cnt] = Wire.read (); //On récupère les bits un par un puis on les stockent dans le tableau
  }
  effacer_memoire_recepteur();//on efface la mémoire
 
  // Lorque les 6 bits on été récupérés, on agit en conséquence
  if (cnt >= Nombre_de_bit)
  {
     byte joy_x = tableaubits[0];
     byte joy_y = tableaubits[1];
     int xval = joy_x - joy_x_mid;
     int yval = joy_y - joy_y_mid;
     if(yval <0 && xval==0)
     { 
        digitalWrite(droitplus, LOW);
        digitalWrite(droitmoins, HIGH);
        digitalWrite(gaucheplus,LOW);
        digitalWrite(gauchemoins, HIGH);
     }
    if(yval ==0 && xval==0)
    {
      digitalWrite(gaucheplus,LOW);
      digitalWrite(gauchemoins,LOW);
      digitalWrite(droitplus,LOW);
      digitalWrite(droitmoins,LOW);
    }

    if(yval > 0 && xval==0)
    {
      digitalWrite(gaucheplus,HIGH);
      digitalWrite(gauchemoins, LOW);
      digitalWrite(droitplus, HIGH);
      digitalWrite(droitmoins, LOW);
    }

    if(xval>0)
    {
       digitalWrite(gaucheplus, HIGH);
       digitalWrite(gauchemoins, LOW);
       digitalWrite(droitplus,LOW);
       digitalWrite(droitmoins,LOW);
    }

    if(xval<0)
    {
      digitalWrite(droitplus, HIGH);
      digitalWrite(droitmoins,LOW);
      digitalWrite(gaucheplus,LOW);
      digitalWrite(gauchemoins,LOW);
    }
  }
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy