Hola chicos, a ver si me ayudan a dar con el problema porque yo me voy a volver loco.
Resulta que en un sistema de control que tengo construido tengo un arduino Uno en donde, entre otras cosas, utilizo un motor PWM y un modulo lector de tarjetas microSD. En este sistema yo le mando una orden por serial y me arranca el motor, y con otra orden me lee un archivo de la tarjeta.
El problema es que si pongo todo esto junto no me funciona, me manda respuestas del serial de comando inválido, pero si elimino la lectura del serial y hago funcionar las os cosas directamente todo funciona bien.
El código con todo es el siguiente:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include "MeanFilterLib.h"
#include "AVR_PWM.h"
#include <SD.h>
#include <SPI.h>
#define _PWM_LOGLEVEL_ 1
//Variables servos
Adafruit_PWMServoDriver controlservos = Adafruit_PWMServoDriver();
int tiempo=500;
int angulo = 0;
//Variables Pitot
float V_0 = 5.0;
float rho = 1.204;
int offset1, offset2, offset3, offset4;
MeanFilter<float> meanFilter0(10);
MeanFilter<float> meanFilter1(10);
MeanFilter<float> meanFilter2(10);
MeanFilter<float> meanFilter3(10);
//Lectura Serial
int accion=0;
double value1=0;
double value2=0;
double value3=0;
//Variables motores
AVR_PWM* PWM_Instance;
float frecuenciaPWMmotor;
//Variables SD
File myFile;
//Variables temporizador
unsigned long actual, inicio, fin, transcurrido;
int activreloj=0;
void setup() {
Serial.begin(9600);
Serial.print("Iniciando SD ...");
if (!SD.begin(10)) {
Serial.println("No se pudo inicializar");
return;
}
Serial.println("inicializacion exitosa");
iniciarPCA9685();
Serial.println("Iniciando calibración Pitots");
offset1=pitotoffsetcalibracion(1);
offset2=pitotoffsetcalibracion(2);
offset3=pitotoffsetcalibracion(3);
offset4=pitotoffsetcalibracion(4);
//iniSD();
iniciarmotor();
}
void loop() {
if (Serial.available()) {
String command = Serial.readStringUntil('\n'); // Leer el comando enviado por el puerto serial
command.trim(); // Elimina espacios en blanco al principio y al final
// Extraer el comando y el valor (si está presente)
String task = command.substring(0, command.indexOf(' '));
command.remove(0, command.indexOf(' ')+1);
String valueString = command.substring(0,command.indexOf(' '));
command.remove(0, command.indexOf(' ')+1);
String value2String = command.substring(command.indexOf(' ')+1);
command.remove(0, command.indexOf(' ')+1);
String value3String = command.substring(command.indexOf(' ')+1);
value1 = valueString.toDouble();
value2 = value2String.toDouble();
value3 = value3String.toDouble();
// Ejecutar la tarea correspondiente al comando recibido
if (task == "iniciclon") {
accion = 1;
}else if (task == "valvula") {
accion = 2;
}else if (task == "calibracion") {
accion = 3;
}else if (task == "leer") {
accion = 4;
}else if (task == "parar"){
accion = 5;
}else{
Serial.println("Comando inválido");
}
}
switch(accion){
case (1):
Serial.println("Succion activada");
arranquerampa(1, value1, 1);
accion = 0;
break;
case (2):
Serial.print("Moviendo servo "); Serial.print(value1); Serial.print(" a posicion ");
Serial.println(value2);
setServo(value1,value2);
accion = 0;
break;
case (3):
Serial.println("Empezando calibración: ");
//calibracionlecturas(value1);
accion = 0;
break;
case (4):
Serial.println("Leyendo SD");
lecturaSD();
accion = 0;
break;
case (5):
pararmotor();
Serial.println("Sistema parado");
accion = 0;
break;
}
//float V1=caudalimetro(1,offset1);
//Serial.println(V1);
delay(1000);
}
Lo peor es que si le quito toda la parte de la lectura y solo pongo el siguiente codigo en el loop, este funciona perfectamente:
arranquerampa(1, 20, 1);
delay(1000);
lecturaSD();
delay(1000);
arranquerampa(1, 50, 1);
delay(1000);
lecturaSD();
delay(1000);
Ya no se por donde seguir mirando que puede ser el error.
Aprovecho y pregunto si les gusta esta forma de organizar las ordenes y realizar la lectura del serial, o ustedes lo harían de otra forma.
Un saludo y gracias de antemano