Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Prototipo robot
#41
Buenas a tod@s:

He probado que después del tiempo que están en marcha los motores, pues pararlos, pero da lo mismo. Entra en el resto de if's T.T
Citar
#42
No he leido el codigo pero...no puedes poner en vez de if que haga un switch
Citar
#43
Buenas a tod@s:

Pero si hago un switch en teoria el valor tiene que ser uno en concreto, no? Yo no tengo un valor en concreto para activar una orden u otra, sino siempre que sea mayor una distancia respecto a las otras, activará una u otra orden. Lo había pensado lo del switch pero claro... el problema que veo es este, que el switch te pide un valor determinado. O me equivoco???
Citar
#44
En principio necesitas un valor fijo.
Citar
#45
Buenas a tod@s:

A parte, Jero, el switch compara una variable en cada switch i en función del valor que tome, escojerá el case 1, case 2 o el case n. Pero si tengo 3 variables tampoco me sirve, no?
Citar
#46
axisgar escribió:No he leido el codigo pero...no puedes poner en vez de if que haga un switch
Existe en arduino el elseif?

El else se que existe, pero al tener 4 movimientos tendria que ser con else if.

Saludos
Citar
#47
Has probado asi?

Código:
if (distancia1>=distancia2)
{
if (distancia1>=distancia3)
{
digitalWrite (IN4, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN1, HIGH);
  delay (1000);
}
}
if (distancia2>=distancia1)
{
if (distancia2>=distancia3)
{
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  digitalWrite (IN1, HIGH);
  delay (500);
}
}


