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
Buenas a tod@s:

Con el código que me ha facilitado Jero, el Arduino emite un pitido, pero los motores funcionan de forma correcta.

Sin embargo, cuando implanto el código en el original, ocurre lo siguiente:

Se toman las 3 medidas con normalidad y cuando es hora de arrancar los motores se emite un pitido de medio segundo y no arrancan los motores y se vuelven a tomar las 3 medidas como si el robot hubiese avanzado.

A qué se debe?

Porque emite ese sonido el Arduino? He buscado por internet y no he encontrado nada.

Aquí os dejo el código que tendría que ser el definitivo y es el que me da este problema que os comento:

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(){
  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);
  analogWrite(ENA,50);
  analogWrite(ENB,50);  
  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);
  analogWrite(ENA,50);
  analogWrite(ENB,50);  
  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);
  analogWrite(ENA,50);
  analogWrite(ENB,50);  
  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);
   analogWrite(ENA,50);
  analogWrite(ENB,50);  
  delay(500);
  digitalWrite (IN4, LOW);
  digitalWrite (IN2, LOW);
  delay(350);
  }

  
}

Si pongo el código que me ha pasado Jero funcionan los motores, es decir que solo dejan de funcionar en este (y antes de hacer los cambios de ENA y ENB funcionaban y no emitía ningun pitido).

Muchas gracias.

Revisaré el código, porque la tensión de alimentación me da 11.80V.

Como curiosidad me he fijado que el Led "L" de la placa, está encendido. Debería estar apagado, verdad? Entonces porque se enciende? Queda encendido de forma permanente desde el instante que se enciende el Arduino.
  Responder
Posiblemente tengas que meter los avances en un bucle para que funcione.

un ejemplo:

Código:
digitalWrite (IN4, LOW);
    digitalWrite (IN3, HIGH);
    digitalWrite (IN2, LOW);
    digitalWrite (IN1, HIGH);

   for (int i=0; i <= 50; i++){
    analogWrite(ENA,50);
    analogWrite(ENB,50);
   }
  Responder
El pitido es por la frecuencia a la que haces el pwm.

El sonido lo hace un condensador que hay en la placa del puente h al cargarse/descargarse. Si no quieres que se oiga simplemente tienes que cambiar la frecuencia a una que no se oiga: http://playground.arduino.cc/Code/PwmFrequency
  Responder
Buenas a tod@s:

El3ndil, lamentablemente, te tengo que comunicar que no hay ningun cambio al incorporar tu codigo al código original. Hace exactamente lo mismo.

Muchas gracias por tu comentario banancocodrilo. Lo tendré en cuenta a la hora de hacer el PWM. Pero en ningún caso estoy dañando el Arduino?
  Responder
No creo que pueda haber ningún problema, yo diría que es el funcionamiento normal. Si te sirve de consuelo acabo de probar el mío y me he dado cuenta de que también pita, y bastante alto. (Es lo que tiene programar con los cascos puestos :elrisas: )

La conexión del driver no sé cómo la tendrás hecha. (no he visto si has puesto algún esquema). Yo lo uso así:

12V -> postivo de la batería
GND -> GND de arduino Y negativo de la batería
5v -> Depende de la version

ENA y ENB con sus jumpers al pin que tienen "encima" para que estén siempre activos.

IN2 -> pin6
IN4 -> pin5

Si vas a girar los motores en los dos sentidos IN1 e IN3 a cualquier pin de arduino, si sólo los vas a girar en un sentido los dos a GND.

En cuanto al código:


1º Usa "#define IN1 7" en vez de "int IN1 7" y hazlo con todos los pines que conectes. Sé que el resultado es lo mismo pero no cuesta hacer las cosas bien y te puede ahorrar dolores de cabeza.

2º La lectura de ultrasonidos supongo que te funcionará bien, de todas formas yo la meto en una función para que el código sea más claro, algo así:

Código:
int mideUltrasonidos(int trigPin, int echoPin){
  int dis;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  dis = pulseIn(echoPin, HIGH);
  dis = (dis/2) / 29.1;

return dis; //Devuelve la distancia en cm  
}



3º Las condiciones para el movimiento las pondría cómo if-elseif-elseif no vaya a ser que se cumplan 2 y se mueva para un lado y luego para otro

4º Si has puesto las conexiones cómo te he dicho, para ir hacia adelante:

digitalWrite(IN1,LOW);
analogWrite(IN2, 100);

digitalWrite(IN3,LOW);
analogWrite(IN4, 100);


Curva hacia un lado:


digitalWrite(IN1,LOW);
analogWrite(IN2, 100);

digitalWrite(IN3,LOW);
analogWrite(IN4, 60);



Girar sobre si mismo



digitalWrite(IN1,LOW);
analogWrite(IN2, 100);

digitalWrite(IN3,HIGH);
analogWrite(IN4, 155);

5º Y ya sólo por ponerme puñetero:

if (distancia2 <= 5)

Mis sensores de ultrasonidos a menos de 3cm no miden y a 3cm fallan casi siempre, por lo que sólo va hacia atrás si la distancia es 4 o 5.
#define DIS_CRITICA 15

if (distancia2 <= DIS_CRITICA)
  Responder
Buenas a tod@s:

