[FIX]
A delay between requestFrom and available makes it work
I tested briefly with delay(1) and still looks good. MEGA irritating as my son would say
...
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
Wire.beginTransmission (0x52);
Wire.write (0x40);
Wire.write (0x00);
Wire.endTransmission ();
and this which works for my clone and the official Nunchuk
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
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
Wire.beginTransmission(0x52);
Wire.write(0xfe);
Wire.write (0x05);
Wire.endTransmission();
and this one which is getting more sophisticated
// 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
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.