Automóvil Teledirigido

Saludos a todos,

Hace relativamente poco que empecé con el montaje de un coche "bueno" (con ESC y un servo) por radiocontrol, con la intención de poder manejarlo desde un dispositivo iOS mediante un módulo bluetooth y una placa Arduino UNO. El problema de tal montaje reside en que en Internet solo hay programaciones sobre coches sin ESC ni servomotores que controlen la aceleración y la dirección respectivamente, por lo que su programación me está costando mucho. Encontré una página web (http://pingpollos.com/category/tecnologia/page/2/) en la cual se empezó con un montaje idéntico al mío, pero se dejó a medio terminar, por lo que no sé como seguir. En dicha página web se trabaja con la primera versión de una sketch*, pero al ser una primera versión se sigue controlando el vehículo mediante un emisor normal, por lo que mi propósito no tiene en tal página su solución.
Me he decantado por preguntar en este foro, porque me he pateado cientos de webs sin ningún resultado esperanzador, por lo que os pregunto mis dudas:

·¿Qué le falta al código para poder usarlo vía bluetooth?
·¿Es factible realizarlo mediante iOS o es mejor utilizar Android?
·¿Veis posible el control o mejor me decanto por utilizar el mando de la PS3?

Gracias de antemano.

Atentamente

*(Dropbox - Error)

Para comenzar tu link no conduce a nada http://pingpollos.com/category/tecnologia/page/2/.
Este en cambio parece ser el que querías referirnos Coche RC Android / Arduino. Parte IV (Arduino). Esta es la parte IV

Luego porque no vas desdoblando tu problema en tareas simples.
SI el problema es el BT porque no intentas un sketch simple que lo use.
Es como conectar Arduino via el monitor serie y leer datos por este, es muy fácil, luego que lo hagas, coloca el BT y mejora el programa para que lea desde el BT. Claro que esto implica que tu Celular tenga una aplicacion que envie comandos.

Asi ya tienes el enlace funcionando.
Luego a trabajar con los motores… lo resuelves y finalmente unes todo.

Muestra el sketch que tienes pero mi forma de trabajar es por partes.

Por lo que explicas tienes muchas dudas entonces plantearse semejante proyecto siempre crea muchos problemas

Bueno mirando mejor hay un código que pego para que sirva como guia futura

/*
   Autor: Mocosos
   Versión: 1.0
   
   Primera versión del software para controlar un coche RC.
   
 */
#include <Servo.h>
#define CANAL_DIRECCION 7   //El cable del puerto de datos del canal 1 del receptor debemos conectarlo al pin 7
#define CANAL_ACELERADOR 4  //El cable del puerto de datos del canal 2 del receptor debemos conectarlo al pin 4
#define SERVO_ACELERADOR 3  //El cable del puerto de datos del ESC debemos conectar al pin 3
#define SERVO_DIRECCION 5   //El cable del puerto de datos del Servo de dirección debemos conectar al pin 5

int ch1; // Lectura en bruto de lo que recibimos por el canal 1 (Dirección)
int ch2; // Lectura en bruto de lo que recibimos por el canal 2 (Acelerador)

int ordenDireccion = 0; // Valor mapeado 0 - 180 que enviamos al servo de la dirección (1 - 89 Izquierda. 91 - 179 Derecha)
int ordenAcelerador = 0; // Valor mapeado 0 - 180 que enviamos al variador del motor. (1 - 89 Atrás. 91 - 179 Avanzar)
int armado = 0; // Variable para detectar si hemos armado el variador del motor principal. 0 = No armado. 1 = Armado
int sentido = 0; //0 = parado 1 = Avanzar. 2 = Retroceder 

Servo servoDireccion;  // crea un objeto tipo servo para controlar el servo de la dirección
Servo servoAcelerador;  // crea un objeto tipo servo para controlar el variador del motor



void setup() {

  pinMode(CANAL_DIRECCION, INPUT); // Seteamos el pin 7 tipo Entrada de datos
  pinMode(CANAL_ACELERADOR, INPUT); // Seteamos el pin 4 tipo Entrada de datos
  
  servoAcelerador.attach(SERVO_ACELERADOR); //liga el variador conectado en el pin 3 al objeto servo
  servoDireccion.attach(SERVO_DIRECCION);  // liga el servo conectado en el pin 5 al objeto servo
  
  Serial.begin(9600);

}

void loop() {
  
  ch1 = pulseIn(CANAL_DIRECCION, HIGH); // leemos el pulso del canal 1. Dirección
  ch2 = pulseIn(CANAL_ACELERADOR, HIGH); // leemos el pulso del canal 2. Acelerador
  
  //Mapeamos las lecturas de ambos canales para que adopten valores apropiados para el objeto servo 0 - 179
  ordenDireccion = map(ch1, 850, 1835, 0, 179);
  ordenAcelerador = map(ch2, 890, 1855, 0, 179);
  
  //Comprobamos si se ha realizado o no el armado.
  if (armado == 0){
    arm(); //Lanzamos el proceso
  }  
  
  //Implementamos dirección
    if (armado == 1 && (ordenDireccion < 80) || (ordenDireccion > 90)){//Enviamos datos sólo si el proceso de armado se ha realizado y descartamos un margen de error de 10 unidades.
      servoDireccion.attach(SERVO_DIRECCION);
      if (ordenDireccion > 0 && ordenDireccion < 179){//Evitamos valores negativos.    
        servoDireccion.write(ordenDireccion);//Giramos el servo.
      } 
    }else{
     servoDireccion.write(90); //Enviamos a posición central  
     servoDireccion.detach();  //Desconectamos servo.
     //Serial.println("5");   
    }
  
  //Implementamos acelerador
  
    if (armado == 1 && (ordenAcelerador > 95 && ordenAcelerador < 179)){ //Confirmamos armado y sentido avanzar

      if (sentido == 1 || sentido == 0){//Evitamos avanzar si estábamos retrocediendo para evitar daños en la mecánica
        servoAcelerador.write(ordenAcelerador); //Avanzamos
        sentido = 1;
      }else{ //Si el usuario intenta hacer un cambio de sentido primero frenamos y esperamos.
        servoAcelerador.write(90); 
        sentido = 0;
        delay(500);    
      }
    }else if (armado == 1 && (ordenAcelerador  < 85 && ordenAcelerador > 0)){//Confirmamos armado y sentido retroceder
      
      if (sentido == 2 || sentido == 0){//Evitamos retroceder si estábamos avanzando para evitar daños en la mecánica
        Serial.println(sentido); 
        servoAcelerador.write(ordenAcelerador); 
        sentido = 2;
      }else{//Si el usuario intenta hacer un cambio de sentido primero frenamos y esperamos.
        servoAcelerador.write(90); 
        sentido = 0;   
        delay(500);
      }
      
    }else{//No hay ordenes.
      sentido = 0; 
      Serial.println(sentido);
      servoAcelerador.write(90);
    }  
  
}//Fin del bucle

//Función para armar el ESC
void arm(){
  if (ordenAcelerador > 85 && ordenAcelerador < 95){  
    servoAcelerador.write(90);
    delay(2000);
    Serial.println("Armado");
    delay(1000);
    armado = 1;
  }
}

Muchas gracias surbyte por responder. Como tu ya has mencionado anteriormente, estoy intentando descomponer la sketch principal en varias pequeñas para poder luego trabajar con todas las partes. En la sketch del servomotor no surge ningún problema, porque ya hay mucha información en Internet, pero como de programación se bastante poco he intentado programar el ESC como otro servomotor, sin saber si es del todo correcto. Dejo aquí la sketch del ESC por si hay algún error visible.

Gracias de antemano.

Atentamente

#include <Servo.h>

int velocidad = 0; 

Servo ESC; 

void setup() {

  ESC.attach(9);    
  Serial.begin(9600);    
  Serial.setTimeout(5);
}

void loop(){
 if(Serial.available()>0)
 { 
    velocidad = Serial.parseInt();    
     if(velocidad >100 && velocidad <280)
     {
       velocidad = map(velocidad, 100, 280, 0, 180);
       ESC.write(velocidad);
     }
 }
}

Por si a alguien le interesa, he conseguido controlar el ESC cambiando un poco el código subido anteriormente. He decidido manejarlo desde un dispositivo Android que es mucho más fácil.
Gracias de antemano.

Atentamente

#include <Servo.h>

int velocidad = 10; 

Servo ESC; 

void setup() {

  ESC.attach(9);    
  Serial.begin(9600);    
  Serial.setTimeout(5);
}

void loop(){
 if(Serial.available()>0)
 { 
    velocidad = Serial.parseInt();    
     if(velocidad >0 && velocidad <20)  //He puesto 20 porque lo controlo desde un smartphone
     {
       velocidad = map(velocidad, 0, 20, 0, 179);
       ESC.write(velocidad);
     }
 }
}