Problem mit dem Gyrosensor

Hallo,

ich versuche gerade Daten aus dem gyrosensor von einem arduino zu einem anderem zu übertragen. Dabei merkte ich, dass sobald ich

radio.write(data,sizeof(data)); einfüge, die Werte 0 sind.

Das ist der Sketch

#include <SPI.h>
#include "RF24.h"
#include "I2Cdev.h"    
#include "MPU6050.h"
#include "Wire.h"

MPU6050 gyro;          
int16_t ax, ay, az;
int16_t gx, gy, gz;

int paket[2];
RF24 radio(7,8);
const byte kanal[6] = "12345";


void setup() {

  Wire.begin();
  
  radio.begin();
  radio.openWritingPipe(kanal);
  radio.setPALevel(RF24_PA_MAX);
  radio.setDataRate(RF24_250KBPS);
  radio.stopListening();

  Serial.begin(115200);    

  gyro.initialize();

}

void loop() {

 gyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

paket[0]=map(ax,-16000,16000,-255,255);
paket[1]=map(ay,-16000,16000,-255,255);
Serial.println(paket[0]);

radio.write(paket,sizeof(paket));

}

Liebe Grüße
flyfly

Hallo,

du hast kein Array namens data deklariert/initialisiert. Demzufolge provoziert die Zeile einen Kompilerfehler und keine 0 Ausgabe.

Ich rate mal, es ist paket
statt data gemeint.
Da ist dann der Datentyp int [] das Problem.

ja paket ist statt data gemeint.
Wie kann ich das Problem beheben?

Gruß
flyfly

Das hängt davon ab, was du wirklich willst.
Warum machst du paket[0]=map(ax,-16000,16000,-255,255); ?

Auf einem 8 bit avr ist int paket[2]; 4 bytes groß. Erwartest du solche Werte?

Also ich will die Daten auf einen anderen Arduino schicken

Die Daten sind von einem Gyrosensor und die verkleinere ich auf -255 bis 255, da des nachher die geschwindigkeit eines Motors reguliert.

Was soll ich wegen des Problem an meinem Sketch ändern?

Gruß flyfly

Wenn du mal in die Bibliothek schaust wirst du wahrscheinlich sehen dass da Bytes versendet werden und die write() Methode einen Zeiger auf Byte als Parameter hat. sizeof() liefert dir auch die Größe in Bytes. Nicht die Anzahl der Elemente.
Also muss man ein Array auf byte* casten. Das geht mit Array Variablen direkt, da diese bei sowas in Zeiger auf das erste Element zerfallen (in diesem Fall int*)

Eine Alternative für sowas ist eine Union aus dem Daten-Array und einem Array aus Bytes der gleichen Größe (Größe! Nicht Länge).

Hi

Wenn Du vorhast, aufgrund der Winkellage einen Motor unterschiedlich schnell irgendwo hin fahren zu lassen, damit das ganze Konstrukt aufrecht stehen bleibt - prophezeie ich, daß Das nicht laufen wird - bzw. Es fällt um und rennt dann in eine Richtung weg, da bei Maximal-Ausschlag des Sensor der Motor mit maximaler Kraft in eine Richtung rennt.

MfG

hey, nochmal

habe jetzt das Problem erkannt aber ich verstehe immer noch nicht, wie ich es lösen soll(sorry bin noch Anfänger mit dem Arduino)
wie caste ich ein int auf byte ?
soll ich jetzt statt int paket[2] byte paket[2] schreiben?

und wie schaffe ich es dann beim Empfänger es wieder auf ein int zu bekommen?

Vielen Dank schonmal

PS: was heißt eigentlich avr?

flyfly:
PS: was heißt eigentlich avr?

Das setzt wahrscheinlich aus den Namen der Erfinder zusammen. "Alf and Vegard's RISC processor". Offiziell bedeutet es nichts spezielles

EDIT:
Ich habe mal die Bibliothek angeschaut und es muss wohl nicht ein Byte Array sein. Viele Übertragungsbibliotheken funktionieren so, aber hier verwendet man mal void Zeiger als Parameter:

bool write( const void* buf, uint8_t len );

Man kann also übergeben was man will und es wird automatisch als Byte Stream behandelt

Hi

Belegen dann die Beiden den GLEICHEN, oder den SELBEN Speicher?

Wenn 'Gleichen': (also 2x die gleiche Anzahl an Bytes im Speicher)
Ein 'byte' aus einem 'int' zu lesen ... jo ... man nehme das untere Byte.
Dafür muß ich den Kram nicht 2x im Speicher vorhalten.
Bei einem Int aus einem Byte wird das MSB einfach auf Null belassen - viel Mehr als 255 kann so ein Byte nicht annehmen und somit werden die oberen Bit des Int wohl nicht belegt.
Edit
Durch union kann auf den SELBEN Speicherplatz mit verschiedenen 'Namen'/Datentypen zugegriffen werden.
Der im Folgepost gezeigte Link liest sich super!!
/Edit

Davon ab - ich hätte Das jetzt irgendwie eher so interpretiert, daß ich mittels
data.asInt[0] in das Array 'asInt' reinschaue und bei data.asByte[0] in Das 'abByte' - und nicht erwartet, daß in Beiden der gleiche Grundwert enthalten ist, wenn ich Einen von Beiden selber setze.

Vll. eine Verwechslung mit struct?
Edit
... zumindest von mir - wieder was gelernt!
Hochsprachen haben ->doch<- was ... :slight_smile:
/Edit

MfG

postmaster-ino:
Vll. eine Verwechslung mit struct?

Nein. Das hätte schon gepasst:

Ich habe es aber wieder entfernt weil ich inzwischen mal in die Bibliothek geschaut habe. Das ist eine der seltenen Bibliotheken dieser Art die nicht auf Byte Arrays festgelegt ist. Jedenfalls diese hier:

Gibt vielleicht noch andere

Dann sollte es aber funktionieren wenn man einfach das int Array übergibt