Apoyo para L298N + PAP + bluetooth

Estoy haciendo un simulador de montaña rusa en VR con unity3d y arduino para android por bluetooth
utilizo el L298N porque me es muy practico. Y nema 23 10kg/cm
osea que son 2 L298N y 2 PAP

desde unity envio las coordenadas de movimiento Y: e X: por bluetooth al arduino
El X: es hacia adelante o atrás y el Z: es hacia derecha e izquierda
hasta ahi todo perfecto lo que no he podido hacer y ahi el apoyo que necesito es como hacer que las coordenadas enviadas
por ejemplo "X: 10" que la traduzca el arduino en movimientos y mueva el motor 10 grados (o pasos) hacia un lado o el otro segun corresponda

Espero que me puedan guiar y desde ya muchas gracias

Y que buscaste?
Porque como ya dije, Stepper + L298 hay 2 millones de tutoriales. La libreria stepper disponible, con ejemplos.
No debería darte problemas.

Unity3d envia coordenadas via BT al arduino que las recibe como puerto serie, de modo que tienes X, Y disponibles para que se muevan los stepper.

En principio no debería darte problemas, repito.

Comienza por dominar los stepper, usando el ejemplo, simple. Luego usa dos.
Ajusta tu rutina para poder enviar comandos similares a los que enviará Unity3d via monitor Serie.

Luego incorporas el modulo BT y mas o menos listo.

por supuesto que hay miles de tutoriales pero no encontre nada de lo que necesito
logre armar esto pero no es lo que realmente necesito que haga el arduino

#include <Stepper.h>
int input;
const int stepsPerRevolution = 48;  // cambie este valor por el numero de pasos de su motor
const int stepsPerRevolution1 = 24;
Stepper motorDerecho(stepsPerRevolution, 12,11,10,9);            
Stepper motorIzquierdo(stepsPerRevolution, 8,5,6,3);
void setup() {
  motorDerecho.setSpeed(190);
  motorIzquierdo.setSpeed(190);
    Serial.begin(9600);
}
void loop() {
  if(Serial.available()>0){ 
  input=Serial.read(); 
  if(input=='1'){ 
    // gira media vuelta en una direccion
   Serial.println("GIRA DERECHA");
  motorDerecho.step(-stepsPerRevolution1);
  motorIzquierdo.step(-stepsPerRevolution1);
  delay(150);
  motorDerecho.step(stepsPerRevolution1);
  motorIzquierdo.step(stepsPerRevolution1);
  }
    if(input=='2'){
   // gira media vuelta en la otra direccion
  Serial.println("GIRA IZQUIERDA");
  motorDerecho.step(stepsPerRevolution1);
  motorIzquierdo.step(stepsPerRevolution1);
  delay(150); 
  motorDerecho.step(-stepsPerRevolution1);
  motorIzquierdo.step(-stepsPerRevolution1);
}
if(input=='3'){
   // cabecea hacia abajo
  Serial.println("ADELANTE");
  motorDerecho.step(stepsPerRevolution1);
  motorIzquierdo.step(-stepsPerRevolution1);
  delay(500);
  motorDerecho.step(-stepsPerRevolution1);
  motorIzquierdo.step(stepsPerRevolution1);
}
if(input=='4'){
   // cabecea hacia arriba
  Serial.println("ATRAS");
  motorDerecho.step(-stepsPerRevolution1);
  motorIzquierdo.step(stepsPerRevolution1);
  delay(500);
  motorDerecho.step(stepsPerRevolution1);
  motorIzquierdo.step(-stepsPerRevolution1);  
}
  }
  }

NOTA. Espero haber puesto bien el codigo

Las coordenadas que llegan de unity (android) son por ejemplo
X: 100
Y: 25
Z: 44

No se si me explico bien

Para graficarlo mejor seria algo asi pero en vez de un MPU serian los datos que llegan por el bluetooth
ejemplo

