Winkelmessungen mit MPU6050 auf SD -Karte speichern?

@michael_x: Für so ein antikes Stück ist das ok. Da freut man sich, wenn sie wieder geht.

Gruß Tommy

michael_x:
Das wichtigste für den Logger-Anwendungsfall hier ist doch, dass die Zeit nicht nach jedem Batteriewechsel des Arduino komplett weg ist...

Der, die oder das DS1307 kommt mit einer kleinen Knopfzelle. Daher sollte das unabhaengig von der Batterie des Nanos sein. Ich denke, was ich dann machen muss ist SD Karte wechseln, Batterie wechseln und schon zeichne ich wieder Daten auf.

Leider war heute nichts in der Post.

Hallo, Freunde der leichten Unterhaltung!

Nun endlich neues zu meinem Winkelprojekt. Die RTCs sind endlich gekommen (DS1307). Die waren recht einfach zu intsllieren. Habe die auf 0x68 belassen und dafuer die MPU auf 0x69 gelegt (ADO sollte dann mit VCC oder eben den 3.3V verbunden sein). Fall ich demnaechst mal Zeit hab mach ich einen Schaltplan (Bildchen schon mal vorab....ja, ich weiss ich brauch mal ein groesseres Steckbrett und sollte nicht Bilder mit fuenf Projekten auf einem Steckbrett schicken).

Momentan wird alle Minute ein paar Werte auf die SD Karte gespeichert. Ich werde mal sehen ob ich diese eventuell noch mitteln kann. Den Sketch habe ich auch gleich unten mit dran gemacht. Vielleicht faellt ja jemanden noch eine elegantere Loesung ein.

Alles wird nun in die Kiste gepackt, Batterien rein und ab in die Wildnis.

Mal sehen wie lange das dann laeuft.

Gruesse,

Norbert

// This works with the MPU and saves data every minute

#include <SD.h>
#include<SPI.h>
#include<Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;


//
const int MPU_addr=0x69; // changed to 0x69 to use 0x68 with the RTC. Note: ADO of the MPU needs to be connected to VCC
double AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
uint32_t timer; 
double compAngleX, compAngleY; 
#define degconvert 57.2957786 

unsigned long interval = 5000;
long previousMillis;
int count = 1;

void setup()
{
  Wire.begin(); 
  #if ARDUINO >= 157
  Wire.setClock(400000UL); 
  #else
    TWBR = ((F_CPU / 400000UL) - 16) / 2;
  #endif

  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  
  Wire.write(0);     
  Wire.endTransmission(true);

  rtc.begin(); //supposed to start the RTC
 

Serial.begin(9600);
Serial.print("Initializing SD card...");
pinMode(4, OUTPUT);

if (!SD.begin(4)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
  //setup starting angle
  //1) collect the data
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  
  AcX=Wire.read()<<8|Wire.read();     
  AcY=Wire.read()<<8|Wire.read();  
  AcZ=Wire.read()<<8|Wire.read();  
  Tmp=Wire.read()<<8|Wire.read();  
  GyX=Wire.read()<<8|Wire.read();  
  GyY=Wire.read()<<8|Wire.read();  
  GyZ=Wire.read()<<8|Wire.read();  


  double roll = atan2(AcY, AcZ)*degconvert;
  double pitch = atan2(-AcX, AcZ)*degconvert;

 
  double gyroXangle = roll;
  double gyroYangle = pitch;
  double compAngleX = roll;
  double compAngleY = pitch;
  
  timer = micros(); 
}
//
void loop(){
    
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  
  AcX=Wire.read()<<8|Wire.read();       
  AcY=Wire.read()<<8|Wire.read();  
  AcZ=Wire.read()<<8|Wire.read();  
  Tmp=Wire.read()<<8|Wire.read();  
  GyX=Wire.read()<<8|Wire.read();  
  GyY=Wire.read()<<8|Wire.read();  
  GyZ=Wire.read()<<8|Wire.read();  
  
  double dt = (double)(micros() - timer) / 1000000; 
  timer = micros(); 

  double roll = atan2(AcY, AcZ)*degconvert;
  double pitch = atan2(-AcX, AcZ)*degconvert;

  double gyroXrate = GyX/131.0;
  double gyroYrate = GyY/131.0;

  compAngleX = 0.99 * (compAngleX + gyroXrate * dt) + 0.01 * roll; 
  compAngleY = 0.99 * (compAngleY + gyroYrate * dt) + 0.01 * pitch; 

DateTime now = rtc.now();

int s=now.second();
if(s==0){    //get the log to SD every 60 sec ( 1Min )...still need to find a way to save a average value
saveData(); //Log to SD using commands under void saveData()
// delay(1);
}}

void saveData(){
DateTime now = rtc.now();
if(SD.exists("data.csv")){ 
  Serial.println("Creating data.csv...");
  File data = SD.open("data.csv", FILE_WRITE);
  if (data) {
  (millis() - previousMillis > interval);
    previousMillis = millis();
    (count++);}
    if (count == 12){
    (count = 0);}
    if (count = 12){
    Serial.print(now.year(), DEC); Serial.print('/');
    Serial.print(now.month(), DEC); Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' '); Serial.print(",");
    Serial.print(now.hour(), DEC); Serial.print(':');
    Serial.print(now.minute(), DEC); Serial.print(':');
    Serial.print(now.second(), DEC); Serial.println(",");
    Serial.print(compAngleX, 3);Serial.print (",");
    Serial.println(compAngleY, 3);
    data.print(now.year(), DEC); data.print('/');
    data.print(now.month(), DEC); data.print('/');
    data.print(now.day(), DEC);
    data.print(' '); data.print(",");
    data.print(now.hour(), DEC); data.print(':');
    data.print(now.minute(), DEC); data.print(':');
    data.print(now.second(), DEC); data.println(",");
    data.print(compAngleX, 3);data.print (",");
    data.println(compAngleY, 3);
    data.close();}
}}

// This is looking good!

Beim data.print und Serial.print hatte ich noch einen ln mitten drinnen....aber das hat von euch sowieso jeder gleich gesehen. Jetzt kommt alles schoen in Spalten....