This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Prototipo robot
Tu arduino es original?
Mirar lo que pone el compi en el otro post
" Tengo un problema con la placa funduino Atmega 328p-pu: cuando utilizo la función servo.attach(pin) todos los pines PWM excepto uno pierden esta propiedad. Alguien sabe qué puedo hacer?"
  Responder
Buenas a tod@s:

Mi arduino es un arduino uno original.

Mañana empezaré desde 0 para ir descartando fallos.

Muchas gracias por vuestro interés y apoyo.
  Responder
No pierdas el animo Electro, en cuanto te funcione todo la satisfaccion es muy grande, veras

Tu prueba poco a poco, y si no te funciona, comentanos paso a paso que es lo que sucede y que no debiera suceder asi nos centramos y echamos ese bichin para adelante¡¡
  Responder
Buenas a tod@s:

Haré un poco de resumen de la evolución de los pasos que han ido surgiendo y los problemas:

1º Consigo hacer funcionar el robot y que en función de las medidas tomadas escoja la mejor opción (Va a toda ostia pero lo hace)

2º Jero me pasa un código para regular la velocidad de los motores (hubo intentos anteriores, pero todos fueron fallidos), y que me funciona correctamente

3º Implanto el código de la regulación de velocidad de los motores en el código del robot y dejan de funcionar los motores y en lugar de funcionar solo emite un pitido la placa Arduino

4º Esta tarde, he probado de colocar un cable de alimentación directo al servo y veo que funcionan los motores, pero parece que todo el rato van recto, independientemente de las medidas tomadas.

P.D. Mañana volveré a probar el 4º paso para ver si realmente es así o qué. Pero como mínimo los motores giran, pero a una velocidad excesiva. A parte, comprobaré con el puerto serial que las medidas tomadas son correctas y qué medida toma como buena.

También cambiaré el pin del servo por otro que no sea el 9 y el 10. Y también cambiaré uno de los pines del sensor, ya que uno está conectado en el 9 y también se anulaba como ha comentado Jero.

Espero que mañana sea el día esperado que todo vea la luz.

Muchas gracias por todo y a todos, porque bueno... malauradamente me está costando más de lo que creía, y veo que estoy fallando donde no creía que fallaría.
  Responder
si giran los motores ya tenemos un paso mas! Guiño a ver mañana las pruebas!! Animo!!
  Responder
Buenas a tod@s:

Si, giran, pero a la velocidad máxima, sin tener en cuenta la regulación que les daba. Aunque sí, ahora giran, pero bueno... estaríamos en el paso 2 xD
  Responder
Buenas a tod@s:

He cambiado el pin 10 del servo y lo he puesto en el pin 13.

He probado el robot con todos los componentes, y nada... no funciona. Solo pita. Las medidas las he verificado mediante el puerto serie y son correctas, y escoje la que debería. Pero el robot no se mueve.

Ahora lo qué haré será empezar desde 0 con el tema de los motores.
  Responder
El problema debe de estar en el servo o en el medidor de sonido. Prueba a ver cual es el que falla!
  Responder
Perdón ultrasonidos
  Responder
Buenas a tod@s:

El servo funciona correctamente, me hace 0º - 90º - 180º y una vez tomadas las 3 medidas vuelve a 90º para arrancar los motores (manía mía, lo puse así porque creía que quedaba mejor)

El sensor parece funcionar bien, porque las medidas (dejando de lado el posible margen de error que pueda tener) son aceptables las medidas como buenas.

He cogido el código de Jero y funciona, como siempre. Después le he añadido la parte del código del servo + el sensor ultrasónico, pero que no distinga medidas, es decir que siempre vaya recto. Un rato más rápido y después más lento:

Código:
#include <Servo.h>
long distancia1;
long distancia2;
long distancia3;
long tiempo;
Servo servo;

int IN3 = 4;
int IN4 = 7;
int IN1 = 2;
int IN2 = 12;
int ENA = 5;
int ENB = 6;

