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 ;
}
@user11907, 👍0
2 ответа
Пожалуйста, попробуйте эту сокращенную версию, которая просто открывает файл. Посмотрите, появится ли сообщение "Файл открыт нормально". Обратите внимание на более высокую скорость передачи данных. Мне нравится тестировать на 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.
Вы, кажется, ожидаете заявления по форме
idx ;
чтобы увеличить переменную, но этого не произойдет, поэтому ваши переменные idx и count навсегда равны 0, и вы продолжаете пытаться повторно открыть тот же файл, даже не закрывая его.
Чтобы увеличить переменную, используйте оператор++, как в
idx++;
count++;
- Понимание того, почему следует избегать «String» и альтернативных решений
- SD-карта не инициализируется
- Что означают эти контакты? Куда мне их подключить?
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Объяснение кода MPU6050
- Arduino: как записать значение переменной в текстовый файл и изменить его на SD-карте?
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной