INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wire.h und SD.h nicht kompatibel?
11.11.2015, 15:48
Beitrag #1
Wire.h und SD.h nicht kompatibel?
Hey Leute, ich hab mal eine Frage zu meinem Projekt. Bitte macht mich nicht fertig, ich ein absoluter Noob Big Grin. Im Internet hab ich nicht so wirklich was dazu gefunden.
Ich hab ein Programm mit den Standard-Libarys SD.h und Wire.h. Nun möchte ich erst Daten aus meinem MPU6050 auslesen (mit der Wire lib) und diese dann auf einer SD-Karte speichern (mit der SD lib und SPI lib). Jedoch schreibt das Programm, sobald die Wire lib (Wire.begin) gestartet ist keine Daten mehr auf die Karte... Ich hab auch gelesen, dass beide Libs den gleichen Port benutzen. Liegt das daran?
Hab einen rfDuino mit nem MPU6050 und das SD-Karten-Shield.
Habt ihr eine Lösung? Gibts vielleicht sowas wie einen wire.end Befehl oder so?

Hoffe ihr habt da eine Idee Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.11.2015, 16:26
Beitrag #2
RE: Wire.h und SD.h nicht kompatibel?
Ich vermute einen Fehler in deinem Programm.
Die beiden Libraries verwenden, sowie mir bekannt ist, nicht die selben Ports.

Kannst du mal deinen Sketch posten, der das Problem verursacht.
Welche Wire-Befehle es gibt, kannst du in der Lib ansehen, öffne diese in einem Editor.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2015, 17:10
Beitrag #3
RE: Wire.h und SD.h nicht kompatibel?
Das ganze Berechnen dürfte ja nicht entscheidend sein, ich habs aber mti drin gelassen. Die SD-Karte wird einmal im setup und einmal im loop geöffnet, die wire nur im setup:

#include "MPU6050.h"
#include "Wire.h"
#include <SPI.h>
#include <SD.h>

MPU6050 accelgyro;

//Variablen für Winkelgeschwindigkeiten und Beschleunigungen
int16_t ax, ay, az;
int16_t gx, gy, gz;


//Variablen für Winkelgeschwindigkeiten (deg/s^2)
float gx_deg, gy_deg, gz_deg;
//Variablen für Winkelgeschwindigkiten (Rad)
float gx_rad, gy_rad, gz_rad;
//Variablen für Offset
float gx_null, gy_null, gz_null;
//Winkel aus Beschleunigungswerten
float alpha_a, betha_a, theta_a;
//Winkel aus Complementary Filter
float alpha, betha, theta;
//Winkel in Grad aus Comp. Filter
float alpha_deg, betha_deg, theta_deg;
// jedes n-te mal Ausgabe
int sekundezaehler;
//Zeitvariablen
float dt;
int millis_alt;
float zeit;
//Variablen für maximalen Einstellungsbereich
float z=1;
float g_max, a_max;


const int chipSelect = 6;


void setup()
{

Serial.begin (9600);

//SD-Karte initialisieren
Serial.print("Initializing SD card...");

if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
// Datei erstellen und Kopfzeile schreiben
File dataFile = SD.open("dataFile.txt", FILE_WRITE);

dataFile.print ( "\t ax \t ay \t az \t alpha \t betha \t theta");
dataFile.println ();

Wire.speed = 400;
Wire.begin();

accelgyro.initialize();

accelgyro.setFullScaleAccelRange (z);
accelgyro.setFullScaleGyroRange(z);

//Offset berechnen
for (int x=0; x<500; x++)
{
accelgyro.getRotation(&gx, &gy, &gz);
accelgyro.getAcceleration(&ax, &ay, &az);

//Offset berechnen
gx_null+=gx;
gy_null+=gy;
gz_null+=gz;
}
gx_null=gx_null/500;
gy_null=gy_null/500;
gz_null=gz_null/500;
//alpha_start=alpha_start/500;

// Maximale Größe von Gyro und Acc Werten zuweisen
if (z==0)
{g_max= 250;
a_max= 2; }
if (z==1)
{g_max= 500;
a_max= 4; }
if (z==2)
{g_max= 1000;
a_max= 8; }
if (z==3)
{g_max= 2000;
a_max= 16;}
}

