- LiFePO4 Speicher Test         
Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 49

Thema: Wii Nunchuck an Arduino

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Anzeige

    Powerstation Test
    was für eine clock-rate hat dein I2C eigentlich?! nicht dass der 400kHz versucht und dein nunchuck einfach nicht mitkommt?
    ich konnte jetzt konkret keine infos dazu in den vorherigen posts finden oder habs übersehen

    vielleicht muss tdu einfach mal einen gang zurückschalten
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #12
    HaWe
    Gast
    wie gesagt, ich habe grundsätzlich 100kHz und 400kHz mit anderen Geräten und auch einem Scanner (inkl. Nunchuk) einwandfrei getestet, aber per default verwendet Arduino immer 100kHz (auch im Beisp. oben). Auch die AVRs laufen mit dem Code also einwandfrei mit 100kHz mit dem Nunchuk-Code, daran kann es also nicht liegen.
    Auch die Pullups waren in beiden Fällen je 4k7.
    Geändert von HaWe (08.04.2019 um 08:59 Uhr)

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Auch die AVRs laufen mit dem Code also einwandfrei mit 100kHz mit dem Nunchuk-Code, daran kann es also nicht liegen.
    nicht zwingend, im I2C protokoll gibt es auch sog. clock stretching und das kann je nach konfiguration (auf die du angeblich laut arduino foren keinen einfluss nehmen kannst) vielleicht zu lange dauern

    ich weis zum beispiel aus eigener leidlicher erfahrung, dass ein gewöhnlicher atmega z.b. nur clockstretching bis maximal 25mS erlaubt und dann stumpf weiter taktet (eine konvention des SMBus, weil atmel keine I2C lizenz hatte haben sie einfach den baugleichen SMBus als referenz genommen) ... aber das ist nur als beispiel gemeint, das betrifft dein problem nicht

    aber vielleicht gibt es noch andere effekte die mit irgendwelchen timings zusammen hängen

    (auch ein kleines beispiel: ein pic schafft es unter umständen mit dem timing im UART einen atmega ins stolpern zu bringen weil der pic die bit timings "zu exakt" einhält und der atmega das stopbit "verpasst")
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #14
    HaWe
    Gast
    hmmmhhh...
    das wäre ntl blöde, aber vlt kennt jemand DOCH Tricks, um den Nunchuk mit Arduino-Code auf ARMs anzusteuern...?

    Wie gesagt,
    Was jetzt weiterhelfen würde zur Bestätigung und zum Debuggen:
    wenn jemand einen funktionierenden Nunchuk besitzt und einen Arduino Due (oder Adafruit M4) und dann guckt, ob er meine Fehlmessungen z.B. mit dem Code oben (und seinen Patchs/Änderungen) bestätigen kann.

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    ein weiterer Hinweis den ich gefunden habe, zwischen der "Busfreigabe und Busübernahme" (was zum geier auch damit gemeint ist, ich behaupte mal zwischen einem stop und dem folgenden start bzw. zwischen dem stop und restart beim lesen) sollten wohl mind. 300uS Pause sein da sich der Chuck sonst weghängen kann (gerade das klingt plausibel, da die ARMs deutlich schneller arbeiten als atmegas)

    wie du das aber realisierst entzieht sich leider meienr kenntnis, aber es klingt stark danach dass der chuck selbst kein clock stretching beherrscht und einfach darauf hofft dass der master nicht zu schnell nachfragt (hab ich auhc schon mit einem signalwandler erlebt, kein clock stretch und einfach nur aufgehängt, weil ich nicht genug gewartet habe)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #16
    HaWe
    Gast
    danke für die Infos!
    Jetzt bräuchte ich allerdings wen, der die Fehler tatsächlich findet und sie "fixen" kann...

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich habe evtl. noch eine Idee.
    Ich hatte mal Probleme weil ich mein NACK nicht oder zu spät gesendet hatte,
    wenn ich mir den Code ansehe, kommt dein NACK evtl. zu spät.
    Du liest alle Daten ein, jeweils mit einem ACK
    Am Ende liest Du nochmal ein "Dummy" ein mit dem NACK. Da gibt es garnichts mehr zulesen.
    Das NACK muss meines Wissen nach direkt beim letzten Byte gesendet werden
    (Das ist nur ein Vermutung)

    Kannst Du das mal ausprobieren:

    data->acc_z = NunchukDecode(I2cReadByte(I2C_NACK)) << 2; // hier schon das NACK
    // temp = NunchukDecode(I2cReadByte(I2C_NACK)); // die Zeile weg.

    Verschiedene Chips scheinen sich hier unterschiedlich zu verhalten.
    Bei mir ging es zunächst, dann hab ich ein anderes EEPROM gehabt und da trat erstmals der Fehler auf.

    Siro
    Geändert von Siro (08.04.2019 um 15:25 Uhr)

  8. #18
    HaWe
    Gast
    die Zeile finde ich nicht...
    Code:
    /*
     *  Nunchuk auslesen
     *
     *  funktioniert mit original Nunchuck
     *  UND mit Wirelesse Nunchuck
     *
     *  Pinbelegung:
     *      3.3V  (Kabel rot)
     *      GND   (Kabel weiß)
     *      A4    (Kabel grün)
     *      A5    (Kabel gelb)
     */
    
    #include <Wire.h>
    
    const int dataLength = 6;             //  numer ob bytes to request
    static byte rawData[dataLength];      //  array to store nunchuck data
    
    //  construct to create an enumerated list of the sonsor values returned from the nunchuck
    enum nunchuckItems  {  joyX, joyY, accelX, accelY, accelZ, btnZ, btnC };
    
    void setup()
    {
        Serial.begin(57600);
        delay(500);
        Serial.println("Labels,Xjoy,Yjoy,Xaccel,Yaccel,Zaccel,Z-btn,C-btn,");
        delay(500);
       
        nunchuckInit();
    }
    
    void loop()
    {
      if (nunchuckRead() == true)
     {
        Serial.print("Data,");          // Data-Header
        Serial.print(getValue(joyX), DEC);
        Serial.write(",");
        Serial.print(getValue(joyY), DEC);
        Serial.write(",");
        Serial.print(getValue(accelX), DEC);
        Serial.write(",");
        Serial.print(getValue(accelY), DEC);
        Serial.write(",");
        Serial.print(getValue(accelZ), DEC);
        Serial.write(",");
        Serial.print(getValue(btnZ), DEC);
        Serial.write(",");
        Serial.print(getValue(btnC), DEC);
        // Serial.write(",0");
        // Serial.write("\n");
        Serial.println();
     }   
        delay(20);     // time between redraws
    }
    
    void nunchuckInit() 
    {
        Wire.begin();                  //  join I2C bus as master
        Wire.beginTransmission(0x52);  //  transmit to device 0x52
        Wire.write((byte)0xF0);        //  send memory adress
        Wire.write((byte)0x55);        //  send a zero
        if (Wire.endTransmission() == 0)  {   
             Wire.beginTransmission(0x52);  //  transmit to device 0x52
             Wire.write((byte)0xA5);        //  send memory adress
             Wire.write((byte)0x00);
        }     //  stop transmission
    }
    
    
    //  send a request for data to the nunchuck
    static void nunchuckRequest()
    {
        Wire.beginTransmission(0x52);    //  transmit to device 0x52
        Wire.write((byte)0x00);          //  send one byte
        Wire.endTransmission();          //  stop transmission
    }
    
    
    //  receive data back from the nunchuck,
    //  returns true if read successful, else false
    boolean nunchuckRead()
    {
        int cnt=0;
        Wire.requestFrom (0x52, dataLength);    //  request data from nunchuck
        while (Wire.available ())  {
            rawData[cnt] = Wire.read();
            cnt++;
        }
        nunchuckRequest();      //  send request for next dat payload
        if (cnt >= dataLength)
            return true;        //  success if all 6 bytes received
        else
            return false;       //  failure
    }
    
    
    //  encode data to format that most wiimote drivers accept
    // static char nunchuckDecode (byte x)  {
        // return (x ^ 0x17) + 0x17;
    //    return x;
    // }
    
    
    int getValue(int item)   {
        if (item <= accelZ)
            return (int)rawData[item];
        else if (item == btnZ)
            return bitRead(rawData[5], 0) ? 0: 100;
        else if (item == btnC)
            return bitRead(rawData[5], 1) ? 0: 100;
    }

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Achso, sorry, das war der Code von Klebwax

  10. #20
    HaWe
    Gast
    der Code oben von mir läuft ja nachweislich mit meinem AVR, nur nicht mit meinen ARMs M3/M4.

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte

Ähnliche Themen

  1. Wii Nunchuck I2C an Raspberry Pi
    Von wassy92x im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 27.01.2015, 15:24
  2. Nunchuck auslesen
    Von Snaper im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 28.02.2012, 09:45
  3. Wii Motion Plus - Nunchuck Passthrough Mode
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 19.10.2011, 19:36
  4. Nunchuck mit Gyroskopen
    Von RobertM im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 1
    Letzter Beitrag: 21.12.2008, 16:40
  5. Nunchuck über i2c Ausleseprobleme (wohl Nunchukseitig)
    Von ustech im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 05.10.2008, 23:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen