Wert an eigene Funktion übergeben

Hallo Leute,
ich versuche seit einiger Zeit den Wert von euler[2] an meine eigene Funktion zu übergeben(Gleichgewicht).
Leider klappt es bei mir nicht, komme leider nicht vorran, da ich nicht weiß nach was ich googeln soll.
Vielleicht kann mir jemand hier eine kleine Starthilfe geben?
LG

void loop() {
    // if programming failed, don't try to do anything
    if (!dmpReady) return;


    // reset interrupt flag and get INT_STATUS byte
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    // get current FIFO count
    fifoCount = mpu.getFIFOCount();

    // check for overflow (this should never happen unless our code is too inefficient)
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F("FIFO overflow!"));

    // otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & 0x02) {
        // wait for correct available data length, should be a VERY short wait
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

        #ifdef OUTPUT_READABLE_EULER
            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetEuler(euler, &q);
            Serial.print("euler\t");
            Serial.print(euler[0] * 180/M_PI);
            Serial.print("\t");
            Serial.print(euler[1] * 180/M_PI);
            Serial.print("\t");
            Serial.println(euler[2] * 180/M_PI);
        #endif

        // blink LED to indicate activity
        blinkState = !blinkState;
        digitalWrite(LED_PIN, blinkState);
    }

    
}



        void Gleichgewicht(){
 
          float ->euler[2]
          
          Serial.println(WinkelA);

Was soll den euler[2] sein, was an die Funktion übergeben werden soll? Ein Array aus 2 Werten, der 2. Wert eines Array?

Ansonsten zu Funktionen.

Gruß Tommy

Tommy56:
Was soll den euler[2] sein, was an die Funktion übergeben werden soll? Ein Array aus 2 Werten, der 2. Wert eines Array?

Ansonsten zu Funktionen.

Gruß Tommy

Es soll das 2. Array übergeben werden.
Danke :slight_smile:

Dann wäre es sinnvoll, den kompletten Sketch rein zu stellen, damit man weiß, wie das deklariert ist.

Gruß Tommy

Tommy56:
Dann wäre es sinnvoll, den kompletten Sketch rein zu stellen, damit man weiß, wie das deklariert ist.

Gruß Tommy

Danke dass du dir das zu herzen nimmst.

Es ist ein Sketch für den IMU 6050 Sensor.
Ich möchte lediglich den deinen Winkel als Wert gespeichert haben, damit ich mit Ihm in meiner eigenen Funktion arbeiten kann.

Hier der Code

#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // not necessary if using MotionApps include file

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for SparkFun breakout and InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 mpu;
//MPU6050 mpu(0x69); // <-- use for AD0 high



// uncomment "OUTPUT_READABLE_EULER" if you want to see Euler angles
// (in degrees) calculated from the quaternions coming from the FIFO.
// Note that Euler angles suffer from gimbal lock (for more info, see
// http://en.wikipedia.org/wiki/Gimbal_lock)
#define OUTPUT_READABLE_EULER

#define INTERRUPT_PIN 2  // use pin 2 on Arduino Uno & most boards
#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

// packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '

, 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, ‘\r’, ‘\n’ };

// ================================================================
// ===              INTERRUPT DETECTION ROUTINE                ===
// ================================================================

volatile bool mpuInterrupt = false;    // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
    mpuInterrupt = true;
}

// ================================================================
// ===                      INITIAL SETUP                      ===
// ================================================================

void setup() {
    // join I2C bus (I2Cdev library doesn’t do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

Serial.begin(19200);
    while (!Serial); // wait for Leonardo enumeration, others continue immediately

// initialize device
    Serial.println(F(“Initializing I2C devices…”));
    mpu.initialize();
    pinMode(INTERRUPT_PIN, INPUT);

// verify connection
    Serial.println(F(“Testing device connections…”));
    Serial.println(mpu.testConnection() ? F(“MPU6050 connection successful”) : F(“MPU6050 connection failed”));

// wait for ready
    Serial.println(F("\nSend any character to begin DMP programming and demo: "));
    while (Serial.available() && Serial.read()); // empty buffer
    while (!Serial.available());                // wait for data
    while (Serial.available() && Serial.read()); // empty buffer again

// load and configure the DMP
    Serial.println(F(“Initializing DMP…”));
    devStatus = mpu.dmpInitialize();

// supply your own gyro offsets here, scaled for min sensitivity
    mpu.setXGyroOffset(220);
    mpu.setYGyroOffset(76);
    mpu.setZGyroOffset(-85);
    mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

// make sure it worked (returns 0 if so)
    if (devStatus == 0) {
        // turn on the DMP, now that it’s ready
        Serial.println(F(“Enabling DMP…”));
        mpu.setDMPEnabled(true);

// enable Arduino interrupt detection
        Serial.println(F(“Enabling interrupt detection (Arduino external interrupt 0)…”));
        attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();

// set our DMP Ready flag so the main loop() function knows it’s okay to use it
        Serial.println(F(“DMP ready! Waiting for first interrupt…”));
        dmpReady = true;

// get expected DMP packet size for later comparison
        packetSize = mpu.dmpGetFIFOPacketSize();
    } else {
        // ERROR!
        // 1 = initial memory load failed
        // 2 = DMP configuration updates failed
        // (if it’s going to break, usually the code will be 1)
        Serial.print(F(“DMP Initialization failed (code “));
        Serial.print(devStatus);
        Serial.println(F(”)”));
    }

// configure LED for output
    pinMode(LED_PIN, OUTPUT);
}

