Go Down

Topic: Clone Nunchuk initialisation problems [FIXED] (Read 1 time) previous topic - next topic

acboother

Jul 02, 2013, 05:48 pm Last Edit: Jul 02, 2013, 08:46 pm by acboother Reason: 1
[FIX]
A delay between requestFrom and available makes it work  :smiley-yell:
I tested briefly with delay(1) and still looks good. MEGA irritating as my son would say
Code: [Select]
   
...
  Wire.requestFrom (0x52, 6);
  delay(10);
  while (Wire.available ())
...
...

[/FIX]

I am reposting this from "Sensors" as it seems to have generated no reaction.

I have just received a MadCatz.com Nunchuk and I am unable to initialise it.

I have another Nunchuk clone and an official Nunchuk which I can initialise and read.

I have tried all I can find on the Internet and they are shown below and none have worked.

'Official' Nunchuk code

Code: [Select]
 
 Wire.beginTransmission (0x52);
 Wire.write (0x40);
 Wire.write (0x00);
 Wire.endTransmission ();

and this which works for my clone and the official Nunchuk


 
Code: [Select]

 Wire.beginTransmission(0x52);  

 Wire.write(0xF0);              // 1st initialisation register
 Wire.write(0x55);              // 1st initialisation value

 Wire.endTransmission();

 delay(10);
 Wire.beginTransmission(0x52);
 Wire.write(0xFB);              // 2nd initialisation register
 Wire.write(0x00);              // 2nd initialisation value



I have also tried


 
Code: [Select]

 Wire.beginTransmission(0x53);    //WM+ starts out deactivated at address 0x53
 Wire.write(0xfe);                 //send 0x04 to address 0xFE to activate WM+
 Wire.write(0x05);
 Wire.endTransmission();          //WM+ jumps to address 0x52 and is now active

and


Code: [Select]

 Wire.beginTransmission(0x52);
 Wire.write(0xfe);
 Wire.write (0x05);
 Wire.endTransmission();


and this one which is getting more sophisticated

Code: [Select]

// params:
// timeout: abort when timeout (in ms) expires, 0 for unlimited timeout
// return: 0 == ok, 1 == timeout
byte x2nunchuck_init (unsigned short timeout)
{
 byte rc = 1;
 unsigned long time = millis();
 do
 {
   Wire.beginTransmission (0x52); // transmit to device 0x52
   Wire.write (0xF0); // sends memory address
   Wire.write (0x55); // sends data.
   if(Wire.endTransmission() == 0) // stop transmitting
   {
     Wire.beginTransmission (0x52); // transmit to device 0x52
     Wire.write (0xFB); // sends memory address
     Wire.write (0x00); // sends sent a zero.
     if(Wire.endTransmission () == 0) // stop transmitting
     {
       rc = 0;
     }
   }
 }
 while (rc != 0 && (!timeout || ((millis() - time) < timeout)));
 return rc;
}

and finally this most complex one
Code: [Select]


void  nunchuck_init ()        {

 // init controller
 delay(1);
 Wire.beginTransmission(0x52);      // device address
 Wire.write(0xF0);                    // 1st initialisation register
 Wire.write(0x55);                    // 1st initialisation value
 Wire.endTransmission();
 delay(1);
 Wire.beginTransmission(0x52);
 Wire.write(0xFB);                    // 2nd initialisation register
 Wire.write(0x00);                    // 2nd initialisation value
 Wire.endTransmission();
 delay(1);

 // read the extension type from the register block        
 Wire.beginTransmission(0x52);
 Wire.write(0xFA);                    // extension type register
 Wire.endTransmission();
 Wire.beginTransmission(0x52);
 Wire.requestFrom(0x52, 6);               // request data from controller
 for (cnt = 0; cnt < 6; cnt++) {
   if (Wire.available()) {
     pwbuff[cnt] = Wire.read(); // Should be 0x0000 A420 0101 for Classic Controller, 0x0000 A420 0000 for nunchuck
   }
 }
 Wire.endTransmission();
 delay(1);

 // send the crypto key (zeros), in 3 blocks of 6, 6 & 4.
 Wire.beginTransmission(0x52);
 Wire.write(0xF0);                    // crypto key command register
 Wire.write(0xAA);                    // sends crypto enable notice
 Wire.endTransmission();
 delay(1);
 Wire.beginTransmission(0x52);
 Wire.write(0x40);                    // crypto key data address
 for (cnt = 0; cnt < 6; cnt++) {
   Wire.write(0x00);                    // sends 1st key block (zeros)
 }
 Wire.endTransmission();
 Wire.beginTransmission(0x52);
 Wire.write(0x40);                    // sends memory address
 for (cnt = 6; cnt < 12; cnt++) {
   Wire.write(0x00);                    // sends 2nd key block (zeros)
 }
 Wire.endTransmission();
 Wire.beginTransmission(0x52);
 Wire.write(0x40);                    // sends memory address
 for (cnt = 12; cnt < 16; cnt++) {
   Wire.write(0x00);                    // sends 3rd key block (zeros)
 }
 Wire.endTransmission();
 delay(1);
 // end device init
}


Although I can get back a set of data from the Nunchuk it is all the same and never changes I thought that I must be reading something but I'm not so sure now...

I ran up the scanner test sketch and it doesn't find any I2C devices when this clone is plugged in. Does this help identify the cause and possible solution BUT I dug out the Wii and it works on the Wii okay.  
Try, try and try again. Always trying... so my wife says.
Enhanced Serial Monitor - http://alanboother.co.uk/project-cafe/esm/

acboother

Diagnostic update...

I didn't notice this first time round but after the intialisation routine immediately after uploading the Nunchuk does NOT read correctly but hangs!!!

If I unplug the Nunchuk and then plug it back in without a reset or upload it starts to read but it is now that the values do not change.

Using this initialisation routine

Code: [Select]
 


  Wire.beginTransmission(0x52);   // device address

  Wire.write(0xF0);              // 1st initialisation register

  Wire.write(0x55);              // 1st initialisation value

  Wire.endTransmission();

  Wire.beginTransmission(0x52);

  Wire.write(0xFB);              // 2nd initialisation register

  Wire.write(0x00);              // 2nd initialisation value

;



and registers 0x32 and 0x33 for reading 

<I promised myself I wouldn't look it this again until I ha some new information to work with...  :smiley-sad-blue:
Try, try and try again. Always trying... so my wife says.
Enhanced Serial Monitor - http://alanboother.co.uk/project-cafe/esm/

acboother

I have put a 'scope on the SDA and SCL pins for both the official Nunchuk and the clone an as far as I can tell they both look the same (mind you I barely know what I'm looking at).

Here is the trace from the clone



So something similar is going on for both controllers
Try, try and try again. Always trying... so my wife says.
Enhanced Serial Monitor - http://alanboother.co.uk/project-cafe/esm/

Go Up