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

Triggerr aquí te dejo las fotos que me has pedido.

resim

resim

Muchas gracias por vuestro tiempo e interés.

Ahora con la llegada imminente de la impresora, parece que tenga que venir un bebé, porque no tiempo para nada, solo para prepararlo todo para cuando llegue, jaja. Hasta el punto, que esta tarde me voy a comprar una mesa al IKEA especificamente para ella. Gaydude

P.D. Para regular la velocidad mediante los ENA y ENB, tendría que hacerlo escribiendolo en el código una sola vez al inicio, y así cuando active los diferentes IN ya tendrán regulada la velocidad, verdad?
Citar
No alcanzo a ver las pistas Electro, comprueba con un polimetro que no tengan tension, no vaya a ser que esta alguna a masa o 5V y achicharremos algo ajjaja
Citar
Buenas a tod@s:

Bueno... Triggerr ya tengo hechas las medidas. He hecho 2 para cada terminal para saber el voltaje en relación al positivo o negativo del driver.

ENA (pin interior de la placa) respecto al negativo me da 4.99V y respecto al positivo me da 6.94V
ENA (pin exterior de la placa) respecto al negativo me da 0.00V y respecto al positivo me da 7.16V

ENB (pin interior de la placa) respecto al positivo me da 6.96V y respecto al negativo 4.99V
ENB (pin exterior de la placa) respecto al positivo me da 7.10V y respecto al negativo 0.00V

He tomado dos medidas de cada pin para tener más información.

Muchas gracias Triggerr Sisi3

P.D. Entonces, los ENA y ENB se tendrían que conectar por el pin exterior correspondiente a los pines del Arduino, verdad???
Citar
Si, son los exteriores, los que te den 0v al negativo.
Citar
Buenas a tod@s:

Gracias El3ndil por tu respuesta, entonces conecto los IN como los tenía antes, y después cojo dos cables y los conecto al INA e INB respectivamenet, y después en el cógido sería algo similar a:

Void loop (){

DigitalWrite (INA, 127); //Para que vaya a una velocidad regular)
DigitalWrite (INB, 127);

------- (Resto de código) ----

Y los IN en HIGH y LOW como antes, me equivoco? Pero, si quisiese regular la velocidad en función de la distancia hasta el obstaculo, como lo podría variar? (Variando el numero de INA e INB, pero digamos que ahora se queda en un valor fijo)
Citar
Hola, Electromecánico.

Muy sencillo.

Tendrías que crear una variable velocidad.

Por ejemplo.

Velocidad = 127

y después canviar con los if por ejemplo.

if(distancia2 > 20) { velocidad = 100; }
if(distancia2 > 15 && 20 < velocidad2) { velocidad = 90; }
...

Seria una forma de hacerlo.

Espero que la entiendas, cualquier duda, ya sabes!

Saludos, Jero
Citar
Buenas a tod@s:

He hecho cambios en el código para poner los ENA y ENB. Los he conectado en pines PWM del Arduino y el código lo he dejado de esta forma:

He vuelto a poner HIGH y LOW segun conveniese en los IN y en los ENA y ENB he puesto el valor PWM. Lo que veo es que no hace ningún cambio si vario el valor de los EN, da igual si pongo 10 o 255 o 127. Donde está el error? Lo he puesto mal dentro del código? Lo tendría que poner junto a los IN cuando les doy valor HIGH o LOW?

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(10);
  pinMode (IN4, OUTPUT);  
  pinMode (IN3, OUTPUT);    
  pinMode (IN2, OUTPUT);  
  pinMode (IN1, OUTPUT);    
  pinMode (ENA, OUTPUT);  
  pinMode (ENB, OUTPUT);
}

void loop(){
  digitalWrite(5,255);
  digitalWrite(6,255);  
  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);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN1, HIGH);
  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);
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  digitalWrite (IN1, HIGH);
  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);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
  delay(200);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  delay(350);
  }
   if (distancia2 <= 5)
  {
  digitalWrite (IN4, HIGH); //Va hacia atrás
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
  delay(500);
  digitalWrite (IN4, LOW);
  digitalWrite (IN2, LOW);
  delay(350);
  }
    digitalWrite(5,0);
  digitalWrite(6,0);
  
}
Citar
Te falta poner a mi vista por ejemplo:

analogWrite(ENA, 50);
analogWrite(ENB, 50);

Prueba de ponerlo en hacia adelante así:
digitalWrite (IN4, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN1, HIGH);
analogWrite(ENA, 50);
analogWrite(ENB, 50);

Saludos Jero
Citar
Buenas a tod@s:

Jero, en ninguna de las formas funciona. Y tienes razón, era mejor poner ENA y ENB en lugar del numero de pin (fallo mío).

Pero la segunda opción parece no funcionar. Ni poniendolo delante ni detrás :S

El cableado y conexionado parece correcto. Pero los pines ENA y ENB no parecen funcionar correctamente.
Citar
Yo juraria que no son los Externos, sino los internos, si los externos ambos dan 0V midiendo respecto de GND, es que sirven para poner a 0 los EN, que crei leer en algun lado que poniendolos a 0 era cuando se movian los motores, tendria que revisar la wiki....

No he dicho nada, que se activan en nivel alto

Prueba a meterle un valor de PWM mas alto aver
Citar
Buenas a tod@s:

