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
  WEMOS Motorshield funzt nicht Rumpl-X 8 191 07.06.2017 21:10
Letzter Beitrag: Tommy56
  LCD geht nicht - keine Ahnung warum?? DL1AKP 12 449 15.05.2017 13:17
Letzter Beitrag: DL1AKP
  433mHz Funkmodule senden/empfangen nicht metzgefa 2 467 06.05.2017 13:30
Letzter Beitrag: metzgefa
  SD Karte wird nicht erkannt Maxi290997 6 277 31.03.2017 06:05
Letzter Beitrag: Bitklopfer
Sad Sketch funktioniert auf dem Mega 2560 nicht Frank1234 16 697 26.03.2017 14:15
Letzter Beitrag: oOSpikeOo
  Mein Skript macht nicht das was es soll ;( DerMatze79 4 324 16.03.2017 22:19
Letzter Beitrag: MicroBahner
  Programmablauf macht nicht das was ich möchte !! ESP + Blynk b3ta 3 258 01.03.2017 14:29
Letzter Beitrag: Tommy56
Rainbow File geht nicht zum compilieren!!!! Jocky 7 382 19.02.2017 20:01
Letzter Beitrag: Binatone
  IRremote bringe ich nicht zum laufen Franz54 5 314 19.02.2017 11:56
Letzter Beitrag: Tommy56
  Code aus 1.6.9 geht mit 1.8.1 nicht mehr zu kompilieren DL1AKP 7 541 02.02.2017 12:16
Letzter Beitrag: Tommy56

Gehe zu:


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