Ahora te comprendo.
Si una stepper tiene 48 pasos por ejemplo como en tu caso, entonces tienes un stepper POBRE
1 revolución 360 grados
o sea que 360 grados = 48 pasos

cada paso serán 360/48 = 7.5 grados

El tema es como poder interpretar las coordenadas, la verdad que no encontre nada de eso, antes de hacer el post me puse a buscar pero no encontre nada que me guie

Tus coordenadas en que sistema estan? Cartesiano?
Sistema de coordenadas, hay cartesiano, cilindricas y esféricas.

solo son grados de inclinacion de un objeto en espacio/tiempo

Bueno, supongamos que sean grados y no tengo porque dudar, pinta entonces que estas en coordenadas esféricas. Solo para darle un marco de referencia.

Si tu motor stepper solo da 48 pasos por revolucion tienes un problema. Tendría que ser digamos de algo mas de 360 pasos
Soluciones, pasarlo si es posible a micropasos.

Que motor PAP usas?
Busca las especificaciones

El A4988 O DRV8825 permiten microstepping

El A4988 te aumenta en 16 los pasos o sea si fueran 48 y parto de tu ejemplo tendrías 48 x 16 = 768 por lo que 360/768 = 0,46875 grados x paso o sea.. ahi estas bien

EL DRV8825 va a 32 microsteps por lo que tendrias 360/(48x32) = 0,234 grados x paso.

Con cualquiera de los dos estarías mas que bien.

Si quieres que se mueva 100 grados solo calculas cuantos pasos necesitas

0.234 grados == 1 paso
100 grados === X pasos => 100/0.234= 426 pasos

Una simple cuenta para cada stepper y ya

un ejemplo sencillo

#include <Stepper.h>
int input;
const int stepsPerRevolution = 48;
Stepper motor(stepsPerRevolution, 12,11,10,9);
void setup() {
motor.setSpeed(190);
Serial.begin(9600);
}
void loop() {
if(Serial.available()>0){ 
input=Serial.read(); 
if(input=='1'){ 
Serial.println("GIRA DERECHA");
motor.step(-stepsPerRevolution);
} 
} 
}

Como hacer para que se pueda usar por ejemplo Y:15 en vez de 1

