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
#21
Tengo el mismo modelo pero el de 4 ruedas! Un buen kit para iniciarse.

Te echo una carrera!!
  Responder
#22
Buenas a tod@s:

Haha cuando quieras Jero. Yo me cogí el de 2 ruedas porque lo veo más ágil y las ruedas no tienen que trabajar a la hora de hacer los giros.

Bueno... yo me lo tomo como una maratón, jaja. Cuando solvento un problema me voy con el siguiente y así voy aprendiendo. Ahora a ver si por fin hago girar los motores y después ya veré la luz al final del túnel Sonrisa
  Responder
#23
Cuando corre, seras como un niño chico.

Yo lo conecte con una raspberry pi con un servidor node.js con johnny-five (librería para el arduino) para poder hacerlo servir desde una web. Y con el acelerómetro del teléfono controlarlo.

La raspberry también hacia de hotspot wi-fi.

Y me quede en el tema de el streaming de la cámara de la raspberry.

A ver si tuviera tiempo y recupero el proyecto.

Así que como vez se puede hacer infinidad de cosas.
  Responder
#24
Buenas a tod@s:

Ufff... Que dominio tienes!!! Ya me gustaría poder hacer todo esto. Pero de momento paso a paso.
  Responder
#25
Buenas a tod@s:

No me acabo de aclarar como conectar el driver para que me funcione.

Estoy utilizando, como prueba, este código prestado de internet:

Código:
/*
Ejemplo de control de motor DC usando modulo L298
http://electronilab.co/tienda/driver-dual-para-motores-full-bridge-l298n/

El programa activa el motor en un sentido por 4 segundos,
para el motor por 500 ms, activa el motor en sentido inverso por 4 segundos
y se detiene por 5 segundos. Luego repite la acción indefinidamente.

Creado 16/05/14
por Andres Cruz
ELECTRONILAB.CO
*/

int IN3 = 5;
int IN4 = 4;

void setup()
{
  pinMode (IN4, OUTPUT);    // Input4 conectada al pin 4
  pinMode (IN3, OUTPUT);    // Input3 conectada al pin 5
}
void loop()
{
  // Motor gira en un sentido
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW);
  delay(4000);
  // Motor no gira
  digitalWrite (IN4, LOW);
  delay(500);
  // Motor gira en sentido inverso
  digitalWrite (IN3, HIGH);
  delay(4000);
  // Motor no gira
  digitalWrite (IN3, LOW);
  delay(5000);
}

He conectado los cables dl motor en el OUT 3 y OUT 4 y los cables del driver en el IN3 e IN4 y en los pines correspondientes. Hasta aquí... solo hay que seguir las instrucciones que te da el propio tutorial de donde lo he rescatado.

El problema creo que lo tengo en la alimentación.

Tengo este driver:

[Imagen: L298StepperController.jpg]

Los 3 bornes de alimentación son +12 V, GND, +5V. Y hay los jumpers de +12V, que por lo que he leído es si vas a alimentarlo con más de 12 V hasta 35V. Y los jumpers de ENA y ENB.

Aquí es donde me pierdo. Que tengo que tener conectado (jumpers) y cuando?

Muchas gracias.

P.D. Sorry por mi ignorancia pero aun no había trabajado con drivers, por eso me pillé uno, para aprender. Pero me da rabia que no obtenga resultados de forma individual Triste
  Responder
#26
Mirate este tutorial de bricogeek a me sirvio aun que mi motor es diferente, ellod tienen uno parecido al tuyo.

http://blog.bricogeek.com/noticias/tutor...n-arduino/

Saludos
  Responder
#27
Buenas a tod@s:

Muchas gracias Jero por el enlace. Está muy bien el tutorial, sin embargo no termina de solucionar mis dudas-problemas.
  Responder
#28
Tienes a mano el manual del Driver? que lo echamos un ojo
  Responder
#29
Buenas a tod@s:

Tengo el datasheet del propio integrado L298N. Pero no del driver con la plaquita tal y como lo tengo yo.
  Responder
#30
Poco a poco, que tipo de motores ibas a usar? DC no?
  Responder
