retardo en las ordenes por puerto serial

hola a todos,

Tengo montado un coche rc controlado por bluetooth con un puente H y desde hace poco tengo un problema y es que cuando le mando las ordenes por serial, a(izq) b(dcha) c(delante) d(detras)g(paro) tengo un retardo desde que le mando la orden hasta que la ejecuta de 5 segundos aprox, alguien tiene idea de por donde puede estar el problema?

este es el codigo:

#include <Servo.h>

#include <SoftwareSerial.h>

SoftwareSerial blue(0,1);
Servo servo;

int servoPos = 10 ;
int motor1=5;
int motor2=4;
int direccion1=3;
int direccion2=2;
char caracter;
const byte cabeza=6;

void setup() {

blue.begin(9600);
pinMode (direccion1,OUTPUT);
pinMode (direccion2,OUTPUT);
pinMode(motor1,OUTPUT);
pinMode(motor2,OUTPUT);
servo.attach (cabeza);

}

void loop (){
for(servoPos; servoPos<170; servoPos ++){
servo.write(servoPos);
delay(20);
}
for(servoPos=170; servoPos>10; servoPos --){
servo.write(servoPos);
delay(20);
}

caracter=blue.read();

if (caracter==‘a’){

digitalWrite (direccion1, HIGH);
digitalWrite (direccion2, LOW);

}
if (caracter==‘c’){
digitalWrite (motor1,HIGH);
digitalWrite (motor2,LOW);

}

if (caracter==‘b’){
digitalWrite (direccion1, LOW);
digitalWrite (direccion2, HIGH);

}
if (caracter==‘d’){
digitalWrite (motor1,LOW);
digitalWrite (motor2,HIGH);

}
if (caracter==‘g’){
digitalWrite(motor1,LOW);
digitalWrite(motor2,LOW);
digitalWrite(direccion1,LOW);
digitalWrite(direccion2,LOW);
}

Saludos Estas usando software Serial donde tienes un Hardware serial? No crees que es una locura?

Posiblemente alli esta el error al recibir.

hola max_saeta, ante todo gracias por responder. Decir que soy novato en el tema pero viendo ejemplos ya echos veo que la libreria que gestiona el modulo bluetooth siempre es la SoftwareSerial, asi que no se exactamente a lo que te refieres. Puedes ser un poco mas concreto??

Gracias! un saludo

Ok te explico.
En los pines 0 y 1 esta integrado un modulo Serial por HardWare, es decir no hace falta

#include <SoftwareSerial.h>
SoftwareSerial blue(0,1);

Tu codigo sin el software serial y eliminando los if quedaria asi:

#include <Servo.h>

Servo servo;

int servoPos = 10 ;
int motor1=5;
int motor2=4;
int direccion1=3;
int direccion2=2;
char caracter;
const byte cabeza=6;
void setup() {

  Serial.begin(9600);
  pinMode (direccion1,OUTPUT);
  pinMode (direccion2,OUTPUT);
  pinMode(motor1,OUTPUT);
  pinMode(motor2,OUTPUT);
  servo.attach (cabeza);
}

void loop (){
  for(servoPos; servoPos<170; servoPos ++){
  	servo.write(servoPos);
  	delay(20);  
  }
  for(servoPos=170; servoPos>10; servoPos--){
  	servo.write(servoPos);
  	delay(20);  
  }  									// Aqui hay un problema un delay de 20 ms X 160 = 3200 ms = 3,2 segundos
  										// Mas 3,2 Segundos de la primera rutina = 6,4 Segundos sin hacer nada mas que mover
  										// los servos, y la recepcion no se ejecuta.
  if(Serial.available()){
    caracter=blue.read();
    
    switch (caracter) {
        case 'a':
		    digitalWrite (direccion1, HIGH);
    		digitalWrite (direccion2, LOW);
          break;
        case 'c':
		    digitalWrite (motor1,HIGH);
    		digitalWrite (motor2,LOW); 
          break;
        case 'b':
	    	digitalWrite (direccion1, LOW);
    		digitalWrite (direccion2, HIGH);  
          break;
        case 'd':
		    digitalWrite (motor1,LOW);
    		digitalWrite (motor2,HIGH);
          break;
        case 'g':
		    digitalWrite(motor1,LOW);
      		digitalWrite(motor2,LOW);
      		digitalWrite(direccion1,LOW);
      		digitalWrite(direccion2,LOW);  
          break;
    }
}

Como no se que pretendes hacer y como tienes conectado el sistema no puedo ayudarte mas, busca informacion sobre Serial para que aprendas a como usarlo, el SoftwareSerial se usa cuando necesitas mas de una comunicacion serial y no usas placas como el Mega que tiene 4 hardware Serial integrados.

lo voy a mirar max_saeta, muchas gracias por tu colaboracion. Seguimos hablando gracias!

edito:

Te felicito porque has dado en el clavo en tiempo record, el problema del retardo era la rutina que hace que se mueva un servo haciendo un barrido ( los 6 segundos que comentabas).

muchisimas gracias!!

Y ya para hacerlo más “simultáneo”, podrías meter todo el bloque if/switch en una subrutina y llamarlo desde el interior de los dos for, o hacer un solo bucle que suba y baje y meter ese bloque en medio.