[Ayuda] mover 3 servos por bluetooth con acererometro

Saludos!
Como todo novato vengo en busca de ayuda, quiero realizar un proyecto de brazo robotico controlado por android y arduino por medio del modulo HC-05 y el sensor de acelerometro del celular. Hasta el momento con el siguiente codigo consigo mover un servo con el eje x, pero mi pregunta es como seria el codigo para mover 3 servos por los ejes X Y Z?

Muchas gracias o alguna pagina donde me expliquen un poco.

#include <Servo.h>

Servo servoX;
int aceleroX;

void setup()  {
  Serial.begin(9600);
  Serial.setTimeout(5);
  servoX.attach(9);
}

void loop()  {
  if(Serial.available()>0){
  aceleroX=Serial.parseInt();
  if(aceleroX>-95&&aceleroX<95){
    aceleroX=map(aceleroX,-95,95,0,180);
    servoX.write(aceleroX);
    }
  }
}

Podrias hacer que el primer caracter de la orden que envias por bluetooth fuese una letra o numero que identificara el servo que quieres mover.luego en el sketch con un if o switch evaluar ese primer caracter y asignar el movimiento al servo correspondiente.

Me puedes indicar como realizo estas instrucciones? Gracias

Simple a tu programa en Android le agregas esto Xaaa Ybbb Zccc donde aaa es la posicon X bbb es la posicon Y ccc es la posicon Z terminas enviando esto Xaaa Ybbb Zccc por cada vez que hayas decidido hacerlo

Luego en el Arduino debes separar como dijo jose esa cadena y luego de detectar X, Y, y Z en la cadena obtener aaa, bbb y ccc Con esos datos ya sabes que hacer.

Ahora mejor?

Tal como dice surbyte esa es la idea,pero tendras que adaptar la aplicacion del mobil para cambiar el formato de lo que envias a arduino y en el sketch el parseint() no te funcionara bien ya que ignora los caracteres no numericos y una vez empieza a recibir numeros acaba en cuanto se encuentra con un caracter no numerico.

Seria algo asi (seguro que se puede mejorar es solo una idea) :

int valor;
char letra;
void setup(){
  //Aqui defines tres servos diferentes
  Serial.begin(9600);
}
void loop(){ 
  if(Serial.available()){
    letra = Serial.read();
    if ( ! isdigit(letra)) {
      valor = Serial.parseInt();
      switch (letra) {
        case 'x':
          Serial.print("Mover servo x a posicion:");
          Serial.println(valor);
         //Mover servo x a posicion almacenada en valor
          break; 
        case 'y':
          Serial.print("Mover servo y a posicion:");
          Serial.println(valor);
          //Mover servo y a posicion almacenada en valor
          break;
        case 'z':
          Serial.print("Mover servo z a posicion:");
          Serial.println(valor);
         //Mover servo z a posicion almacenada en valor
          break;  
      }    
    } 
  }  
}

Si lo pruebas en el monitor serial ,veras que solo responde a cadenas tipo x122,y100,z12,etc etc .Si en la aplicacion mobil estas usando un evento que se produce cada vez que cambias la inclinacion del mobil piensa que este evento podria pasar muchas veces en un segundo con la velocidad de proceso de los mobiles actuales con lo cual se puede saturar la comunicacion o perder datos.Lo ideal seria enviarle la nueva posicion al arduino solo cada x intervalo de tiempo.

Saludos

Alli jugando un poco lo plantee de una manera diferente, tienes que enviar los tres valores separados por un caracter no numerico que puede ser una coma Ejemplo. 123,456,789

int x=0, y =0, z=0;
boolean stringComplete= false;


void setup(){
  Serial.begin(115200);
}

void loop(){
  if(stringComplete==true){
    Serial.println();
    Serial.print("X: \t");    Serial.println(x);
    Serial.print("Y: \t");    Serial.println(y);
    Serial.print("Z: \t");    Serial.println(z);    
    stringComplete=false;
  }
}

void serialEvent() {
    x= Serial.parseInt();
    y= Serial.parseInt();
    z= Serial.parseInt();
    stringComplete = true;
}

Faltan cosas no? Tal como esta escrito no haria nada ya que no hay llamadas a la funcion serialevent y a la variable stringcomplete le das un valor false y por lo tanto nunca ejecuta el contenido del bloque if.

Saludos.

El Serialevent es una interrupción que se llama automáticamente cuando recibe por el puerto serial, pruebalo y confirma

En este sketch va a separar los valores de x , y i z si se separan con coma, y como es una interrupción no se pierde tiempo revisando el puerto serie esperando datos, sino que el loop puede ocuparse de otras cosas y cuando lleguen datos al puerto serie deja lo que esta haciendo atiende la recepción de datos y continua con lo que estaba haciendo.

Desconocia esa funcion ,tienes razon,aunque por lo que he leido en la referencia no es exactamente una interrupcion si no que se ejecuta en cada loop por lo que si el loop tardara 10 segundos en ejecutarse (ya se que es mucho) esa seria la frecuencia con la que se leeria el buffer de entrada.

No me he informado bien. En los pics hay una interrupcion dedicada al usart peri no se si los atmega la tienen.

Pues por lo que se deduce de la referencia, sí que es una interrupción y funciona tal y como dice max_saeta.

noter: Pues por lo que se deduce de la referencia, sí que es una interrupción y funciona tal y como dice max_saeta.

yo no lo veo asi.si ejecutas este sketch veras que aunque mandes un caracter por el serial monitor en cuanto lo ejecutes ,el mensaje de print te saldra cuando acabe el delay de 20 segundos no en el momento en que mandes el caracter por el serial.

void setup(){
  Serial.begin(9600);
}
void loop(){
  delay(20000);
    
}  
void serialEvent(){
    Serial.println("Dato recibido");
 }

Pues, efectivamente, tienes toda la razón, jose. ¿En qué parte de la referencia lo has visto? ¿Puedes poner link? porque la referencia que he visto yo no hace mención a eso. Me gustaría conocer el mecanismo que utiliza para "encadenarse" al loop. Pensé que esa función era llamada por la propia ISR del puerto, pero ya veo que no. Si antes tenía poco sentido utilizar serialEvent, con esto ya creo que no apaorta absolutamente ninguna ventaja. Saludos.

Aqui: http://arduino.cc/en/Tutorial/SerialEvent en los comentarios del ejemplo explica como funciona.