// ================================================================
// ===                    MAIN PROGRAM LOOP                    ===
// ================================================================

void loop() {
    // if programming failed, don’t try to do anything
    if (!dmpReady) return;

// reset interrupt flag and get INT_STATUS byte
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

// get current FIFO count
    fifoCount = mpu.getFIFOCount();

// check for overflow (this should never happen unless our code is too inefficient)
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F(“FIFO overflow!”));

// otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & 0x02) {
        // wait for correct available data length, should be a VERY short wait
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

// read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
       
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

#ifdef OUTPUT_READABLE_EULER
            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetEuler(euler, &q);
            Serial.print(“euler\t”);
            Serial.print(euler[0] * 180/M_PI);
            Serial.print("\t");
            Serial.print(euler[1] * 180/M_PI);
            Serial.print("\t");
            Serial.println(euler[2] * 180/M_PI);
        #endif

// blink LED to indicate activity
        blinkState = !blinkState;
        digitalWrite(LED_PIN, blinkState);
    }

}

void Gleichgewicht(){

flot ->euler[2]
         
          Serial.println(WinkelA);
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
          }

Da das Array global ist, kannst Du einfach schreiben:

void Gleichgewicht() {
   Serial.print(euler[2]);
   // oder was Du sonst machen willst
}

// Aufruf:
Gleichgewicht();

// Mit übergabe wäre es

void Gleichgewicht(float zahl) {
   Serial.print(zahl);
   // oder was Du sonst machen willst
}

//Aufruf:
Gleichgewicht(euler[2]);

Gruß Tommy

Gruß Tommy

Das funktioniert ganz gut.

Nur wie kann ich jetzt z.b

void Gleichgewicht() {

  euler[2] = float Winkel_Neu

}

-> Error: expected primary-expression before 'float'
definieren und dann mit Winkel_Neu weiterrechnen?

Tommy56:
Da das Array global ist, kannst Du einfach schreiben:

void Gleichgewicht() {

Serial.print(euler[2]);
  // oder was Du sonst machen willst
}

// Aufruf:
Gleichgewicht();

// Mit übergabe wäre es

void Gleichgewicht(float zahl) {
  Serial.print(zahl);
  // oder was Du sonst machen willst
}

//Aufruf:
Gleichgewicht(euler[2]);




Gruß Tommy

Gruß Tommy

Noss__:

void Gleichgewicht() {

euler[2] = float Winkel_Neu
}



-> Error: expected primary-expression before 'float'

Wenn Du Winkel_neu in ein float umwandeln möchtest, musst Du entweder

...= (float)Winkel_Neu;

oder

...= float(Winkel_Neu);

schreiben.*

Dann wird Winkel_Neu nur für diesen Ausdruck in ein float umgewandelt. Mit Winkel_Neu kannst Du anschließend weiterrechnen wie gewohnt.

Gruß

Gregor

  • PS: ... was aber eigentlich egal ist, denn wenn das euler-Array vom Typ int ist, wird Winkel_Neu halt in ein int umgewandelt und wenn es vom Typ float ist, ist eine Umwandlung überflüssig.

euler[2] = Winkel_Neu; // aber nur bei der Gleichgewicht()-Variante.

Du solltest Dir mal ein C-Grundlagenbuch unters Kopfkissen legen :wink:

Gruß Tommy

Edit: Dazu muss Winkel_Neu als float global deklariert sein.
Ich sehe ihn in Deinem Sketch aber nicht.

gregorss:
Wenn Du Winkel_neu in ein float umwandeln möchtest, musst Du entweder

...= (float)Winkel_Neu;

oder

...= float(Winkel_Neu);

schreiben.*

Dann wird Winkel_Neu nur für diesen Ausdruck in ein float umgewandelt. Mit Winkel_Neu kannst Du anschließend weiterrechnen wie gewohnt.