He probado de eliminar todo el código que no sea de movimientos, sin tocar nada. Solo he eliminado el código que hace actuar el sensor ultrasónico y el servomotor. Y el código de los motores lo he puesto que haga un movimiento detrás del otro tal y como se ve a continuación:

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 (1000);
  digitalWrite (IN3, LOW);
  digitalWrite (IN1, LOW);
  delay(3000);

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

  digitalWrite (IN4, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
  analogWrite(ENA,50);
  analogWrite(ENB,50);  
  delay(200);
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, LOW);
  delay(3000);
  
  
  digitalWrite (IN4, HIGH); //Va hacia atrás
  digitalWrite (IN3, LOW);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW);
   analogWrite(ENA,50);
  analogWrite(ENB,50);  
  delay(500);
  digitalWrite (IN4, LOW);
  digitalWrite (IN2, LOW);
  delay(3000);
  

  
}


No hace nada, solamente pita la placa cuando tienen que arrancar los motores. Ahora probaré más cosas. Pero por lo que parece el código está mal.
  Responder
Umm, llegaste a hacerlo funcionar verdad? Controlando la velocidad digo
  Responder
Buenas a tod@s:

Así es. Por eso me mosquea. Lo que voy a hacer es comprobar el código que me funciona, comprobar conexionado e ir eliminando fallos o posibles errores durante esta tarde.
  Responder
Electromecánico escribió:Buenas a tod@s:

Así es. Por eso me mosquea. Lo que voy a hacer es comprobar el código que me funciona, comprobar conexionado e ir eliminando fallos o posibles errores durante esta tarde.

Al final me voy a comprar la placa esta, para hacer pruebas jajajaj
  Responder
El código parece estar bien, has probado de quitar la librería del servo, que no estuviese dando algún problema?

Es lo único que se me ocurre, o cambiar los pins pwm por otros a ver si así funciona.

Saludos
  Responder
Jero escribió:El código parece estar bien, has probado de quitar la librería del servo, que no estuviese dando algún problema?

Es lo único que se me ocurre, o cambiar los pins pwm por otros a ver si así funciona.

Saludos



Buenas a tod@s:

El servo nunca me ha dado problemas. Desde el principio que lo tengo puesto y ningún problema. Lo que si me dió problemas y por eso lo rechazé fue lo del timmer para evitar usar los delays.
  Responder
Buenas a tod@s:

Si subo a la placa este código, sin tocar nada más, ni cables ni nada 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);
}

Ahora lo voy a adaptar para el servo más el ultrasónico a ver que hace que tome medidas y que haga algo diferente en cada caso.
  Responder
Buenas a tod@s:

He probado de incluir todos los componentes en el código. Primero he hecho lo de incluir el servo y el sensor ultrasónico que tomase medidas, sin tenerlas en cuenta, en el código que me funcionaba la variación de velocidad.

Pero aunque arrancan los motores, no me varía la velocidad. En teoría tendrían que arrancar ir despacio y parar, y al cabo de unos segundos arrancar y acelerar la velocidad para seguidamente. Y una vez pasado unos segundos parar los motores e reiniciar el ciclo.

La verdad es que arrancan y paran una vez, y en lugar de volver arrancar para variar la velocidad se lo salta, y vuelve a repetir el ciclo :nuse:

Voy a probar lo que comenta bananacocodrilo de cambiar los INT.
  Responder
Has probado conectado por usb? Por serial?


Cuantos voltios tiene el driver? Si no recuerdo a 5V, no? Se podía conectar a 12 no? Haz probado? Quizá pwm necesita mas potencia!

Saludos!
  Responder
Buenas a tod@s:

Jero, tengo conectado el driver a 12V. Para así conectarlo todo a ese voltaje (Arduino + driver).

Pero lo que me toca las narices, es que con el código que me pasaste funciona, y sin cambiar nada, a la que lo adjunto a mí código con el Servo, ale... Funciona mal. Parece como si al juntar el código de los motores + el del servo se corrompiera o algo. Porque si solo lo hago con lo de los ultrasonicos, sin tener en cuenta las medidas, sino recuerdo mal, funcionaba bien
  Responder
Prueba de busca otra librería para el servo!
  Responder
Puedes hacer un pequeño dibujo de como tienes todo montado electronicamente?
  Responder
Buenas a tod@s:

Lamento haber tardado tanto en adjuntar el esquema del robot. Pero es que no he tenido demasiado tiempo este fin de semana, y estoy con algo de fiebre y estoy mucho tiempo en la cama. Pero ahora parece que me encuentro mejor y he aprovechado para hacer el esquema y subirlo.

[Imagen: EsquemaLabBot_zps2cd0396d.png]

Los pines del Arduino los quería poner ordenados pero al final me he líado y los he terminado conectando al arduino de forma desordenada, pero bueno... es para simbolizar que van conectados al Arduino.

Muchas gracias por vuestro apoyo.
  Responder
El servo es de los minis? o de los normales? Yo procuraria no alimentarlo con los 5V del arduino la verdad :S, por lo demas veo todo OK asi de primeras
  Responder
Lo veo bien el esquema!

Si no recuerdo mal el driver tenia unos jumpers, están correctos?

Tienes el datasheet del driver?

Saludos
  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