#31
Buenas a tod@s:

Sí sí motores DC. Solo dos motores lleva el robot.
  Responder
#32
Las patillas IN son para indicar la direccion a la que quieres que gire el motor si no me equivoco, luego conectas los dos motores a las dos salidas. Para dar direccion al motor imagino que sera poniendo en alto alguno de los IN, puedes ir probando. El selector de tension creo que es para que la propia placa alimente a 5V el chip o que lo alimentes tu exteriormente

http://www.geekonfire.com/wiki/index.php...tor_Driver
  Responder
#33
Buenas a tod@s:

Por fin empiezo a ver la luz al final del túnel, gracias a nuestro querido Triggerr :aplauso:

Esta mañana después del intercambio de varios MP me ha dado las indicaciones para salir del problema.

He conseguido que girase una rueda gracias a un código sacado de internet. Ahora tocará girar las 2 y finalmente, que giren en función de lo que quiera.

A ver si esta semana termino el proyecto de una vez por todas
  Responder
#34
Buenas a tod@s:

Al final, se van juntando las piezas del puzle.

Ayer por fin conseguía hacer girar los motores, gracias a Triggerr.

Hoy he juntado la parte del código del servo motor + la del sensor ultrasónico que ya tenía hechos con la de los motores.

He hecho algunas pruebas a ver que tal funciona. Pero como lo tengo conectado al PC para leer las medidas no puedo fiarme demasiado. El próximo paso será dejarlo en libertad y que sea totalmente autónomo y con las baterías que ande solo a ver que tal reacciona.

Sé que se puede mejorar tanto el robot como el código. El robot ahora mismo parece.... una telaraña de cables, jeje. Y por lo que respecta al código, mi primera intención es eliminar los delays, los empiezo a odiar. Supongo que es cuestión de vida. Y por otro lado, me gustaría que avancase hacia una dirección en función de la distancia que haya hasta el obstaculo para no chocar contra este. O sino... que parase de moverse cuando detectase un obstaculo en el camino.

Bueno... ya tengo deberes para este agosto, jejeje.

Aquí os dejo el código

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

int IN3 = 5;
int IN4 = 4;
int IN1 = 3;
int IN2 = 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(10);
  pinMode (IN4, OUTPUT);    // Input4 conectada al pin 4
  pinMode (IN3, OUTPUT);    // Input3 conectada al pin 5
  pinMode (IN2, OUTPUT);    // Input2 conectada al pin 6
  pinMode (IN1, OUTPUT);    // Input1 conectada al pin 3
}

void loop(){
  servo.write(0);
  delay(250);
  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 ");
  Serial.print(distancia1);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(250);
  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 ");
  Serial.print(distancia2);
  Serial.println(" cm");
  delay(750);
  servo.write(180);
  delay(250);
  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 ");
  Serial.print(distancia3);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(250);
  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 ");
  Serial.print(distancia2);
  Serial.println(" cm");
  delay(750);
  
  if (distancia2 >= distancia1 && distancia2 >= distancia3)
  {
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
  delay (1000);
  }
  if (distancia1 >= distancia2 && distancia1 >= distancia3)
  {
  digitalWrite (IN4, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
  delay (250);
  }
  if (distancia3 >= distancia1 && distancia3 >= distancia2)
  {
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  digitalWrite (IN1, HIGH);
  delay(250);
  }
  
}

Y os agradezco vuestra ayuda y paciencia, y en especial a Triggerr, que sin él, seguramente aún me estaría dando golpes contra la pared. :dale2:
  Responder
#35
Buenas a tod@s:

Hoy por fin, LabBot, así he denominado el prototipo, ha cobrado vida de forma totalmente autonoma.

Como dije, hay que mejorar y corregir el código.

Este fin de semana me entretendré a verificar el codigo ya que da algunos problemas y una vez corregidos lo mejoraré.

Cuando tenga algo decente os hago un vídeo de la demostración.
  Responder
#36
Buenas a tod@s:

Esta tarde he estado trabajando con el robot.

Ha mejorado algo en su comportamiento. Aunque sus movimientos són algo bastante errantes, como mínimo elude los obstáculos.

Pero veo que cuando los detecta hace las 3 ordenes que tiene como opción a la hora de encontrarse un obstaculo. Va hacia delante, hace un giro, y va hacia atrás. Se para, para volver a tomar medidas, y siempre repite lo mismo. Y me gustaría que hiciese la mejor opción.

Básicamente tiene que comprar las 3 medidas, e ir hacia la distancia mayor entre las obtenidas. Y si no, dar marcha atrás. Y veo que hace un poco de todo xD

Aquí os dejo el código para a ver si vosotros véis donde está el fallo. Está claro que está en el apartado de los if's. Pero no sé como lo podría mejorar.

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

int IN3 = 5;
int IN4 = 4;
int IN1 = 3;
int IN2 = 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(10);
  pinMode (IN4, OUTPUT);    // Input4 conectada al pin 4
  pinMode (IN3, OUTPUT);    // Input3 conectada al pin 5
  pinMode (IN2, OUTPUT);    // Input2 conectada al pin 6
  pinMode (IN1, OUTPUT);    // Input1 conectada al pin 3
}