if(input=='1'){

que quede

if(input=='Y:15'){

ya con eso me conformaria y podria hacer un codigo no profesional pero si funcional

Esta respondido

mm donde no lo veo solo veo datos de micropasos de los motores que no es un problema, mi problema esta como hacer que la cordenada por ejemplo Y:15 la tome el arduino para convertirla en movimiento como el ultimo ejemplo que puse

Poca ideas y poca ayuda pero gracias igual a seguir buscando por otro lado

Leiste el post#8?

Bueno no se que driver vas a usar. Necesitas saber cuantos pasos tiene tu stepper cosa que aun no has respondido.
Supongamos que con un driver DRV8895 tenes ahora Pasos de tu PAP = 48 pusiste pero ajustalo al que tengas.
Con microstepping multiplicas x 32 => 48 x 32 = 1536 micropasos.

Una vuelta tiene 360 grados y una revolución de motor se hace con 1536 micropasos.
entonces 360 grados/1536 = 0,234375 grados/micropaso

o al revés porque veo que eso te complica

Es una regla de 3 simple

360 --------- 1536
100 --------- X = 100 x 1536/360 = 426 o sea que siempre tienes un factor K = 1536/360 = 4.2666

daras 4.266 micropasos x grado

estas en 100 y queres ir a 102 entonces daras 2 x 4.266 micropasos

Ahora si?
Te lo explico para un eje, los demas son iguales.

Explica esto por favor!!

Poca ideas y poca ayuda pero gracias igual a seguir buscando por otro lado

Que significa esto?

Hola disculpame que vuelva a decirte lo mismo los pasos de los motores es lo de menos sigo sin poder ingresar las coordenadas ejemplo X:10 lo de los motores y los driver es lo de menos para que invertir en otra cosa si no puedo solucionar esta, me entendiste ahora

y respondiendo a tu pregunta

Significa lo que significa, si no es el moderador nadie da una idea de que funcion deberia de utilizar, solo ha comentado sobre los pasos del motor que lo agradezco mucho pero no es por lo que cree el post

Pero eso es un simple manejo de lo que estas recibiendo

if(Serial.available()>0){ 
input=Serial.read();

Ahi recibis de aun char pero tenes que esperar a armar toda la información empezando por tu caracter estrella que es ':' asi que esperas eso y luego, tenes que armar un entero formado por al menos 1,2 o 3 chars porque no sabes que coordenada te envia, si 3 grados 30 o 330 por dar ejemplos.

Entonces

// define 
bool flag = false;
byte cont = 0;
int coord = 0;

// luego en tu loop

          if (Serial.available()>0){ 
            input=Serial.read(); 
            if (input = ':') {
                flag = true;
                cont = 0;
                coord = 0;
            }
            if (flag) {
               coord += input*(10^cont);
               cont++;
            }
            // hay que detectar el corte del número
            // desactivar el flag para que no siga actuando y tendras una coordenada en grados disponible

Es una aproximación

Ve a Documentación, Indice de temas tutoriales (1er hilo), y busca Puerto Serie, verás varios tutoriales de Noter y Metaconta que te daran buena idea.
Si buscas en Google hay algo muy bueno de Nick Gammon.

fernando3110:
y respondiendo a tu pregunta

Significa lo que significa, si no es el moderador nadie da una idea de que funcion deberia de utilizar, solo ha comentado sobre los pasos del motor que lo agradezco mucho pero no es por lo que cree el post

Pues Fernando tienes un problema, pusiste tu consulta el dia 20/02 y hoy es 21/02, hay algo que se llama tener paciencia, y debes esperar a que alguien responda a su tiempo, cuando lea tu pregunta, en su zona horaria, etc, etc.

surbyte:
Pero eso es un simple manejo de lo que estas recibiendo

if(Serial.available()>0){ 

input=Serial.read();




Ahi recibis de aun char pero tenes que esperar a armar toda la información empezando por tu caracter estrella que es ':' asi que esperas eso y luego, tenes que armar un entero formado por al menos 1,2 o 3 chars porque no sabes que coordenada te envia, si 3 grados 30 o 330 por dar ejemplos.

Entonces 



// define
bool flag = false;
byte cont = 0;
int coord = 0;

// luego en tu loop

if (Serial.available()>0){
            input=Serial.read();
            if (input = ':') {
                flag = true;
                cont = 0;
                coord = 0;
            }
            if (flag) {
              coord += input*(10^cont);
              cont++;
            }
            // hay que detectar el corte del número
            // desactivar el flag para que no siga actuando y tendras una coordenada en grados disponible



Es una aproximación 

Ve a Documentación, Indice de temas tutoriales (1er hilo), y busca Puerto Serie, verás varios tutoriales de Noter y Metaconta que te daran buena idea.
Si buscas en Google hay algo muy bueno de Nick Gammon.

MUCHISIMAS GRACIAS este tipo de aporte era el que necesitaba, ahora a leer mucho y a tomar mucho migral porque me va a explotar la cabeza jaja SALUDOS

Ojo que le falta.. no se como termina lo que estas recibiendo... por si hay un caracter de fin de comando
Busca eso que es importante para darle un corte a cada lectura
No se si recibis asi
X: 100
Y: 25
Z: 44
lo que implica que hay un LineFeed y/o Carriage Return
eso son un comando 0x10 y otro 0x13 que no se ven si los imprimis pero si podes verlo si imprimis asi

Serial.print(input, HEX);
Eso mostrará todo lo que estas recibiendo.
Identifica como termina recibiendo los comandos y de ahi cerramos cada coordenada