void setup(){
  Serial.begin(9600);
  pinMode(9, OUTPUT); /*activación del pin 9 como salida: para el pulso ultrasónico*/
  pinMode(8, INPUT); /*activación del pin 8 como entrada: tiempo del rebote del ultrasonido*/
  servo.attach(13);
  pinMode (IN4, OUTPUT);  
  pinMode (IN3, OUTPUT);    
  pinMode (IN2, OUTPUT);  
  pinMode (IN1, OUTPUT);    
  pinMode (ENA, OUTPUT);  
  pinMode (ENB, OUTPUT);
}

void loop(){
    servo.write(10);
  delay(500);
  digitalWrite(9,LOW); /* Por cuestión de estabilización del sensor*/
  delayMicroseconds(5);
  digitalWrite(9, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  tiempo=pulseIn(8, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
  del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
  deja de hacerlo, LOW, la longitud del pulso entrante*/
  distancia1= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
  /*Monitorización en centímetros por el monitor serial*/
  Serial.print("Distancia 1 ");
  Serial.print(distancia1);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(500);
  digitalWrite(9,LOW); /* Por cuestión de estabilización del sensor*/
  delayMicroseconds(5);
  digitalWrite(9, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  tiempo=pulseIn(8, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
  del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
  deja de hacerlo, LOW, la longitud del pulso entrante*/
  distancia2= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
  /*Monitorización en centímetros por el monitor serial*/
  Serial.print("Distancia 2 ");
  Serial.print(distancia2);
  Serial.println(" cm");
  delay(750);
  servo.write(180);
  delay(500);
  digitalWrite(9,LOW); /* Por cuestión de estabilización del sensor*/
  delayMicroseconds(5);
  digitalWrite(9, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  tiempo=pulseIn(8, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
  del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
  deja de hacerlo, LOW, la longitud del pulso entrante*/
  distancia3= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
  /*Monitorización en centímetros por el monitor serial*/
  Serial.print("Distancia 3 ");
  Serial.print(distancia3);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(500);
  digitalWrite (IN4, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN1, HIGH);
analogWrite (ENA,50);
analogWrite (ENB, 50);
delay(3000);
  digitalWrite (IN4, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN1, HIGH);
analogWrite (ENA,250);
analogWrite (ENB, 250);
delay(3000);
}

El problema es que el servo se vuelve a poner en marcha aunque los motores no hayan finalizado el ciclo de trabajo, y reducen la velocidad cuando el servo y el ultrasónico ya están haciendo el segundo barrido.

Según el código, el servomotor, no tendría que volverse a poner en marcha hasta que no hubiesen parado los motores, verdad?

Las medidas són correctas. Yo el servo y el ultrasónico los descartaría. Me centraría más en el driver, aunque no sé porque falla al cambiar el código. Facepalm
  Responder
buffff!!!
creo que es el momento de empezar a utilizar funciones porque estás "a esto" de perder totalmente el control de tu robot.
Tienes el código super-bien comentado lo cual es un punto a tu favor... a mi me cuesta horrores y empiezo bien pero enseguida me pongo a teclear como un loco y dejo de comentar.
Pero el problema es que con tantas lineas seguidas y tanto comentario pierdes la "visual" del programa... me explico.

tus primeras 50 lineas mas o menos estan dedicadas a obtener la distancia medida del sensor y tienes que andar buscando por todo el código en que momento termina es funcion para saber que sigue luego, y despues lo mismo con los motores.
sería mucho mas sencillo hacer una función por ejemplo... si quisieras saber la distancia y simplemente avanzar 1 segundo y luego obtener las distancias... etc...

void loop()
{
distancia_izquierda = obtendistancia(10); // 10, 90 , 180 serían los parametros que pasarias a la función obten distancia para mover el servo
distancia_centro= obtendistancia(90);
distancia_derecha= obtendistancia(180);
delay(50);
avanza(1000);
para();

}
ese programa es mas facil de entender.
luego evidentemente tienes que construir las funciones obtendistancia(); con su parámetro para colocar el servo, avanza(); con el parámetro del tiempo que avanza(por ejemplo) y para(); sin parámetros porque simplemente vas a parar los motores
... es un ejemplo no muy funcional para explicar como lo veo, porque si sigues así cuando implementes nuevos comportamientos al robot vas a encontrarte con un programa de 200 lineas que cuando quieras modificar algo vas a estropear el programa y ya no serás capaz de encontrar el error.
Si además utilizas las pestañas para poner en una las funciones de movimiento de los motores, en otra las funciones para los sensores (de momento hay uno pero eso puede cambiar) tendrás un programa super- comprensible y facil de encontrar los errores.
Al principio cuesta un poco hacer todo esto y parece raro, pero en cuanto le cojas el truco verás que es muchísimo mas sencillo así
Cuando un hombre planta un árbol bajo cuya sombra sabe que no se sentará ha comenzado a comprender el sentido de la vida... o lo que es lo mismo... comparte!!!
  Responder
hola, en el codigo que muestras no veo que le digas a los motores que paren,

digitalWrite (IN4, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN1, HIGH);
analogWrite (ENA,50);
analogWrite (ENB, 50);
delay(3000);
digitalWrite (IN4, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN1, HIGH);
analogWrite (ENA,250);
analogWrite (ENB, 250);
delay(3000);
}


me explico:

el servo se mueve y sensa el untrasonido hasta ahi todo bien,
el robot asume la mayor distancia y arrranca,
pero aqui el robot debe parar de lo contrario se queda en la ultima instruccion y el servo arranca y vuelve a medir mientras los motores siguien en marcha.

luego de los 3 segundos vuleve a medir pero fijate que nunca paraste el motor el motor sigue andando

deberias dar la orden de paro:


digitalWrite (IN4, LOW);
digitalWrite (IN3, LOW);
digitalWrite (IN2, LOW);
digitalWrite (IN1, LOW);
analogWrite (ENA,255);
analogWrite (ENB, 255);

}

luego que siga su ciclo como lo venias haciendo.
  Responder
por otro lado retomando lo del PWM segun lo que he leido

http://letsmakerobots.com/content/pwm-l293l298

comentan que es mejor dependiendo de lo que quieres para tu robot, poner el PWM en el Enable o en las entradas,
cuando lo pones en el Enable, hay instantes donde se deshabilita el motor y queda como rueda libre (esto disminuye el torque y la presicion de parada - ejemplo se te puede resbalar en una pendiente)
si usas el PWM en las entradas, el motor siempre esta habilitado y al momento de quedar ambas entradas en 0 el motor se bloquea (esto da un mayor torque y una parada precisa de las ruedas, - ejemplo si usas encoders).

yo usaria la segunda opcion asi solo usaria 4 salidas del arduino, y por experiencia propia puedes usar todas las salidas digitales como PWM asi el manual diga lo contrario Lengua

te aconsejaria que solo uses PWM para la entrada que quieras poner en HIGH, y la de LOW dejala tal cual

digitalWrite (IN4, LOW);
analogWrite (IN3, 150);
digitalWrite (IN2, LOW);
analogWrite (IN1, 150);
//analogWrite (ENA,250); - a estos enable les pones los jumper
//analogWrite (ENB, 250);
delay(3000);

ten claro que es mi humilde opinion Gran sonrisa
  Responder
Buenas a tod@s.

richardmike4, si pongo los jumper en los ENA y ENB, no podré conectar el pin correspondiente al Arduino, no?
  Responder
si los ENA ENB los tienes siempre cableados no necesitas señal del arduino y te quedan esos 2 pines libres, siempre estaran habilitadas las salidas.

ya solo juegas con las IN1 al IN4
  Responder
richardmike4 escribió:comentan que es mejor dependiendo de lo que quieres para tu robot, poner el PWM en el Enable o en las entradas,
cuando lo pones en el Enable, hay instantes donde se deshabilita el motor y queda como rueda libre (esto disminuye el torque y la presicion de parada - ejemplo se te puede resbalar en una pendiente)
si usas el PWM en las entradas, el motor siempre esta habilitado y al momento de quedar ambas entradas en 0 el motor se bloquea (esto da un mayor torque y una parada precisa de las ruedas, - ejemplo si usas encoders).


Ummm, eso del bloqueo, creo que debe de ser en caso de usar el Driver con motores Bipolares, es posible realizar un bloqueo en un motor DC?
  Responder
Tienes razón Triggerr, me entró la duda, ahora estoy trabajando, en unas horas (mas o menos 7 horas Lengua) que llegue a casa lo probaré y les comentaré, Lengua, si embargo me sigue gustando los EN fijos Gran sonrisa, porque empeze a armar e mio:

4 salidas Digitales- puente H
2 entradas Digitales - encoder ruedas
5 entradas Analogas - sensores Ultrasonido
5 salidas PWM - sensores Ultrasonido
2 salidas Digitales - el TX y RX no los puedo tocar porque le voy a poner Xbee.

total:

13 -Digitales
5 -Analogas

y el Arduino UNO tiene

14 -Digitales
6 -Analogas

Lengua, viendolo bien como que tendre que pasar al MEGA


PD: por cierto si van a usar encoder, obligación usar interrupciones que el arduino uno son pin 2 y 3 digitales Lengua y tambien se ahorra varias lineas de codigo por este método.
  Responder
richardmike4 escribió:si los ENA ENB los tienes siempre cableados no necesitas señal del arduino y te quedan esos 2 pines libres, siempre estaran habilitadas las salidas.

ya solo juegas con las IN1 al IN4

Buenas a tod@s:

Entiendo lo que comentas. Perdón por mi ignorancia Facepalm
  Responder
Buenas a tod@s:

He probado el código que me facilitaste richardmike4. Funciona. Mide una vez el sensor y después van rápido los motores y después van lentos. Vuelve a medir y así sucesivamente.

Ahora probaré de implementar el código definitivo del modo que me has comentado.

Admito que hay que depurar mucho el código con funciones, millis, etc... pero bueno... paso a paso. Pero lo tengo en cuenta y mi intención es ir en la dirección que comentas, tanto tu como el resto de compañeros.
  Responder
Buenas a tod@s:

Eureka!!!!

Funciona!!!

Los motores van a una velocidad controlada a mi gusto. El servo se mueve como debe y el sensor mide (aunque tengo que verificar que lo haga bien ya que los movimientos del robot me dejan un poco despistado). Pero como mínimo he conseguido que se moviese el robot.

También hay que indicar que ya no pita.

Ahora verificaré el código que no haya cambiado algo sin querer de los movimientos y por eso me haga eso raro.

Muchas gracias a tod@s.

Por fin podré "terminar" ese proyecto antes de empezar las clases (pongo terminar entre comillas porque mi intención es que nunca termine, ya que lo quiero ir evolucionando paulatinamente, y por lo tanto, no creo que dé por finalizado este proyecto en ningún momento).

Muchas gracias a tod@s de todo corazón. Bueno... ahora a mirar a ver que ocurre con esos movimientos extraños pero como mínimo va con la calma, jeje.

El servo lo dejo conectado a los 6V directos de la pila o lo puedo conectar al Arduino como lo tenía antes? Si funciona podría hacerlo, no? O me recomendáis que igualmente lo deje directamente a 6V de batería?

Aquí os dejo el código:

Código:
#include <Servo.h>
long distancia1;
long distancia2;
long distancia3;
long tiempo;
Servo servo;

int IN3 = 3;
int IN4 = 6;
int IN1 = 11;
int IN2 = 5;


void setup(){
  Serial.begin(9600);
  pinMode(9, OUTPUT); /*activación del pin 9 como salida: para el pulso ultrasónico*/
  pinMode(8, INPUT); /*activación del pin 8 como entrada: tiempo del rebote del ultrasonido*/
  servo.attach(13);
  pinMode (IN4, OUTPUT);  
  pinMode (IN3, OUTPUT);    
  pinMode (IN2, OUTPUT);  
  pinMode (IN1, OUTPUT);    

}

void loop(){
  servo.write(10);
  delay(500);
  digitalWrite(9,LOW); /* Por cuestión de estabilización del sensor*/
  delayMicroseconds(5);
  digitalWrite(9, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  tiempo=pulseIn(8, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
  del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
  deja de hacerlo, LOW, la longitud del pulso entrante*/
  distancia1= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
  /*Monitorización en centímetros por el monitor serial*/
  Serial.print("Distancia 1 ");
  Serial.print(distancia1);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(500);
  digitalWrite(9,LOW); /* Por cuestión de estabilización del sensor*/
  delayMicroseconds(5);
  digitalWrite(9, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  tiempo=pulseIn(8, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
  del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
  deja de hacerlo, LOW, la longitud del pulso entrante*/
  distancia2= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
  /*Monitorización en centímetros por el monitor serial*/
  Serial.print("Distancia 2 ");
  Serial.print(distancia2);
  Serial.println(" cm");
  delay(750);
  servo.write(180);
  delay(500);
  digitalWrite(9,LOW); /* Por cuestión de estabilización del sensor*/
  delayMicroseconds(5);
  digitalWrite(9, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  tiempo=pulseIn(8, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
  del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
  deja de hacerlo, LOW, la longitud del pulso entrante*/
  distancia3= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
  /*Monitorización en centímetros por el monitor serial*/
  Serial.print("Distancia 3 ");
  Serial.print(distancia3);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(500);
  
  
  if (distancia2 >= distancia1 && distancia2 >= distancia3) //Va hacia delante
  {
    Serial.print("Distancia 2 en moviment ");
  Serial.print(distancia2);
  Serial.println(" cm");
  delay(750);
  digitalWrite (IN4, LOW);
  analogWrite (IN3, 100);
  digitalWrite (IN2, LOW);
  analogWrite (IN1, 100);
  delay (1000);
  digitalWrite (IN3, LOW);
  digitalWrite (IN1, LOW);
  delay(250);
  }
  if (distancia1 >= distancia2 && distancia1 >= distancia3) //Va hacia la dereha
  {
    Serial.print("Distancia 1 en moviment ");
  Serial.print(distancia1);
  Serial.println(" cm");
  delay(750);
  
  analogWrite (IN4, 100);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  analogWrite (IN1, 100);  
  delay (200);
  digitalWrite (IN4, LOW);
  digitalWrite (IN1, LOW);
  delay(350);
  }
  if (distancia3 >= distancia1 && distancia3 >= distancia2) // Va hacia la izquierda
  {
    Serial.print("Distancia 3 en moviment ");
  Serial.print(distancia3);
  Serial.println(" cm");
  delay(750);
  digitalWrite (IN4, LOW);
  analogWrite (IN3, 100);
  digitalWrite (IN2, 100);
  analogWrite (IN1, LOW);
  delay(200);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  delay(350);
  }
   if (distancia2 <= 10)
  {
  analogWrite (IN4, 100); //Va hacia atrás
  digitalWrite (IN3, LOW);
  analogWrite (IN2, 100);
  digitalWrite (IN1, LOW);  
  delay(500);
  digitalWrite (IN4, LOW);
  digitalWrite (IN2, LOW);
  delay(350);
  }

  
}
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Robot sube escaleras Linoge 13 8,691 03-08-2020, 12:52 PM
Último mensaje: nachito15
  Robot vintage "monty" DiegoLale 17 10,429 12-11-2017, 08:41 PM
Último mensaje: zilog_z80
  [PRESENTACION] Robik - un robot que mueve el cubo de rubik Michi 4 3,287 29-03-2017, 11:37 AM
Último mensaje: Drey
  Objetivo: robot educativo por menos de 20€ sistemasorp 33 10,372 25-02-2017, 10:51 AM
Último mensaje: RPM
  [Worklog] Robot acuático JALC biketrial981 67 16,339 08-01-2016, 11:55 PM
Último mensaje: biketrial981