if (distancia3>=distancia2)
{
if (distancia3>=distancia1)
{
digitalWrite (IN4, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
  delay(500);
}
}

if (distancia2 <= 5)
  {
      digitalWrite (IN4, HIGH); //Va hacia atrás
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
  delay(500);
  }
Citar
#48
Buenas a tod@s:

Lo voy a probar y os digo algo Sonrisa
Citar
#49
Buenas a tod@s:

Pues hace adelante y hacia atrás solo :S

La verdad es que ahora quería hacerlo de una forma similar a la que has propuesto tí axisgar. Pero si tampoco funciona.... :S

A ver si esta noche consultandolo con la almohada se me viene alguna idea en la cabeza.
Citar
#50
Prueba esto:

Código:
long Distancia

if (distancia1 >= distancia2 && distancia1 >= distancia3)  Distancia=1;
if (distancia2 >= distancia1 && distancia2 >= distancia3)  Distancia=2;
if (distancia3 >= distancia1 && distancia3 >= distancia2)  Distancia=3;
if (distancia2 <= 5) Distancia=4;

switch (Distancia) {
  case 1:            
      digitalWrite (IN4, HIGH);
      digitalWrite (IN3, LOW);
      digitalWrite (IN2, LOW);
      digitalWrite (IN1, HIGH);
      delay (500);
    break;
  case 2:            
      digitalWrite (IN4, LOW);
      digitalWrite (IN3, HIGH);
      digitalWrite (IN2, LOW);
      digitalWrite (IN1, HIGH);
      delay (1000);
    break;
  case 3:            
      digitalWrite (IN4, LOW);
      digitalWrite (IN3, HIGH);
      digitalWrite (IN2, HIGH);
      digitalWrite (IN1, LOW);
      delay(500);
      break;
  case 4:            
      digitalWrite (IN4, HIGH); //Va hacia atrás
      digitalWrite (IN3, LOW);
      digitalWrite (IN2, HIGH);
      digitalWrite (IN1, LOW);
      delay(500);
    break;
  }
Citar
#51
Buemas a tod@s:

Qué va!!! Facepalm Igual que antes :nuse: Ahora solo va hacia atrás.

No sé... voy a dejarlo enfriar esta noche... y a ver si mañana se me ocurre algo y lo pruebo. Pero es que se lo he enseñado a un par de amigos y tampoco ven nada raro. Uno me ha preguntado si a lo mejor el problema no está en los if's, pero ya le he dicho que las medidas tomadas són correctas (dentro del posible margen de error).

Es que me joden esos problemas, que cuando justo ya lo tienes, patapam, te quedas encallado en algo tan tonto como es el software T.T

Por supuesto, muchas gracias por vuestras aportaciones y consejos, que por supuesto los tengo mucho en cuenta :aplauso: :aplauso: :aplauso:
Citar
#52
axisgar escribió:Prueba esto:

Código:
long Distancia

if (distancia1 >= distancia2 && distancia1 >= distancia3)  Distancia=1;
if (distancia2 >= distancia1 && distancia2 >= distancia3)  Distancia=2;
if (distancia3 >= distancia1 && distancia3 >= distancia2)  Distancia=3;
if (distancia2 <= 5) Distancia=4;

switch (Distancia) {
  case 1:            
      digitalWrite (IN4, HIGH);
      digitalWrite (IN3, LOW);
      digitalWrite (IN2, LOW);
      digitalWrite (IN1, HIGH);
      delay (500);
    break;
  case 2:            
      digitalWrite (IN4, LOW);
      digitalWrite (IN3, HIGH);
      digitalWrite (IN2, LOW);
      digitalWrite (IN1, HIGH);
      delay (1000);
    break;
  case 3:            
      digitalWrite (IN4, LOW);
      digitalWrite (IN3, HIGH);
      digitalWrite (IN2, HIGH);
      digitalWrite (IN1, LOW);
      delay(500);
      break;
  case 4:            
      digitalWrite (IN4, HIGH); //Va hacia atrás
      digitalWrite (IN3, LOW);
      digitalWrite (IN2, HIGH);
      digitalWrite (IN1, LOW);
      delay(500);
    break;
  }

Así es como me refería. Crear una variable nueva de distancia o movimiento.
Citar
#53
Solo para atrás??

Y esta alejado mas de 5 cm de algún obstáculo?

Has probado a quitar el ultimo switch el de marcha atrás? A ver como se comporta?
Citar
#54
Buenas a tod@s:

Ahora he probado el último codigo que hiciste, y anulando la opción de la marcha atrás. Nada!!! Mide y solo mide. Pero ni tan solo se mueve. Creo que voy a hacer borrón y cuenta nueva y lo haré de algun otro modo.

No puede ser tan difícil!!!
Citar
#55
Prueba a imprimir por serial las 3 medidas, una vea estén escaneadas las 3 a ver si son correctas. En principio el código parece correcto.
Citar
#56
Que no haya problemas de que se sobreescriban las variables de distancias.
Citar
#57
Buenas a tod@s:

Desde un buen principio he descartado el tema de distancias ya que siempre lo he comprobado con el Serial. Y por eso siempre he ido diciendo, que, salvando el posible error de precisión, las distancias parecían correctas.

A parte va haciendo:

Distancia 1: XX

Distancia 2: XY

Distancia 3: ZZ

Distancia 1: XX

Distancia 2: XY

Distancia 3: ZZ

Se va repitiendo pero con las medidas diferentes que va tomando. No creo que aquí esté el problema :S
Citar
#58
Que raro...

Si las mediciones de distancias están bien y el código de los movimientos están bien...

No hay mucho mas donde mirar.

Intenta hacer el código de nuevo que no se nos haya pasado nada por alto.

No te da ningun error el arduino IDE a la hora de cargar el programa no?
Citar
#59
He visto algo que no se si podría estar mal.

Al principio del archivo defines "long distancia2" y mas tarde pones "distancia2 = int (0.017 * tiempo);"

Eb un campo long estas trabajando con int, no se si eso es correcto y pueda dar algun tipo de problemas o conflicto.

Saludos
Citar
#60
Buenas a tod@s:

He probado de cambiar los int por los long y viceversa. Y nada. Hace lo que le da la real gana.

Por diós!!! que no tiene que ser tan difícil (Mensaje mental para mi mismo) Es que me da rabia encontrarme con situaciones donde te tropiezas con lo más tonto U.U

Ya digo, agradezco muchísimos vuestras aportaciones, pero me da rabia no saber que c...j..nes pasa para poder disfrutar del robot de una vez por todas. Es que a parte, pruebe lo que pruebe siempre hace lo mismo o similar. u.u
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Robot vintage "monty" DiegoLale 17 5,532 12-11-2017, 08:41 PM
Último mensaje: zilog_z80
  [PRESENTACION] Robik - un robot que mueve el cubo de rubik Michi 4 1,535 29-03-2017, 11:37 AM
Último mensaje: Drey
  Objetivo: robot educativo por menos de 20€ sistemasorp 33 4,142 25-02-2017, 10:51 AM
Último mensaje: RPM
  [Worklog] Robot acuático JALC biketrial981 67 6,285 08-01-2016, 11:55 PM
Último mensaje: biketrial981
  ayuda con robot bioloid humanoide tipo a yair_xiox 1 1,137 16-11-2015, 05:17 PM
Último mensaje: hectorri