void loop(){
  servo.write(0);
  delay(250);
  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 ");
  Serial.print(distancia1);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(250);
  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 ");
  Serial.print(distancia2);
  Serial.println(" cm");
  delay(750);
  servo.write(180);
  delay(250);
  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 ");
  Serial.print(distancia3);
  Serial.println(" cm");
  delay(750);
  servo.write(90);
  delay(250);
  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 ");
  Serial.print(distancia2);
  Serial.println(" cm");
  delay(750);
  
  if (distancia2 >= distancia1 && distancia2 >= distancia3) //Va hacia delante
  {
  digitalWrite (IN4, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN1, HIGH);
  delay (1000);
  }
  if (distancia1 >= distancia2 && distancia1 >= distancia3) //Va hacia la dereha
  {
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  digitalWrite (IN1, HIGH);
  delay (500);
  }
  if (distancia3 >= distancia1 && distancia3 >= distancia2) // Va hacia la izquierda
  {
  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);
  }
    
}

Muchas gracias.

Ahora estoy a la espera de recibir unos cables macho - macho y macho - hembra para instalarle y así hacerlo más bonito. A parte estoy para hacerle una plataforma superior para la electrónica, ya que la plataforma original se me ha quedado pequeña :elrisas: . Llevo la placa del driver y 8 pilas AA (4 para el Arduino, sensor ultrasonidos y el Servo y las otras 4 para los motores y driver).

Una vez solventado este problema, mi intención es eliminar las pausas y que el movimiento sea continuo ^^. Poco a poco Sonrisa
  Responder
#37
El if de marcha atrás el ultimo esta mal formado, no?

Podrías poner un video, de como se comporta?

Sigue siempre el mismo patrón? O hace las tres fases aleatorias?
  Responder
#38
Buenas a tod@s:

Primero el servo hace 0º - 90º - 180º - 90º. Una vez en ese punto, el robot se desplaza hacia delante, hacia un lado y finalmente hacia atrás. Para. Y se vuelve a repetir el patrón T.T

Más o menos siempre hace lo mismo o similar. Vamos... que no escoje solo una opción, como me gustaría a mi.

Gracias por vuestras aportaciones
  Responder
#39
No veo nada raro en los if aparte del de marcha atrás, los valores que te imprime en serial son correctos de las distancias. Has probado de cambiar las variables por otro tipo que no sea long.

También puedes crear una variable que sea "movimento" boleano, true/false. Y cuando haga el primero movimoento se ponga a false y al final del archivo volver a cargarla, como true. También se tendría que incluir dentro de los if de movimento "&& movimiento==true".

Espero que te pueda ayudar.
  Responder
#40
Buenas a tod@s:

Buff... Jero, soy autodidacta, y más o menos entiendo lo que me comentas, pero aún no me he metido por esos lares.

Las medidas tomadas por el sensor son bastante exactas, por lo tanto, las doy por buenas. El problema lo tengo con los if's.
  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