Arduino не может записать данные MPU6050 на SD-карту

Я надеюсь, что мой датчик MPU6050 сможет записывать данные на мою SD-карту, все в порядке, но для открытия последовательного монитора я получил сообщение об ошибке:

Initializing I2C devices...
Testing device connections...
MPU6050 connection successful
filename :acc_0.txt
0, ax: -85, ay: 227, az: 3997
filename :acc_0.txt
error: opening att_0.txt for write failed
SD errorCode: 0X13,0XE5

Вот мой код:

// Based on I2Cdevlib, MPU6050_raw
// Experiments to verify if any data loss when writing MPU6050 outputs to SD card

#include "I2Cdev.h"
#include "MPU6050.h"
#include <SdFat.h>

// SD card read/write
// MOSI - pin 11
// MISO - pin 12 
// CLK  - pin 13
// CS   - pin 4
const int chipSelect = 4;

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

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

SdFat sd;
SdFile myFile;

int count = 0;
int idx = 0;

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

    // initialize serial communication
    // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
    // it's really up to you depending on your project)
    Serial.begin(38400);

    // initialize device
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();

    // change accel sensitivity to 8g
    accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_8);

    // verify connection
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

    // Initialize SdFat or print a detailed error message and halt
    // Use half speed like the native library.
    // change to SPI_FULL_SPEED for more performance.
    if (!sd.begin(chipSelect, SPI_HALF_SPEED)) 
        sd.initErrorHalt();
}

void loop() 
{
    // read raw accel/gyro measurements from device
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    // dynamic create a file
    if (count == 0)
    {
        // dynamic filename
        char filename[11];
        sprintf(filename, "acc_%d.txt", idx);
        Serial.print("filename :");
        Serial.println(filename);

        // open the file for write at end like the Native SD library
        if (!myFile.open(filename, O_RDWR | O_CREAT | O_AT_END)) 
            sd.errorHalt("opening att_0.txt for write failed");        
    }

    // write data to file
    Serial.print(count); myFile.print(count); myFile.print(", ");
    Serial.print(", ax: "); Serial.print(ax); myFile.print(ax); myFile.print(", ");
    Serial.print(", ay: "); Serial.print(ay); myFile.print(ay); myFile.print(", ");
    Serial.print(", az: "); Serial.println(az); myFile.println(az);         

    // close file when every 1,000 records
    if (count > 1000)
    {
        myFile.close();
        Serial.println("Finish.");
        count = -1;
        idx  ;
    }    

    count  ;
}

, 👍0


2 ответа


0

Пожалуйста, попробуйте эту сокращенную версию, которая просто открывает файл. Посмотрите, появится ли сообщение "Файл открыт нормально". Обратите внимание на более высокую скорость передачи данных. Мне нравится тестировать на 115200.

#include <SdFat.h>

// SD card read/write
// MOSI - pin 11
// MISO - pin 12 
// CLK  - pin 13
// CS   - pin 4
const int chipSelect = 4;

SdFat sd;
SdFile myFile;

int idx = 0;

void setup() {
  Serial.begin(115200);

  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) 
    sd.initErrorHalt();

  // dynamic filename
  char filename[11];
  sprintf(filename, "acc_%d.txt", idx);
  Serial.print("filename :");
  Serial.println(filename);

  // open the file for write at end like the Native SD library
  if (!myFile.open(filename, O_RDWR | O_CREAT | O_AT_END)) 
    sd.errorHalt("opening att_0.txt for write failed");        

  Serial.println ("File opened OK");
  myFile.close ();  
}

void loop() 
{
}

Если это не удается, значит, с вашей SD-картой возникла какая-то проблема, например:

  • Не отформатирован
  • Отформатирован таким образом, что библиотека SdFat не распознает
  • Проблема с проводкой

Если это удастся, то может возникнуть некоторый конфликт между SD-картой и MPU6050.

,

0

Вы, кажется, ожидаете заявления по форме

idx ;

чтобы увеличить переменную, но этого не произойдет, поэтому ваши переменные idx и count навсегда равны 0, и вы продолжаете пытаться повторно открыть тот же файл, даже не закрывая его.

Чтобы увеличить переменную, используйте оператор++, как в

idx++;

count++;
,