- Labornetzteil AliExpress         
Ergebnis 1 bis 9 von 9

Thema: Due Probleme mit I2C und GY-50

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    40
    Beiträge
    647
    Hi,

    also ich habe alle int in int16_t geändert.
    Serial.println(sizeof(int)); gibt "4" aus -> 4byte pro int richtig? Also war das mit int16_t schonmal nicht verkehrt.

    Mein Code sieht jetzt so aus:
    Code:
    #include <Wire.h>
    //Arduino 1.0+ only
    
    #define CTRL_REG1 0x20
    #define CTRL_REG2 0x21
    #define CTRL_REG3 0x22
    #define CTRL_REG4 0x23
    #define CTRL_REG5 0x24
    int16_t L3G4200D_Address = 0x69; //I2C address of the L3G4200D
    int16_t x;
    int16_t y;
    int16_t z;
    void setup() {
     
      Wire1.begin();
      Serial.begin(9600);
      Serial.println("starting up L3G4200D");
      setupL3G4200D(2000); // Configure L3G4200- 250, 500 or 2000 deg/sec
      Serial.println(sizeof(int));
      
      delay(1500); //wait for the sensor to be ready
    }
    void loop() {
      getGyroValues();// This will update x, y, and z with new values
      Serial.print("X:");
      Serial.print(x);
      Serial.print(" Y:");
      Serial.print(y);
      Serial.print(" Z:");
      Serial.println(z);
      delay(100); //Just here to slow down the serial to make it more readable
    }
    void getGyroValues() {
      byte xMSB = readRegister(L3G4200D_Address, 0x29);
      byte xLSB = readRegister(L3G4200D_Address, 0x28);
      x = ((xMSB << 8) | xLSB);
      byte yMSB = readRegister(L3G4200D_Address, 0x2B);
      byte yLSB = readRegister(L3G4200D_Address, 0x2A);
      y = ((yMSB << 8) | yLSB);
      byte zMSB = readRegister(L3G4200D_Address, 0x2D);
      byte zLSB = readRegister(L3G4200D_Address, 0x2C);
      z = ((zMSB << 8) | zLSB);
    }
    int16_t setupL3G4200D(int16_t scale) {
      //FromJim Lindblom of Sparkfun's code
      // Enable x, y, z and turn off power down:
      writeRegister(L3G4200D_Address, CTRL_REG1, 0b00001111);
      // If you'd like to adjust/use the HPF, you can edit the line below to configure CTRL_REG2:
      writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000);
      // Configure CTRL_REG3 to generate data ready interrupt on INT2
      // No interrupts used on INT1, if you'd like to configure INT1
      // or INT2 otherwise, consult the datasheet:
      writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000);
      // CTRL_REG4 controls the full-scale range, among other things:
      if (scale == 250) {
        writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000);
      } else if (scale == 500) {
        writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000);
      } else {
        writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000);
      }
      // CTRL_REG5 controls high-pass filtering of outputs, use it
      // if you'd like:
      writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000);
    }
    void writeRegister(int16_t deviceAddress, byte address, byte val) {
      Wire1.beginTransmission(deviceAddress); // start transmission to device
      Wire1.write(address);// send register address
      Wire1.write(val);// send value to write
      Wire1.endTransmission();// end transmission
    }
    int16_t readRegister(int16_t deviceAddress, byte address) {
      int16_t v;
      Wire1.beginTransmission(deviceAddress);
      Wire1.write(address); // register to read
      Wire1.endTransmission();
      Wire1.requestFrom(deviceAddress, 1); // read a byte
      while (!Wire1.available()) {
        // waiting
      }
      v = Wire1.read();
      return v;
    }
    Die Ausgabe von diesem Code:
    starting up L3G4200D
    4
    X:3 Y:-12 Z:-1
    X:-1 Y:-11 Z:1
    X:2 Y:-14 Z:-1
    X:1 Y:-13 Z:-3
    X:-1 Y:-11 Z:0
    X:2 Y:-14 Z:255
    X:-2 Y:-12 Z:-4
    X:2 Y:-12 Z:-5
    X:2 Y:-12 Z:-4
    X:-3 Y:-8 Z:0
    Die Werte zappeln immernoch liegen aber jetzt schon besser und reagieren tendenziell korrekt auf Beschleunigung um die jeweilige Achse. Ab und zu haben sie aber doch starke ausreisser ("Z:255").

    Das ganze hängt im Moment am SCL1/SDA1 ohne externe Pullups. Sobald ich Pullups verwende (2,2kOhm und 10kOhm getestet) funktioniert die I2C Kommunikation gar nicht mehr. Egal ob am SCL0/SDA0 oder SCL1/SDA1. Versorgungsspannung ist 3,3V (an VCC am Sensor angeschlossen).
    Schließe ich den Sensor an den Nano an (ohne externe Pullups), ist alles bestens.

    Muss ich die Pins noch irgendwie konfigurieren? Wie schalte ich die internen Pullups ab? Geht das überhaupt?

    Danke.

    EDIT: Oh man... Mir ist gerade aufgefallen, das in der Software vom Nano steht das alle Werte durch 10 geteilt werden. Kein Wunder das die da viel ruhiger sind. Ich habe also nur noch ein einziges Problem, die ausreisser auf 255.
    Geändert von DanielSan (07.03.2017 um 18:55 Uhr)
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  2. #2
    HaWe
    Gast
    jaja, die Arduino-APi...
    vor lauter Schiss vor fehlender backwards- Konpatibilität schrecken die davor zurück, endlich mal die ganzen APIs, libs und cores auf vernünftige und sichere Füße zu stellen bezüglich neuer stdint Datentypen (und auch bezüglich thread-safety)
    Da ist extrem viel verkorkst.

    zu den Pullups:
    nein, wenn das jetzt soweit beim Due funktioniert, brauchst du keine zusätzlichen Pullups. Die eingebauten lassen sich aber auch nicht abschalten beim Due.
    Eher wundert es mich, dass das überhaupt auf dem Nano ohne Pullups funktioniert...

    Das mit den 255 scheint für mich ein Byte-Überlauf-Fehler zu sein.
    Entweder, quick-and-dirty: mach ne if- Scheife dazwischen, und wenn da 255 steht, setz es auf null.

    Eher scheint aber ein lib-Fehler dahinter zu stecken, mich erschreckt auch etwas dein Start-Kommentar

    //Arduino 1.0+ only

    das klingt nach nem ziemlich alten IDE/API-Bug. Inzwischen haben wir ja 1.8.2 mit etlichen neuen AVR- und ARM-cores.
    Ich kann mich erinnern, da gab es mal was mit dem Null-Byte in irgend einer seriellen bzw. TWI-Lib.

    Mit welcher IDE arbeitest du?
    Im Zweifel würde ich nach neuen Libs suchen und mit wenigstens halbwegs aktuellen IDEs arbeiten (1.5.x oder 1.6.x aufwärts)


    PS,
    nur zur Warnung:
    ist zwar hier nicht mit dabei, aber denk dran:
    Bei AVR ist char immer signed char,
    beim ARM (Due, Zero) wird char vom Compiler aber als unsigned char übersetzt.
    Das liegt an den cores und lässt sich auch nicht ändern.
    Also immer explizit signed oder unsigned vor die chars schreiben, wenn du sowohl mit AVRs als auch mit ARMs rumwerkelst.
    ich persönlich würde auch "byte" immer durch "uint8_t" ersetzen, das ist krisenfester.

    Außer bei chars, die für die Serial-Class verwendet werden:
    Hier darf immer nur char stehen, wenn Buchstaben gemeint sind, niemals signed oder unsigned davor, oder gar int8_t oder uint8_t.
    Dass liegt wieder an den verkorksten und veralteten und inkompatiblen überladenen Serial-Methoden.
    Grausam, aber so ist das eben bei Arduino.
    Aber die Entwickler sind zu blöd, das zu kapieren, und ändern nichts.
    Geändert von HaWe (07.03.2017 um 19:55 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von DanielSan Beitrag anzeigen
    ... Ich habe also nur noch ein einziges Problem, die ausreisser auf 255.
    Dezimal 255 sind binär 0b11111111, also alles 1. Der Zustand des I2C Busses, wenn niemand ihn treibt, ist durch die Pullups ebenfalls 1. Die 255 könnte also bedeuten, daß der Slave garnicht antwortet.

    Ob der Slave sich angesprochen fühlt, erkennt man am ACK, daß der Slave beim Senden der Adresse liefern muß. Was kommt da bei dir, wenn du einen Ausreißer hast?

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Atmega32u4 Timer 3 Probleme; PWM Probleme
    Von Mons im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 01.03.2014, 10:47
  2. i2c Probleme;
    Von Chattychan im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 10.08.2012, 08:17
  3. ACS Probleme
    Von Fabian E. im Forum Robby RP6
    Antworten: 8
    Letzter Beitrag: 22.12.2010, 14:55
  4. Probleme mit RP6
    Von Stinker196 im Forum Robby RP6
    Antworten: 6
    Letzter Beitrag: 09.08.2008, 09:12
  5. Probleme mit Op-Amp
    Von Xtreme im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 30.07.2007, 17:03

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress