Hola

:
He diseñado un sketch que esta formado por tres partes independientes, que cada una de ellas funciona bien por separado, pero cuando las agrupo en un unico sketch, funciona, pero va muy lento, ya que procesa las situaciones cambiantes en mas de 20 segundos.
Soy modelista de radiocontrol y he incorporado Arduino a mis modelos: submarinos y lanchas rápidas. En este caso es un sketch para una torpedera que hace varias funciones:
La primera parte sirve para poner en marcha el barco a traves de Bluetooth, la segunda parte es un sketch que maniobra los timones laterales (servos) en funcion de la velocidad y el angulo del timon principal (efecto Lürssen). Los otros timones laterales son esclavos de ambas funciones.
La tercera parte es un sketch que pone en marcha cosas, en funcion de la posicion de los sticks de la emisora (2,4GHz), para:
-encender las luces
-Sonido
-Secuencia de apertura de portilla (servo) y disparo de torpedos, cierre de portilla, apertura de portilla sin disparo, en el tubo de babor (bb) y en el tubo de estribor (stb).
La lectura de las señales en el receptor las hago con pulseIn, y procesa las 6 señales de los 6 canales que uso.
Las situaciones las manejo con condiciones "if".
Si alguien puede analizar el sketch y darme algun consejo para hacerlo mas rapido, lo agradeceria.
Saludos
Pedro
SKETCH
#include <Servo.h>
char blueToothVal; //value sent over via bluetooth
int power = 6; // switcher Bluetooth
int ch1 = 2; // canal timon entrada desde Rx
int ch4 = 4; // canal motor entrada desde Rx
int ch2 = 14; // canal 2 Sonido P-14 entrada desde Rx
int ch3 = 15; // canal 3 Luces entrada desde Rx
int ch5 = 16; // canal 5 tlt bb entrada desde Rx
int ch6 = 17; // canal 6 tlt stb entrada desde Rx
Servo Lurssen_bb; // 3
Servo Lurssen_stb; // 5
int bb; // Lurssen, valor para el servo
int stb; // Lurssen, valor para el servo
Servo TLT_bb; // 10, portilla bb
Servo TLT_stb; // 11, portilla stb
int pos_bb = 750; // variable para apertura lenta
int pos_stb = 750; // variable para apertura lenta
int T_bb_los=12; // 12, electrovalvula
int T_stb_los=13; // 13, electrovalvula
int luces = 7;
int P_14 = 9;
//
void setup ()
{
Serial.begin(9600);
pinMode(ch1,INPUT); // Timon entrada 2
pinMode(ch4,INPUT); // Motor entrada 4
pinMode(ch2,INPUT); // canal 2 entrada 14 P-14
pinMode(ch3,INPUT); // canal 3 entrada 15 luces
pinMode(ch5,INPUT); // canal 5 entrada 16 tlt bb
pinMode(ch6,INPUT); // canal 6 entrada 17 tlt stb
Lurssen_bb.attach(3);
Lurssen_stb.attach(5);
TLT_bb.attach(10); // Portilla bb
TLT_stb.attach(11); // Portilla stb
pinMode(12, OUTPUT); // T_bb_los
pinMode(13, OUTPUT); // T_stb_los
pinMode(7, OUTPUT); // Luces
pinMode(9, OUTPUT); // P_14
pinMode(6,OUTPUT); // switcher Bluetooth
}
void loop()
{
//
//switcher bluetooth
//
if(Serial.available()) //if there is data being recieved
{
blueToothVal=Serial.read(); //read it
}
if (blueToothVal=='1') //
{
digitalWrite(power,HIGH); //
Serial.println(" =S-113 is on."); //
}
else if (blueToothVal=='0') //
{
digitalWrite(power,LOW); //
Serial.println(" =S-113 is off."); //
}
//
// Lurssen
//
ch1 = pulseIn(2,HIGH);// lee la posicion de timon, entre 960 y 1930 microsegundos PWM
ch4 = pulseIn(4,HIGH);// lee la velocidad, entre 1630 y 1960
bb = map(ch4,1630,1960,1900,900); // en funcion de la velocidad
stb = map(ch4,1630,1960,1100,2100); // en funcion de la velocidad
//Serial.print(bb); // Lurssen
//Serial.print(" / ");
//Serial.print(stb); // Lurssen
//Serial.println();
// stop
if (((ch4 >= 1760) && (ch4 <= 1820)) && ((ch1 >= 960) && (ch1 <= 1930))) // timon en cualquier posicion
{
Lurssen_bb.writeMicroseconds(ch1); //timon bb al valor timon
Lurssen_stb.writeMicroseconds(ch1); //timon stb al valor timon
}
// marcha atras
if ((ch4 <= 1670) && ((ch1 >= 960) && (ch1 <= 1930))) // timon en cualquier posicion
{
Lurssen_bb.writeMicroseconds(ch1); //timon bb al valor timon
Lurssen_stb.writeMicroseconds(ch1); //timon stb al valor timon
}
// adelante bb, Lurssen off
if ((ch4 >= 1790) && (ch1 < 1400)) // timon bb
{
Lurssen_bb.writeMicroseconds(ch1); //timon bb al valor timon
Lurssen_stb.writeMicroseconds(ch1); //timon stb al valor timon
}
// adelante stb, Lurssen off
if ((ch4 >= 1790) && (ch1 > 1500)) // timon stb
{
Lurssen_bb.writeMicroseconds(ch1); //timon bb al valor timon
Lurssen_stb.writeMicroseconds(ch1); //timon stb al valor timon
}
// adelante recto , Lurssen on
if ((ch4 >= 1830) && (ch1 <= 1460)) // timon recto
{
Lurssen_bb.writeMicroseconds(bb); //timon bb al valor mapeado en velocidad
Lurssen_stb.writeMicroseconds(stb); //timon stb al valor mapeado en velocidad
}
//
// programa switches
//
ch2 = pulseIn(14,HIGH);
ch3 = pulseIn(15,HIGH);
ch5 = pulseIn(16,HIGH);
ch6 = pulseIn(17,HIGH);
TLT_bb.writeMicroseconds(750);
TLT_stb.writeMicroseconds(750);
// luces
if (ch3 < 1200)
{
digitalWrite(luces, HIGH);
}
if (ch3 >= 1200)
{
digitalWrite(luces, LOW);
}
// P-14
if (ch2 < 1000)
{
digitalWrite(P_14, HIGH);
}
if (ch2 >= 1000)
{
digitalWrite(P_14, LOW);
}
//apertura TLT bb y los!.
if (ch5 < 1000)
{
for(pos_bb = 750; pos_bb < 1600; pos_bb += 1)
{
TLT_bb.writeMicroseconds(pos_bb);
delay(15);
}
delay(5000);
digitalWrite(T_bb_los, HIGH);
delay(1000);
digitalWrite(T_bb_los, LOW);
}
// cierre de portilla TLT bb
if ((ch5 >= 1490) && (ch5 <= 1510))
{
for(pos_bb = 1600; pos_bb >= 750; pos_bb -= 1)
delay(15);
{
TLT_bb.writeMicroseconds(pos_bb);
}
}
// solo apertura TLT bb
if (ch5 > 1610)
{
for(pos_bb = 750; pos_bb < 1600; pos_bb += 1)
delay(15);
{
TLT_bb.writeMicroseconds(pos_bb);
}
}
// apertura TLT stb y los!.
if (ch6 < 1000)
{
for(pos_stb = 750; pos_stb < 1600; pos_stb += 1)
{
TLT_stb.writeMicroseconds(pos_stb);
delay(15);
}
delay(5000);
digitalWrite(T_stb_los, HIGH);
delay(1000);
digitalWrite(T_stb_los, LOW);
}
// cierre de portilla TLT stb
if ((ch6 >= 1490) && (ch6 <= 1510))
{
for(pos_stb = 1600; pos_stb >= 750; pos_stb -= 1)
delay(15);
{
TLT_stb.writeMicroseconds(pos_stb);
}
}
// solo apertura TLT stb
if (ch6 > 1610)
{
for(pos_stb = 750; pos_stb < 1600; pos_stb += 1)
delay(15);
{
TLT_stb.writeMicroseconds(pos_stb);
}
}
//Serial.print(ch1); // en el 2
//Serial.print(" / ");
//Serial.print(ch2); //en el 14
//Serial.print(" / ");
//Serial.print(ch3); // en el 15
//Serial.print(" / ");
//Serial.print(ch4); // en el 4
//Serial.print(" / ");
//Serial.print(ch5); // en el 16
//Serial.print(" / ");
//Serial.print(ch6); // en el 17
//Serial.print(" / ");
//Serial.println();
delay(500);
}