Go Down

Topic: Arduino nano con IMU + SD (Read 638 times) previous topic - next topic

guillez4

May 23, 2020, 01:13 am Last Edit: May 25, 2020, 09:48 am by guillez4
Hola buenas

¿Podrían ayudarme con mi proyecto ando un poco perdido?

Mi proyecto consiste en guardar los valores del IMU de la nano 33 iot en una tarjeta SD, lo quiero guardar en tarjeta SD ya que quiero que este dispositivo sea portátil y ademas sin conexión a internet ni nada.

Tengo varios problemas con este asunto.

Por un lado he visto que el muestreo del IMU lo hace cuando le da la gana en el caso de hacerlo como el proyecto he visto que me lo hace a una frecuencia de 100Hz pero he probado el mismo código sin escribirlo en la SD, es decir mostrando los valores por el Serial y me sale una frecuencia de 200Hz.

Por otro lado este proyecto esta pensado para recopilar datos durante (30 minutos-1 hora), ¿podría tener problemas con la memoria EEPROM, recopilando datos durante tanto tiempo?
¿si es así que me recomendáis cada cierto tiempo guardar y cerrar el documento en el que guardo los datos?

Por ultimo quería señalar que este proyecto quiero que sea portátil, he intentado alimentar la arduino nano con dos baterías lipo en serie, es decir tendría una tensión de 7.4V. Sin embargo no consigo nunca que el arduino genere y abra el documento txt que guarda los datos, cuando lo hago conectado por USB no tengo problemas.

Aquí adjunto el código de mi proyecto:


Code: [Select]


int boton_guardar=2;//asignamos al boton guardar el pin digital 2
int led_v_int=5; //designamos el led verde que indica que hemos activado la interrupcion en el pin digital 5
int volatile interrup=0;// para la interrupcion con un boton debemos definir una variable que esta cambiara para que active el guardado de datos en la SD
const float Pi = 3.1416;
//----------------------------------------------------
//BIBLIOTECAS Y VARIABLES TARJETA SD
//----------------------------------------------------
#include <SPI.h>
#include <SD.h>
File archivo;
#define SSpin 10
//----------------------------------------------------
//BIBLIOTECAS Y VARIABLES SENSOR IMU
//----------------------------------------------------
#include "SparkFunLSM6DS3.h"
#include "Wire.h"

//Create a instance of class LSM6DS3
LSM6DS3 myIMU( I2C_MODE, 0x6A );  //I2C device address 0x6A
//----------------------------------------------------

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  attachInterrupt( digitalPinToInterrupt(boton_guardar), guardar, CHANGE);//desiganos la interrupción
  que activara la funcion guardar al boton_guardar
  pinMode(led_v_int, OUTPUT);//designa el pin digital como salida, led que nos idica que la interrupcion
  esta activa
  //----------------------------------------------------
  //setup SD
  //----------------------------------------------------
  delay(2000);
  Serial.println("Inicializando tarjeta ...");
  if (!SD.begin(SSpin)){
    Serial.println("Fallo en inicializacion!");
    return;
  }
  Serial.println("Inicializacion correcta");
  archivo = SD.open("IMU.txt", FILE_WRITE);
  //----------------------------------------------------
  //setup IMU
  //----------------------------------------------------
  //Over-ride default settings if desired
  myIMU.settings.gyroEnabled = 1;  //Can be 0 or 1
  myIMU.settings.gyroRange = 2000;   //Max deg/s.  Can be: 125, 245, 500, 1000, 2000
  myIMU.settings.gyroSampleRate = 104;   //Hz.  Can be: 13, 26, 52, 104, 208, 416, 833, 1666

  myIMU.settings.accelEnabled = 1;
  myIMU.settings.accelRange = 16;      //Max G force readable.  Can be: 2, 4, 8, 16
  myIMU.settings.accelSampleRate = 104;  //Hz.  Can be: 13, 26, 52, 104, 208, 416, 833, 1666, 3332, 6664, 13330
  while (!Serial);
  Serial.println("IMU Test"); Serial.println("");

  /* Initialise the sensor */
  //Call .begin() to configure the IMUs
  if( myIMU.begin() != 0 )
  {
    Serial.println("Device error");
  }
  else 
  {
    Serial.println("Device OK!");
  }
  //----------------------------------------------------
  //Escribimos los valores del IMU en la SD
  //----------------------------------------------------
  Serial.println("");
  if (archivo){
   
    while (interrup==0) {

      delay(5);
     
      //Accelerometer
      //archivo.print("Aceleración:");
      //archivo.print("  x = ");
      archivo.print(myIMU.readFloatAccelX(), 4);archivo.print(",");
      //archivo.print("  y = ");
      archivo.print(myIMU.readFloatAccelY(), 4);archivo.print(",");
      //archivo.print("  z = ");
      archivo.print(myIMU.readFloatAccelZ(), 4);archivo.print(",");
      //archivo.print("  m/s^2");
     
 
      //Gyroscope
      //archivo.print("     Velocidad angular:");
      //archivo.print(" x = ");
      archivo.print(myIMU.readFloatGyroX()*Pi/180, 4);archivo.print(",");   
      //archivo.print(" y = ");
      archivo.print(myIMU.readFloatGyroY()*Pi/180, 4);archivo.print(",");
      //archivo.print(" z = ");
      archivo.print(myIMU.readFloatGyroZ()*Pi/180, 4);archivo.print(",");
      //archivo.println("  π/s");

      //Tiempo
      archivo.println(millis());
      //archivo.println("s");
     
      }
    archivo.close();
    Serial.println("Escritura correcta");
    delay(1000);
    digitalWrite(led_v_int,LOW);
    interrup=0;
  } else {
    Serial.println("Error en la apertura de IMU.txt");
  }
}
void guardar(){
  interrup=1;//asignamos a la variable interrup el valor de uno, de manera que active el código para guardar los datos de la SD
  digitalWrite(led_v_int,HIGH);
}
void loop() {
  // put your main code here, to run repeatedly: 
 
}


Go Up