Buenas foreros, tengo un problemilla con un proyecto que estoy haciendo, un coche controlado con el móvil vía bluetooth.
El caso es que el coche responde a los comandos que envío desde el teléfono, pero con unos 6 segundos de retraso.
Esta es la tercera versión que hago del proyecto, en la anterior el coche se quedaba como bloqueado por unos segundos y luego de repente hacía todos los movimientos que le había mandado, como si los hubiera almacenado en un buffer y los soltara todos de golpe; así que le puse un comando de respuesta desde arduino al teléfono, ahora hace los movimientos más fluidos, pero con muchísimo retraso.
Os dejo el código que he escrito por si alguien sabe que puede estar mal.
Muchas gracias.
#include <SoftwareSerial.h>
SoftwareSerial BT1(2,3); // RX, TX
char delimitador;
int PinFDerFow = 4 ; // Pin activación motor derecho adelante
int PinRDerFow = 12 ;
int PinFDerRev = 7 ; // Pin activación motor derecho atras
int PinRDerRev = 13 ;
int PinFIzqFow = 0 ; // Pin activación motor izquierdo adelante
int PinRIzqFow = 8 ;
int PinFIzqRev = 1 ; // Pin activación motor izquierdo atras
int PinRIzqRev = 11 ;
int PinFVelder = 6 ; // Pin PWM control motor derecho
int PinRVelder = 10 ;
int PinFVelizq = 5 ; // Pin PWM control motor izquierdo
int PinRVelizq = 9 ;
int Dir ;// Variable que indica la dirección del coche 1=adelante 2=atrás
int Velocidad ;
int Vel ; // Variable de control de velocidad
int Gir ; // Variable que indica la direción de giro 3=izquierda 4=derecha
int DifGir ; // Diferencial de velocidad de los motores para el giro
int VelDif ; // Calculo de la velocidad diferencial de giro
int Direccion ; // Subcadena para la variable Dir
int VelDireccion ; // Subcadena para la variable Vel
int Giro ; // Subcadena para la variable Gir
int DifGiro ; // Subcadena para la variable Difgir
void setup()
{
BT1.begin(115200);
pinMode (PinFDerFow, OUTPUT );
pinMode (PinRDerFow, OUTPUT );
pinMode (PinFDerRev, OUTPUT );
pinMode (PinRDerRev, OUTPUT );
pinMode (PinFIzqFow, OUTPUT );
pinMode (PinRIzqFow, OUTPUT );
pinMode (PinFIzqRev, OUTPUT );
pinMode (PinRIzqRev, OUTPUT );
pinMode (PinFVelder, OUTPUT );
pinMode (PinRVelder, OUTPUT );
pinMode (PinFVelizq, OUTPUT );
pinMode (PinRVelizq, OUTPUT );
}
void loop () {
while (BT1.available ()){
if (BT1.available() > 0){
delimitador = BT1.read ();
if (delimitador == 's' ){
BT1.print ('t' );
}
else if (delimitador == 'a' );
Dir = BT1.parseInt();
Vel = BT1.parseInt();
Gir = BT1.parseInt();
DifGir = BT1.parseInt();
}
Direccion = Dir;
Giro = Gir;
VelDif = (100 - DifGir);
VelDireccion = map ( Vel , 0, 100, 40, 255);
Velocidad = ( (VelDireccion * VelDif) / 100 );
Dir = 0 ;
Vel = 0 ;
Gir = 0 ;
DifGir = 0 ;
if ( Direccion == 1 ) {
digitalWrite (PinFDerRev, LOW ) ;
digitalWrite (PinRDerRev, LOW ) ;
digitalWrite (PinFIzqRev, LOW ) ;
digitalWrite (PinRIzqRev, LOW ) ;
digitalWrite (PinFDerFow, HIGH ) ;
digitalWrite (PinRDerFow, HIGH ) ;
digitalWrite (PinFIzqFow, HIGH ) ;
digitalWrite (PinRIzqFow, HIGH ) ;
//Serial.println ("Fow");
switch (Giro){
case 3:
analogWrite (PinFVelizq , Velocidad) ;
analogWrite (PinRVelizq , Velocidad) ;
analogWrite (PinFVelder , VelDireccion) ;
analogWrite (PinRVelder , VelDireccion) ;
//Serial.println (Gir);
break;
case 4:
analogWrite (PinFVelizq , VelDireccion) ;
analogWrite (PinRVelizq , VelDireccion) ;
analogWrite (PinFVelder , Velocidad) ;
analogWrite (PinRVelder , Velocidad) ;
//Serial.println (Gir);
break;
}
}
if ( Direccion == 2 ) {
digitalWrite (PinFDerFow, LOW ) ;
digitalWrite (PinRDerFow, LOW ) ;
digitalWrite (PinFIzqFow, LOW ) ;
digitalWrite (PinRIzqFow, LOW ) ;
digitalWrite (PinFDerRev, HIGH ) ;
digitalWrite (PinRDerRev, HIGH ) ;
digitalWrite (PinFIzqRev, HIGH ) ;
digitalWrite (PinRIzqRev, HIGH ) ;
switch (Giro){
case 3:
analogWrite (PinFVelizq , Velocidad) ;
analogWrite (PinRVelizq , Velocidad) ;
analogWrite (PinFVelder , VelDireccion) ;
analogWrite (PinRVelder , VelDireccion) ;
break;
case 4:
analogWrite (PinFVelizq , VelDireccion) ;
analogWrite (PinRVelizq , VelDireccion) ;
analogWrite (PinFVelder , Velocidad) ;
analogWrite (PinRVelder , Velocidad) ;
break;
}
}
if ( Direccion == 0){
digitalWrite (PinFDerRev, LOW ) ;
digitalWrite (PinRDerRev, LOW ) ;
digitalWrite (PinFIzqRev, LOW ) ;
digitalWrite (PinRIzqRev, LOW ) ;
digitalWrite (PinFDerFow, LOW ) ;
digitalWrite (PinRDerFow, LOW ) ;
digitalWrite (PinFIzqFow, LOW ) ;
digitalWrite (PinRIzqFow, LOW ) ;
//Dir = 0;
//Vel = 0;
//Gir = 0;
//Difgir = 0;
//Velocidad = 0;
}
delay (1);
BT1.print ('t');
}
}
Edito:
He leído un post de un compañero que tenía un problema similar al mío, y lo solucionó cambiando el puerto serie al nativo de la placa UNO en lugar de usar el SofwareSerial. Yo he cambiado el código para hacer lo mismo que él, ya que esto solo lo usaba para la depuración con la consola y he mejorado un poco, sólo se retrasa 2 o 3 segundos en la respuesta, no se si puede tener algo que ver que le he cambiado los baud a 115200, aunque en teoría debería ser más rápida la comunicación.