void loop()
{

//MPU6050 auslesen
accelgyro.getAcceleration(&ax, &ay, &az);
accelgyro.getRotation(&gx, &gy, &gz);

//delta t berechnen
dt=(millis()-millis_alt);
dt=dt/1000;
millis_alt=millis();

zeit+=dt;

//Offset abziehen, Umrechnen (°/s^2)
gx_deg=(gx-gx_null)/32767*g_max;
gy_deg=(gy-gy_null)/32767*g_max;
gz_deg=(gz-gz_null)/32767*g_max;

//Umrechnung von gx/gy/gz_deg in Rad
gx_rad=gx_deg/180*PI;
gy_rad=gy_deg/180*PI;
gz_rad=gz_deg/180*PI;

// Winkel aus Accelerometer (Rad)
alpha_a=atan2 (ay,az); //alpha=roll
betha_a= atan2 (ax,az);// betha=yaw
theta_a=atan2 (ax,ay); //gamma=pitch

// Complementary Filter (Rad)
alpha= 0.9*(alpha+gx_rad*dt)+ 0.1* alpha_a;
theta= 0.9*(theta+gz_rad*dt)+ 0.1* theta_a;

//Errechnung von Betha mit oder ohne Filter (betha_a) je nach Lage
if (theta < -0.3 )
{betha= 0.9*(betha+gy_rad*dt)+0.1*betha_a;}
if (theta > 0.3)
{betha= 0.9*(betha+gy_rad*dt)+0.1*betha_a;}

if (theta > -0.3)
{if (theta < 0.3)
{betha= betha+(gy_rad*dt);}}

//Winkel in Grad
alpha_deg=alpha*180/PI;
betha_deg=betha*180/PI;
theta_deg=theta*180/PI;

//jeden 500. Wert ausgeben
sekundezaehler += 1;
if(sekundezaehler % 5 == 0)
{
Serial.print (zeit);
Serial.print ("\t");
Serial.print (ax);
Serial.print ("\t");
Serial.print (ay);
Serial.print ("\t");
Serial.print (az);
Serial.print ("\t");
Serial.print (alpha);
Serial.print ("\t");
Serial.print (betha);
Serial.print ("\t");
Serial.print (theta);
Serial.print ("\t");
Serial.println (dt,3);

}

// Datei öffnen
File dataFile = SD.open("dataFile.txt", FILE_WRITE);
if (dataFile) {
dataFile.print (dt,3);
dataFile.print ("\t");
dataFile.print (ax);
dataFile.print ("\t");
dataFile.print (ay);
dataFile.print ("\t");
dataFile.print (az);
dataFile.print ("\t");
dataFile.print (alpha);
dataFile.print ("\t");
dataFile.print (betha);
dataFile.print ("\t");
dataFile.println (theta);
dataFile.close();}


}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2015, 17:43
Beitrag #4
RE: Wire.h und SD.h nicht kompatibel?
Was du offensichtlich vergessen hast, ist den CS für die SD-Karte als Ausgang zu deklarieren.

Code:
pinMode(chipSelect, OUTPUT);

Soweit mir das bekannt ist, muss das für den CS gemacht werden.
Einen anderen Fehler kann ich nicht erkennen.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.11.2015, 15:09
Beitrag #5
RE: Wire.h und SD.h nicht kompatibel?
Ich bin mir ja nicht sicher ob das relevant ist, aber du öffnest die Datei mit

Code:
File dataFile = SD.open("dataFile.txt", FILE_WRITE);

zwei mal. Und zwar in der Setup() und noch mal in der Loop(). Ist das so richtig???

Gruß
Torsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.11.2015, 23:50
Beitrag #6
RE: Wire.h und SD.h nicht kompatibel?
Chip Select könnte es sein.

Hier ein Zitat aus einem Beispiel,das bei mir auf einem UNO (SD und wire, beides genutzt) einwandfrei läuft:

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.

So ganz verstehe ich den Satz nicht, ab CS scheint kritisch zu sein.

Gruß GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.11.2015, 18:53 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2015 18:56 von HaWe.)
Beitrag #7
RE: Wire.h und SD.h nicht kompatibel?
du darfst pins 10 bzw. 53 nicht benutzen.
Das Problem ist also nicht, ob: Wire.h und SD.h nicht kompatibel sind,
- das sind sie!

