Problema con SD al conectar GPS

Buenas a todos los foreros. Es mi primer post ya que estoy loco intentando entender el problema y no consigo dar con él. Estoy intentando desarrollar un velocimetro que mida la velocidad por gps y me la muestre de forma analógica con un motor paso a paso y una aguja que se mueble por el tablero donde están marcadas las velocidades. Comencé haciendo el código por separado de todos los elementos y todo funcionaba pero cuando hice el código general para todo vinieron los problemas. Si conecto todo menos el módulo GPS los kilometros guardados en la SD se muestran en la pantalla oled, pero si conecto el módulo GPS me muestra que hubo un error abriendo la tarjeta SD. He mirado y remirado el codigo y siempre el mismo problema. Estoy utilizando un arduino nano .Pongo el codigo para que le echeis un vistazo:

#include <Stepper.h>
#include <SSD1306Ascii.h>
#include "SSD1306AsciiAvrI2c.h"
#include <SD.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#define rxPin 6
#define txPin 5
#define BUTTON_PIN 2
#define I2C_ADDRESS 0x3C
#define RST_PIN -1

//GPS
SoftwareSerial neogps(rxPin,txPin);
TinyGPSPlus gps;
int pulso = 2;

//OLED
SSD1306AsciiAvrI2c oled;
File myFile;
File file;
String k_o;
int cont = 0;
bool state = false;
String leyendo = "ckm.txt";
String anterior;
const int sensorPin = A1;   // seleccionar la entrada para el sensor
int sensorValue;      // variable que almacena el valor raw (0 a 1023)
float value;
void leer(String archivo);
void sobrescribir(String archivo, String nuevo);


//MOTOR
Stepper myStepper(2550, 8, 9);
double v_a = 0;
double v = 0;
double mover = 0;
float recorrido = 0;
int km = 0; //leer(a.txt);
String k;

void setup()
{
  //GPS
  Serial.begin(9600);
  neogps.begin(9600);
  pinMode(pulso,OUTPUT);      
  Serial.println("Velocimetro");
  delay(3000);

  
  //MOTOR
  myStepper.setSpeed(55);

  //SD Y OLED
  Serial.begin(9600);
  if (!SD.begin(4)) 
  {
    Serial.println("No se pudo inicializar la SD");
    return ;
  }
  Serial.println("inicializacion exitosa de la SD");
  Serial.println(SD.exists(leyendo));

  leer(leyendo);

#if RST_PIN >= 0
  oled.begin(&Adafruit128x32, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
#endif // RST_PIN >= 0
  // Call oled.setI2cClock(frequency) to change from the default frequency.

  oled.setFont(X11fixed7x14);
  oled.clear();
  oled.print(k_o + " km");
  anterior = k_o;
}



  //LOOP DE GPS Y MOTOR
  void loop(){
  //GPS

  if(gps.speed.kmph()>10)
  {
     recorrido = recorrido + (gps.speed.kmph()*0.00027777777777777777777777777777777777777777777777777777777777777777777777777778);
  }

  else
  {
    recorrido=recorrido;
  }
     
  if (recorrido>=1){
   
    //sobrescribir(file,km);
     km = km+1;
     
    recorrido = 0;
  }

  //BOTON INTERFAZ

  if(!digitalRead(BUTTON_PIN))
  {
    cont += 100;
    state = true;
  }
  else if(state)
  {
    if(cont>=2000 && leyendo=="p.txt")
    {
      Serial.println("reset");
      sobrescribir(leyendo, "0");
    }
    else if(cont>=100)
    {
      Serial.println("cambiar");
      if(leyendo=="ckm.txt"){
        leyendo = "p.txt";
      }else if(leyendo=="p.txt"){
        leyendo= "ckm.txt";
      }
    }
    cont = 0;
  }

  anterior = k_o;
  leer(leyendo);
  

  if(anterior!=k_o)
  {
    oled.clear();
    oled.print(k_o + " km");
  }
  delay(100);
  
  boolean newData = false;
  for(unsigned long start = millis(); millis() - start < 1000;)
  {
    while (neogps.available())
    {
      if (gps.encode(neogps.read()))
      {
        newData = true;
      }
    }
  }
  //If newData is true
  if(newData == true)
  {
    newData = false;
    print_speed();
  }
  else
  {
    Serial.print("Error de conexión\n");
    v=0;
  }  

  //MOTOR
    if(v<=10)
  {
    v = 0;
  }
  else
  {
  mover = 21.25*(v-v_a); //hay que redondear el numero de pasos
  myStepper.step(int(mover));
  delay(100);
  v_a = v;
}
}


void print_speed()
{     
  if (gps.location.isValid() == 1)
  {
      
    Serial.print(gps.speed.kmph());

    Serial.print(" km/h \n");

    v = gps.speed.kmph();
    //Serial.println("km/h");
  //  Serial.print("SAT:");
   // Serial.println(gps.satellites.value());
   // Serial.print("ALT:");
   // Serial.println(gps.altitude.meters(), 0);

    
  }
    else
  {
     Serial.print("Estableciendo conexión...\n");
     delay(5000);
  }
}

//DATOS SD
void sobrescribir(String archivo, String nuevo){
  SD.remove(archivo);
  file = SD.open(archivo, FILE_WRITE);
  if (file){
    file.print(nuevo);
    file.close();
  } 
}

void leer(String archivo){

  pinMode(BUTTON_PIN, INPUT_PULLUP);
 
  myFile = SD.open(archivo, FILE_READ);//abrimos  el archivo 
  if (myFile) {
    k_o = "";
    while (myFile.available()) {
      char caracter = myFile.read();
      k_o = k_o + caracter;
    }
    myFile.close(); //cerramos el archivo
  } else {
    k_o = "Error de lectura.";
  }
}

float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}


  
//SD Y OLED
  Serial.begin(9600);  // está de más