Gruß

Gregor

  • PS: ... was aber eigentlich egal ist, denn wenn das euler-Array vom Typ int ist, wird Winkel_Neu halt in ein int umgewandelt und wenn es vom Typ float ist, ist eine Umwandlung überflüssig.

Hey Gregor,
ersteinmal Danke für deine Antwort!

Leider bekomme ich als Wert für "Winkel_Neu" 0 heraus, d.h er übernimmt den Wert von euler[2] nicht.

void Gleichgewicht() {

float Winkel_Neu;
  euler[2] = float (Winkel_Neu);
  Serial.println(Winkel_Neu, DEC);
}
float Winkel_Neu;

Was soll das? Du deklarierst einfach eine lokale Variable in der dann ein willkürlicher Wert steht

Noss__:
Leider bekomme ich als Wert für "Winkel_Neu" 0 heraus, d.h er übernimmt den Wert von euler[2] nicht.

Das ist im bisherigen Zusammenhang eine Aussage ohne Sinngehalt.

Vermutlich hat Tommy recht und Du solltest Dir ein paar C/C++-Grundlagen reinziehen. Ich habe dieses Buch im Regal stehen und kann es empfehlen. Der Stil kommt mir sehr entgegen. Probleme hatte ich nur mit Kapitel 2, das war für mich ein- oder zweimal zu lang. Das schreibt der Autor aber auch.

Gruß

Gregor

Hmm, ja.
Ich hatte gehoft nicht so weit in die Marterie hineingehen zu müssen.
Ich glaube aber auch, dass wir uns missverstehen.

der Wert in euler wird ständig aktuallisiert, muss für mein vorhaben den alten Wert durch den vorrangegangenen dividieren.

Trotzdem danke an euch :slight_smile:

Das widerspricht aber allem, was Du bisher geschrieben hast.

Du solltest also auch üben, Deine Ziele zu formulieren.

Vorschlag: Schreib mal auf (auf Papier), was Du eigentlich tun willst, lerne ein paar Grundlagen und dann melde Dich wieder.

Gruß Tommy

Noss__:
Ich hatte gehoft nicht so weit in die Marterie hineingehen zu müssen.

Hmpf ... ja ... der Mist ist, dass Du darum wohl nicht herum kommst.

Am Ende hast Du nur drei Möglichkeiten:

  • Du lässt das, was Du haben möchtest, von jemandem bauen. Das kostet nicht selten Geld (und zwar nicht zu knapp)
  • Du verzichtest auf das, was Du haben möchtest
  • Du lernst zumindest so viel C/C++, dass Du das, was Du möchtest, selbst erledigen kannst

Eine vierte Möglichkeit fällt mir gerade nicht ein. Und etwas wie „das Universum ist morgen zuende“ gilt nicht :slight_smile: Ich wäre auch ziemlich dagegen.

Die dritte Möglichkeit ist IMO die schönste, unter Anderem weil Du hier viel Hilfe bekommen würdest.

Gruß

Gregor

PS: Wenn Du formulieren möchtest, was Ziel Deines Programms sein und wie es erreicht werden soll, kannst Du z. B. einen Programmablaufplan zeichnen. Mir hilft das immer wieder.

gregorss:
Hmpf ... ja ... der Mist ist, dass Du darum wohl nicht herum kommst.

Am Ende hast Du nur drei Möglichkeiten:

  • Du lässt das, was Du haben möchtest, von jemandem bauen. Das kostet nicht selten Geld (und zwar nicht zu knapp)
  • Du verzichtest auf das, was Du haben möchtest
  • Du lernst zumindest so viel C/C++, dass Du das, was Du möchtest, selbst erledigen kannst

Eine vierte Möglichkeit fällt mir gerade nicht ein. Und etwas wie „das Universum ist morgen zuende“ gilt nicht :slight_smile: Ich wäre auch ziemlich dagegen.

Die dritte Möglichkeit ist IMO die schönste, unter Anderem weil Du hier viel Hilfe bekommen würdest.

Gruß

Gregor

PS: Wenn Du formulieren möchtest, was Ziel Deines Programms sein und wie es erreicht werden soll, kannst Du z. B. einen Programmablaufplan zeichnen. Mir hilft das immer wieder.

Ja, in meinen Augen ist die 3. ebenfalls die beste.
Leider habe ich die nächsten Jahre wohl nicht genug Zeit um das vernünftig zu lernen ..
(Studium angefangen, 3. Versuch nicht bestanden)
Jetzt Ausbildung angefangen und Studium als Verbund ...
Naja, ich werde das ganze wohl doch aufgeben müssen :smiley:
Trotzdem danke an alle!
Tolles Forum!