Ob dein Shield mit irgendwas kompatibel ist oder nicht, das ist die Frage.

Ich persönlich würde NIEMALS shilelds für Displays benutzen, sondern grundsätzlich nur selber, isoliert, über SPI anschließen -
genau aus diesem Grund.

Displays und SD Karten laufen (mit den richtigen Libs bei den richtigen Grafik-Chips) einwandfrei gleichzeitig auf den SPI Pins,
und Wire unabhängig davon auch auf den Wire-Pins.

UTFT z.B. läuft nie auf Hardware SPI, ein Grund, UTFT nicht zu verwenden.
Ich empfehle ILI9341 Displays mit Adafruit_9341 oder mit ILI9341_due - libs (IRRE schnell!!).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 16:12 (Dieser Beitrag wurde zuletzt bearbeitet: 18.11.2015 16:26 von hulofu.)
Beitrag #8
RE: Wire.h und SD.h nicht kompatibel?
(12.11.2015 17:43)hotsystems schrieb:  Was du offensichtlich vergessen hast, ist den CS für die SD-Karte als Ausgang zu deklarieren.

Jop stimmt, hab ich geändert. Hat das Problem leider nicht behoben... Trotzdem danke

(13.11.2015 15:09)torsten_156 schrieb:  Ich bin mir ja nicht sicher ob das relevant ist, aber du öffnest die Datei mit

Code:
File dataFile = SD.open("dataFile.txt", FILE_WRITE);

zwei mal. Und zwar in der Setup() und noch mal in der Loop(). Ist das so richtig???

Gruß
Torsten

Habs jetzt so, dass die Datei nach dem Schreiben wieder geschlossen wird... Funktionieren tut es leider trotzdem noch nicht

(14.11.2015 18:53)HaWe schrieb:  du darfst pins 10 bzw. 53 nicht benutzen.
Das Problem ist also nicht, ob: Wire.h und SD.h nicht kompatibel sind,
- das sind sie!

Ob dein Shield mit irgendwas kompatibel ist oder nicht, das ist die Frage.

Ich persönlich würde NIEMALS shilelds für Displays benutzen, sondern grundsätzlich nur selber, isoliert, über SPI anschließen -
genau aus diesem Grund.

Displays und SD Karten laufen (mit den richtigen Libs bei den richtigen Grafik-Chips) einwandfrei gleichzeitig auf den SPI Pins,
und Wire unabhängig davon auch auf den Wire-Pins.

UTFT z.B. läuft nie auf Hardware SPI, ein Grund, UTFT nicht zu verwenden.
Ich empfehle ILI9341 Displays mit Adafruit_9341 oder mit ILI9341_due - libs (IRRE schnell!!).

Ich hab ja gar kein Shield als Display. Die "Serial.print" sollen ja quasi dann alle ersetzt werden, indem ich die Daten auf die SD-Karte schreibe. Bis jetzt habe ich mir die immer über den seriellen Monitor vom PC ausgeben lasssen.
Wenn ich das jetzt richtig kapiert hab, dann funktioniert die Datenübertragung zum SD-Shield also mit SPI. Kann das Problem dann vielleicht irgendwie damit zusammenhängen, dass die I2C Verbindung und die SPI Verbindung am gleichen Pin (6) angeschlossen ist?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino lässt sich nicht installieren bergfrei 4 135 20.11.2016 18:34
Letzter Beitrag: bergfrei
  Arduino Mega 2560 läuft nicht Wolfgang50 6 172 13.11.2016 10:50
Letzter Beitrag: Wolfgang50
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 325 16.10.2016 14:07
Letzter Beitrag: Pit
  Upload funktioniert nicht Levi 5 236 22.09.2016 20:19
Letzter Beitrag: hotsystems
  ESP8266 tuts nicht sowerum 7 384 19.09.2016 21:01
Letzter Beitrag: sowerum
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 222 16.09.2016 20:36
Letzter Beitrag: Datatom
  SD Karte wird nicht erkannt... Maxi290997 2 201 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 964 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Arduino Uno+Motor Shield+Velleman Mustercode funktionieren nicht Dubidu 8 480 20.07.2016 19:05
Letzter Beitrag: Scheams
  Sketch konnte nicht angelegt werden Sarius 2 237 16.07.2016 15:59
Letzter Beitrag: Sarius

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste