Adafruit mma8451 mit Arduino DUE

Hallo Zusammen,

ich habe den Beschleunigungssensor MMA8451 auf dem Breakout Board von Adafruit auf mit einem Arduino nano erfolgreich eingesetzt.

Da ich eine sehr speicherintensiven Anwendungsfall habe wollte ich nun auf ein Arduino DUE umsteigen.

Der größte Teil läuft ganz einwandfrei aber der Sensor gibt sinnlose Werte zurück.

In den Screenshots habe ich die Ausgabe die der Beispielcode erzeugt abgebildet.

/**************************************************************************/
/*!
    @file     Adafruit_MMA8451.h
    @author   K. Townsend (Adafruit Industries)
    @license  BSD (see license.txt)

    This is an example for the Adafruit MMA8451 Accel breakout board
    ----> https://www.adafruit.com/products/2019

    Adafruit invests time and resources providing this open source code,
    please support Adafruit and open-source hardware by purchasing
    products from Adafruit!

    @section  HISTORY

    v1.0  - First release
*/
/**************************************************************************/

#include <Wire.h>
#include <Adafruit_MMA8451.h>
#include <Adafruit_Sensor.h>

Adafruit_MMA8451 mma = Adafruit_MMA8451();

void setup(void) {
  Serial.begin(9600);
  
  Serial.println("Adafruit MMA8451 test!");
  

  if (! mma.begin()) {
    Serial.println("Couldnt start");
    while (1);
  }
  Serial.println("MMA8451 found!");
  
  mma.setRange(MMA8451_RANGE_2_G);
  
  Serial.print("Range = "); Serial.print(2 << mma.getRange());  
  Serial.println("G");
  
}

void loop() {
  // Read the 'raw' data in 14-bit counts
  mma.read();
  Serial.print("X:\t"); Serial.print(mma.x); 
  Serial.print("\tY:\t"); Serial.print(mma.y); 
  Serial.print("\tZ:\t"); Serial.print(mma.z); 
  Serial.println();

  /* Get a new sensor event */ 
  sensors_event_t event; 
  mma.getEvent(&event);

  /* Display the results (acceleration is measured in m/s^2) */
  Serial.print("X: \t"); Serial.print(event.acceleration.x); Serial.print("\t");
  Serial.print("Y: \t"); Serial.print(event.acceleration.y); Serial.print("\t");
  Serial.print("Z: \t"); Serial.print(event.acceleration.z); Serial.print("\t");
  Serial.println("m/s^2 ");
  
  /* Get the orientation of the sensor */
  uint8_t o = mma.getOrientation();
  
  switch (o) {
    case MMA8451_PL_PUF: 
      Serial.println("Portrait Up Front");
      break;
    case MMA8451_PL_PUB: 
      Serial.println("Portrait Up Back");
      break;    
    case MMA8451_PL_PDF: 
      Serial.println("Portrait Down Front");
      break;
    case MMA8451_PL_PDB: 
      Serial.println("Portrait Down Back");
      break;
    case MMA8451_PL_LRF: 
      Serial.println("Landscape Right Front");
      break;
    case MMA8451_PL_LRB: 
      Serial.println("Landscape Right Back");
      break;
    case MMA8451_PL_LLF: 
      Serial.println("Landscape Left Front");
      break;
    case MMA8451_PL_LLB: 
      Serial.println("Landscape Left Back");
      break;
    }
  Serial.println();
  delay(500);
  
}

Mit meinen bescheidenen Kenntnissen komme ich zu dem Schluss, dass das Problem irgendwie aus der unterschiedlichen Architektur der beiden µC resultiert.

Wie ich das Problem lösen kann ist mir aber auch nach vielen Stunden die ich mit dem Problem verbracht habe völlig unklar.

Ich bin danhbar für jede Hilfe!
Vielen Dank,
Grüße
Dominik

Der Due ist ein 32-Bit-Prozessor. Da ist der Datentyp int nicht 16, sondern 32 Bit breit.

Ich habe mir die Libs nicht angeschaut, aber wenn da irgendwo int steht, dann solltest Du das durch int16_t ersetzen.

So als erster Gedanke.

Gruß Tommy

Ich wette, dass die MMA8451 bei SDA und SCL bereits Klimmzüge hat. Das Problem ist, dass SDA / SCL auf dem DUE auch bereits Klimmzüge hat. Daher müssen Sie eine Verbindung zu SDA1 / SCL1 herstellen, die nicht über Folgendes verfügt:

#include <Wire.h>
#define Wire Wire1

Hallo Tommy,

danke für den Tip. Genau sowas hab ich mir gedacht.

int taucht allerdings nie auf, nur int8_t; uint8_t; uint32 usw...

hast Du noch eine Idee?

Gruß
Dominik