Go Down

Topic: Problem mit dem Gyrosensor (Read 520 times) previous topic - next topic

flyfly

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
Code: [Select]


#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

Doc_Arduino

#1
Jun 19, 2018, 11:31 am Last Edit: Jun 19, 2018, 11:32 am by Doc_Arduino
Hallo,

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

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

michael_x

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

flyfly

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

Gruß
flyfly

michael_x

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?

flyfly

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

Serenifly

#6
Jun 21, 2018, 03:44 pm Last Edit: Jun 21, 2018, 04:11 pm by Serenifly
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).

postmaster-ino

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

flyfly

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?

Serenifly

#9
Jun 22, 2018, 09:53 pm Last Edit: Jun 22, 2018, 09:56 pm by Serenifly
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:
Code: [Select]

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

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

postmaster-ino

#10
Jun 22, 2018, 10:05 pm Last Edit: Jun 22, 2018, 10:57 pm by postmaster-ino
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 ... :)
*/Edit*

MfG

Serenifly

#11
Jun 22, 2018, 10:24 pm Last Edit: Jun 22, 2018, 10:26 pm by Serenifly
Vll. eine Verwechslung mit struct?
Nein. Das hätte schon gepasst:
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_009.htm


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:
https://github.com/nRF24/RF24
Gibt vielleicht noch andere

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

Go Up