Quita esa línea, el puerto serial ya fue iniciado en la primer línea de setup().

No hay razón para que el GPS interfiera con la SD.

Sube un esquema de las conexiones, puedes hacerlo a mano y subir una foto (por favor no lo hagas con fritzing).

ahora mismo voy :+1:

he hecho una lista con las conexiones, ya que no me aclaro para hacer un esquema en el ordenador y a mano con tantas conexiones se emborrona mucho, asi que aqui va:

D2-Botón
D4-Cs(SD)
D5-Rx(GPS)
D6-Tx(GPS)
D8-DIR(Controlador motor paso a paso)
D9-STEP(Controlador motor paso a paso)
D11-MOSI(SD)
D12-MISO(SD)
D13-SCK(SD)
A4 -SPA(OLED)
A5-SCK(OLED)

Faltan las conexiones de coltaje y tierrra que cada componente tiene el suyo.
Aquí estarían las conexiones entre la placa y los demas módulos. Pienso que hay un conflicto entre la SD y el modulo GPS (GPS neo6m).
Gracias.

¿Nunca escuchaste que una imagen vale más que mil palabras?

Esquema, no lista de pines. Sino el esquema lo tengo que hacer yo y no es el caso.

Y si con 11 pines se te "emborrona" no me imagino si usaras una Mega.

No, no lo hay.
Tengo 2 tracker/velocímetro funcionando, uno con Nano, otro con Pi Pico y pronto otro con ESP32.

Pues aqui el esquema(lo he hecho lo mejor que he podido).

Respecto a lo que dices, también utilizas una SD? Si desconecto el GPS como dije todo funciona. La SD abre el archivo y lo muestra y si conecto el GPS me aparece el mensaje de no se pudo inicializar SD y ahí se queda. Ni velocidad ni el archivo de la SD ni nada.

Si, claro.

Hay un detalle con los archivos, no tomas precauciones si no existen.

Que raro... Pues voy a volver a probar a ver. Respecto a los archivos no hay problema porque siempre estarán, aún así cuando vea que me funcione añadiré que los cree o algo por el estilo. En el simulador veo en la pantalla que pone "error con la SD". Es porque en el simulador no hay archivos no? Y en teoría si los hubiese funcionaria?

Vale creo que he encontrado el problema. Al conectar varias cosas tanto a 3 como a 5 voltios la placa no es capaz de darle suficiente corriente a todos los elementos y por eso mismo se apaga alguno de ellos dando así el error.

Una vez revisado como alimentar todo ya funciona. Muchas gracias por la ayuda!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.