Trigger, si lo pongo en los internos, simplemente el robot se queda inmovil :S
Citar
Despues de rebuscar un poquito he encontrado un ejemplo, aunque no se veia muy bien para tu driver no utilizan los EN con el PWN, si no que utilizan los pares 2 y 4.

Es decir:

digitalWrite (IN1, HIGH);
analogWrite(IN2, 100);
digitalWrite (IN3, HIGH);
analogWrite(IN4, 100);

Tendrias que dejar los enable con el jumper y conectar esos pines.

El ejemplo lo he visto en este video de youtube:
https://www.youtube.com/watch?v=ZcSDcjQktuk

Sinceramente aun tengo mis dudas, pero mas no puedo ayudarte ya que no puedo probarlo directamente.

Prueba y nos vas comentado.

PD: Los PWN hay que poner "analogWrite" que veo que en el codigo estas poniendo "digitalWrite", que es lo que te queria decir el compañero Jero, no se referia a lo del pin.
Citar
Código:
#define SON_OUT 9
#define SON_IN 10
#define IN1 7
#define IN2 5
#define IN3 8
#define IN4 6

long Tiempo;
long Distancia;
int Velocidad;

void setup()
{

  pinMode(LED, OUTPUT);
}

void setup(){
  Serial.begin(9600);
  pinMode (SON_OUT, OUTPUT);
  pinMode (SON_IN, INPUT);
  pinMode (IN1, OUTPUT);  
  pinMode (IN2, OUTPUT);  
  pinMode (IN3, OUTPUT);  
  pinMode (IN4, OUTPUT);  
}

void loop()
{
  digitalWrite(SON_OUT,LOW);
  delayMicroseconds(5);
  digitalWrite(SON_OUT, HIGH);
  delayMicroseconds(10);
  Tiempo=pulseIn(SON_IN, HIGH);
  Distancia= int(0.017*Tiempo);
  Velocidad = map(Distancia,0,50,0,255);
  
  if (Velocidad < 255)
  {
      digitalWrite (IN1, HIGH);
      analogWrite(IN2, Velocidad);
      digitalWrite (IN3, HIGH);
      analogWrite(IN4, Velocidad);
      delay(100);
  }
}

Te he puesto un ejemplo sencillo que acabo de hacer a ojo mas o menos.
Si la distancia que detecta el sonar es menos de 50cm se van activar el motor, la velocidad sera dependiendo de la distancia a mayor distancia mas rapido, deberia ir disminuyendo segun se va acercando.
He omitido el servo.

Si quieres guarda tu ejemplo y prueba ese, que para que pruebes si funciona el PWN y la variacion de la velocidad deberia valerte.
No lo he podido depurar y estoy algo oxidado, a lo mejor me comido algo Lengua

Prueba y nos cuentas.
Citar
Buenas a tod@s:

El3ndil, he tenido que corregir un par de detalles en tu código.

Lo he probado y parece que no funciona. Tiene un obstaculo delante y se estampa. Y la velocidad no la modifica en ningún momento :S

De todas formas muchas gracias por el interés.

Continuaré mirando e investigando a ver que puede ser.
Citar
Electro, intenta probarlo por separado, sin los sensores, para ver si en verdad podemos regular el motor o no, vete probando diferentes valores de PWM y asegurate, de que el PIN a lo que lo conectas sea PWM que todos no son PWM
Citar
Los pins PWM van indicados en arduino normalmente con "~"
Citar
Buenas a tod@s:

Sí sí, jero eso ya lo sé.

De acuerdo Triggerr haré lo que comentas para así descartar cosas.

Gracias a tod@s.
Citar
Electromecánico escribió:Buenas a tod@s:

El3ndil, he tenido que corregir un par de detalles en tu código.

Lo he probado y parece que no funciona. Tiene un obstaculo delante y se estampa. Y la velocidad no la modifica en ningún momento :S

De todas formas muchas gracias por el interés.

Continuaré mirando e investigando a ver que puede ser.

Juer que misterio...... :dale2:
Estoy por coger un arduino y un drive para hacer yo tambien las pruebas Meparto
Citar
Para estas cosas, prueba las cosas por modulos y luego las implementas, es lo mejor para conocer el funcionamiento de cada modulo Sisi3 Sisi3
Citar
Buenas a tod@s:

Eureka!!!! Confundidoing:

Hay que reconocerlo, esta vez, gracias a Jero que me ha pasado el siguiente código que he implementado dentro del código que ya tenía y funciona:


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(10);
  pinMode (IN4, OUTPUT);  
  pinMode (IN3, OUTPUT);    
  pinMode (IN2, OUTPUT);  
  pinMode (IN1, OUTPUT);    
  pinMode (ENA, OUTPUT);  
  pinMode (ENB, OUTPUT);
}

void loop(){
  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);
}


Funciona correctamente la variación de la velocidad de los motores.

Ahora lo implementaré a mi código y listos Sonrisa

Muchas gracias a todos por vuestro granito de arena. Lamento ser tan patoso, pero nunca había trabajado con drivers, y en Arduino no llevo ni un año. Por eso me gusta hacer proyectos para ir aprendiendo y ver como funcionan las cosas. Supongo que con el tiempo, podré ser tan grandes como vosotros.
Citar


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