Calificación:
  • 1 voto(s) - 1 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino + Sensor Ultrasonido HC-SR04 + LCD
#1
Buenas a tod@s:

Este mediodía me ha llegado la pantalla LCD dos días antes de lo prevsito. Por lo tanto de coña. Venía desde Asturias, pero bueno, siempre es una alegría que te lleguen las cosas antes de lo previsto y no al revés.

Esta tarde he estado soldando los cables para conectar la pantalla LCD a falta de los pines macho, que sería lo logico. Pero las ansias son las ansias y quería probar y empezar a provar la pantalla.

Para empezar he descargado el ejemplo de Arduino y así también he entendido el funcionamiento del código. Todo ok

Después, ya que tenía el sonar y el código hecho de que me mostrase por la pantalla del PC la distancia medida, he modificado el código para daptarlo a la pantalla LCD y aquí tenemos el resultado

resim

(Clicar encima de la imagen para visualizar el vídeo)

Las barras que salen después de la medida porque son? Como las puedo quitar. Por si es de ayuda aquí os dejo el código:

Código:
/*  RS pin digital 12
    E pin digital 11
    D4 pin digital 5
    D5 pin digital 4
    D6 pin digital 3
    D7 pin digital 2
    R/W pin GND
    Resistencia variable 10k (+5V - GND)
    VO pin intermedio resistencia variable  
    Vss pin GND
    Vdd pin 5V
    A pin 5V
    K pin GND
    
   */
  
#include <LiquidCrystal.h> //Incorporamos libreria LCD
#include <Ultrasonic.h> // Incorporamos la libreria Ultrasonic
LiquidCrystal lcd(12, 11, 5, 4, 3,2); //Inicializamos la librería e indicamos cada pin donde está conectado
Ultrasonic ultraso (6, 7); //Declaramos los pines del ultrasonico (6 =>Trigger, 7 => Echo

int distancia; //Declaramos una constante
int pausa; //Declaramos una constante
void setup(){
  lcd.begin(16,2); //Indicamos cuantas columnas y cuantas filas tiene la LCD
  
  
}

  void loop(){
    lcd.setCursor(0,0); //Posicionamos el cursor en la columna 0, linia 1
distancia = ultraso.Ranging(CM); //Medimos la distancia del sonar
   lcd.print(" Distancia: "); //Comandos para ver en pantalla la distancia del obstaculo
    lcd.setCursor(0,1);
   lcd.print(distancia);
   lcd.println(" cm");    
  }

Espero que os guste, y espero que sea de ayuda para algun otro aficionado al Arduino.
Citar
#2
Buenas a tod@s:

Veo que el sonar solo me mide hasta medio metro, como puede ser eso??? (No hay ningun obstaculo en medio como mínimo en dos metros)



Muchas gracias
Citar
#3
Lo de los caracteres extraños seguramente sea por el salto de linea que estas añadiendo con println. Usa dos print y listo:

lcd.print(distancia);
lcd.print(" cm");

En cuanto a lo de la distancia, deberías de poder medir mas, a mi me cubre desde el suelo hasta el techo, aunque la lectura varia mucho, 30cm para arriba para bajo.

Saludos.
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
Citar
#4
Para medir más distancia, debes de ir al archivo ultrasonic.cpp que encontrarás dentro en la libreria que te has descargado para usar el sensor de ultrasonido, junto con otros tres archivos de texto, ahí encontrarás una linea llamada:
Código:
Time_out=3000;  // 30ms 5 metros // 3ms 50cm
Sólo tienes que cambiar el valor por 30000, así podrás medir distancias de hasta 517cm.
El problema llega que a cierta distancia el sensor no es tan preciso, mi récord ha sido 289cm, a ver si me superas Guiño jajajaja

En cuánto al código, lo que te ha dicho el compañero giltesa, usa dos print y listo, quedaría así:
Código:
void loop(){
    lcd.setCursor(0,0); //Posicionamos el cursor en la columna 0, linia 1
distancia = ultraso.Ranging(CM); //Medimos la distancia del sonar
   lcd.print(" Distancia: "); //Comandos para ver en pantalla la distancia del obstaculo
    lcd.setCursor(0,1);
   lcd.print(distancia);
   lcd.print(" cm");
  


  }
Citar
#5
Anda si es mi librería o una derivada Lengua

Recomiendo descargar la librería de: https://github.com/JRodrigoTech/Ultrasonic-HC-SR04

Tendré que añadirle un ejemplo más para especificar la posibilidad de modificar el time out de la función pulsein(). Que me desvió :lol:


No hace falta modificar la librería, puedes editar la distancia máxima del sensor, simplemente sustituye esta linea:

Código:
Ultrasonic ultraso (6, 7); //Declaramos los pines del ultr...

Por esta:

Código:
Ultrasonic ultrasonic(6,7,3000); // (Trig PIN,Echo PIN, Max.TimeOut in µsec )

Luego sustituye los 3000 microsegundos con el tiempo máximo de timeout que tu necesites. La formula para calcularlo es: centímetros * 58 = Max.TimeOut

Un saludo Guiño
Citar
#6
Coño que pequeño es el mundo....
Siempre siguiéndote y resulta que estas en este foro también!!!!

Sí, en mi caso yo tengo tu librería , desconocía el truquillo que dices para cambiar el timeout.
Todo un placer encontrarme contigo jrodrigo!!
Citar
#7
Buenas a tod@s:

Los caracteres raros los eliminé poniendo espacios después del texto.

He estado mirando lo de la distancia. He probado lo que me habéis comentado de añadir la distancia máxima (6, 7, 3000), y nada. Todo continua igual. Y muevo el sensor y nada... da siempre como máximo una medida de 51 cm como máximo Triste

El sensor debería ir bien ya que lo prové cuando me llegó hace un mes, y estuve mostrando las distancias por la pantalla del PC, ahora simplemente he modificado la pantalla por donde quiero que me lo muestre.

He cargado el sketch que tenía heho con solo el sensor ultrasónico y que me lo mostrase por la pantalla del PC, y todo correcto
lee hasta 229cm (Porque hay una pared)

Como es que con el display solo lee hasta 51cm? En el sketch que he cargado no utilizan la librería Ultrasonic.h, lo hacen con temporizciones... pero bueno..

En cambio, en los sketch que utilizo la librería Ultrasonic.h siempre me mide hasta un máximo de 51cm :dale2:

Código Servo+ultrasonidos (mide solo hasta 51cm porque utilizo librería)

Código:
#include <Servo.h>      //Incluimos la libreria Servo
#include <Ultrasonic.h>  //Incluimos la libreria Ultrasonico

int led=13;
Servo servo1;          //Declaramos nuestro servo
Ultrasonic ultraso (6, 7);  /*Declaramos los pines del ultrasonico
6 =>Trigger 7=>Echo*/
int distancia;          //Declaramos una constante
int pausa;          //Declaramos una cosntante


void setup (){
pinMode(led,OUTPUT);
servo1.attach(8);    //Declaramos el pin de nuestro servo
Serial.begin(9600);
}

void loop()
{
  distancia =  ultraso.Ranging(CM); //Medimos la distancia del Ultrasonico
if (distancia < 10){              //Si la distancia es menor a 10 cm el servo se situa a 90º
pausa = ultraso.Ranging(CM) *10;
servo1.write (90);
digitalWrite(led, HIGH);
   delay(1000);
}
else if (distancia >10){    //Si la distancia es mayor a 10 cm el servo se situa donde le indica la siguiente orden del programa
servo1.write (0);          //Ponemos el servo a 0º
digitalWrite(led,LOW);
delay(1000);
}

distancia =  ultraso.Ranging(CM);
if( distancia < 10){          //Si la distancia es menor a 10 cm  
pausa = ultraso.Ranging(CM) *10; //Decimos que el servo se ponga a 90º
servo1.write (90);
digitalWrite(led,HIGH);
   delay(1000);
}
else if (distancia >10){
servo1.write(180);
digitalWrite(led,LOW);
delay(1000);
}
Serial.print("  Distancia estimada: "); //Comandos para ver en pantalla la distancia al cual está el obstaculo
Serial.print(distancia);
Serial.println(" cm");


}

Codigo Sensor ultrasico sin librería (Mide correctamente)

Código:
/*
Ejemplo de como funciona el sensor de distancia por ultrasonido
Por la consola muestra la distancia y cuando esta llega a un
punto determinado se enciende un led.

HC-SR04 conexiones:
  VCC al arduino 5v
  GND al arduino GND
  Echo al Arduino pin 7
  Trig al Arduino pin 8
*/

#define echoPin 7
#define trigPin 6
#define LEDPin 13
long duration, cm;

void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(LEDPin, OUTPUT);
}

void loop(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

cm = microsecondsToCentimeters(duration);

Serial.print ("Milisegundos: ");
Serial.print(duration);
Serial.print("  Distancia estimada: ");
Serial.print(cm);
Serial.println(" cm");

delay(1000);
}

long microsecondsToCentimeters(long microseconds){
  // La velocidad del sonido a 20º de temperatura es 340 m/s o
  // 29 microsegundos por centrimetro.
  // La señal tiene que ir y volver por lo que la distancia a
  // la que se encuentra el objeto es la mitad de la recorrida.
  return microseconds / 29 /2 ;
}

Qué hay mal? Me gustaría utilizar la librería ya que acorta el código y lo facilita.

Muchas gracias de antemano.
Citar
#8
Buenas a tod@s:

He probado de actualizar la librería, ya que se han dado casos ya conocidos por internet iguales que en el mio, y dicen que la actualización 3 funciona.

He sustituido la librería pero nada, sigue igual. Qué puede ser?
Citar
#9
@Roberto la verdad es que descubrí este foro hace poquito, pero me a gustado mucho el ambiente de gente que hay la pena es no tener más tiempo para participar en el =/
-----

Mi librería esta capada a 51cm porque la función pulseIn() tiene por defecto un timeout de 1 segundo, esto provocaba que el arduino se quedara esperando 1 segundo cada vez que al sensor no podía medir, pero aunque los venden como que pueden medir 4 metros hice pruebas y eran incapaces ni de medir 50cm por eso decidí capar el timeout. De esta manera si estás haciendo un robot y necesitas una respuesta aún más rapida capas más el timeout. Ya que sin capar el timeout seria de 1 segundo y para cuando quiera reaccionar el arduino el robot ya se a estampado Meparto

@Electromecánico Mira que tengas bien copiada la librería ya que si la has descargado de github el zip tiene muchas carpetas que siempre pueden llevarte a una confusión, tendrías que tenerlo de esta manera:
  • Libraries
    • Ultrasonic (Esta es la carpeta que hay que copiar)
      • examples
      • keywords.txt
      • Ultrasonic.cpp
      • Ultrasonic.h

Ahora si vas a ejemplos del IDE de Arduino te aparecerá una carpeta que pone Ultrasonic y dentro de ella hay un ejemplo de un sensor de ultrasonidos y una pantalla LCD de 16x2 caracteres, el ejemplo se llama LCD.

Ahora solo comprueba las conexiones que estén bien hechas y debería funcionarte.

Como anécdota un día probando uno de estos sensores me topé con uno que me devolvía medidas aleatorias, problema? Una bolita de estaño dentro del emisor de ultrasonidos :lol:

resim
Citar
#10
JRodrigo escribió:@Roberto la verdad es que descubrí este foro hace poquito, pero me a gustado mucho el ambiente de gente que hay la pena es no tener más tiempo para participar en el =/
-----

Mi librería esta capada a 51cm porque la función pulseIn() tiene por defecto un timeout de 1 segundo, esto provocaba que el arduino se quedara esperando 1 segundo cada vez que al sensor no podía medir, pero aunque los venden como que pueden medir 4 metros hice pruebas y eran incapaces ni de medir 50cm por eso decidí capar el timeout. De esta manera si estás haciendo un robot y necesitas una respuesta aún más rapida capas más el timeout. Ya que sin capar el timeout seria de 1 segundo y para cuando quiera reaccionar el arduino el robot ya se a estampado Meparto

@Electromecánico Mira que tengas bien copiada la librería ya que si la has descargado de github el zip tiene muchas carpetas que siempre pueden llevarte a una confusión, tendrías que tenerlo de esta manera:
  • Libraries
    • Ultrasonic (Esta es la carpeta que hay que copiar)
      • examples
      • keywords.txt
      • Ultrasonic.cpp
      • Ultrasonic.h

Ahora si vas a ejemplos del IDE de Arduino te aparecerá una carpeta que pone Ultrasonic y dentro de ella hay un ejemplo de un sensor de ultrasonidos y una pantalla LCD de 16x2 caracteres, el ejemplo se llama LCD.

Ahora solo comprueba las conexiones que estén bien hechas y debería funcionarte.

Como anécdota un día probando uno de estos sensores me topé con uno que me devolvía medidas aleatorias, problema? Una bolita de estaño dentro del emisor de ultrasonidos :lol:

resim

Buenas a tod@s:

Muchas gracias por tu explicación tan detallada.

Lo de copiar la nueva librería lo había hecho correctamente. Los pines del PING los cambia en lugar del 6 y 7 por 8 y 9. Pero aún y haciendo los cambios pertinentes no me da los frutos esperados. Al contrario, la pantalla se vuelve loca o simplemente no muestra nada por el LCD.

Sé que como último recurso tengo la opción de prescindir de la biblioteca, pero no me gusta esta idea.

Alguna solución se os ocurre? Ahora después de comer, volveré a mirarlo, pero de momento no he obtenido resultados.
Citar
#11
Buenas a tod@s:

He probado este ejemplo que venía con la carpeta de la "actualización", los pines son el 5 y el 6. Y me da lo mismo: 51 cm

Código:
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( http://www.jra.so )
// more info at http://www.ardublog.com
// Wiki: https://github.com/elrodri/Ultrasonic-HC-SR04/wiki/Plug-&-Play

#include <Ultrasonic.h>

Ultrasonic ultrasonic(5,6); // (Trig PIN,Echo PIN)

void setup() {
  Serial.begin(9600);
  pinMode(4, OUTPUT); // VCC pin
  pinMode(7, OUTPUT); // GND ping
  digitalWrite(4, HIGH); // VCC +5V mode  
  digitalWrite(7, LOW);  // GND mode
}

void loop()
{
  Serial.print(ultrasonic.Ranging(CM)); // CM or INC
  Serial.println(" cm" );
  delay(100);
}

Edito el mensaje anterior ya que me he quedado flipando. Con el ejemplo de codigo anterior, he quitado la alimentación al sensor y.... voilá!!! Continua dando 51 cm!!!! No tendría que dar 0 o nada???

Solo me da problemas cuando utilizo un sketch con la biblioteca de Ultrasonic. Si cargo un codigo sin la librería todo ok. Vamos... que el problema está en la librería, pero donde??? U.U He probado lo del 3000, lo de cargar la librería un ejemplo hecho y nada. Simplemente, el hecho de utilizar la librería me da problemas. Y en teoría he descargado la actualización 3 que ya no da los problemas que comento.
Citar
#12
La verdad, que es un poco raro, insistiré en el archivo, ya que me parece muy raro todo...
Yo el archivo Ultrasonic.cpp le tengo de esta manera:
Código:
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( http://www.jra.so )
// more info at http://www.ardublog.com
// GitHub: https://github.com/elrodri/Ultrasonic-HC-SR04

#if ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

#include "Ultrasonic.h"

Ultrasonic::Ultrasonic(int TP, int EP)
{
   pinMode(TP,OUTPUT);
   pinMode(EP,INPUT);
   Trig_pin=TP;
   Echo_pin=EP;
   Time_out=30000;  // 30ms 5 metros // 3ms 50cm
}

Ultrasonic::Ultrasonic(int TP, int EP, long TO)
{
   pinMode(TP,OUTPUT);
   pinMode(EP,INPUT);
   Trig_pin=TP;
   Echo_pin=EP;
   Time_out=TO;
}

long Ultrasonic::Timing()
{
  digitalWrite(Trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  duration = pulseIn(Echo_pin,HIGH,Time_out);
  if ( duration == 0 ) {duration = Time_out;}
  return duration;
}

long Ultrasonic::Ranging(int sys)
{
  Timing();
  if (sys) {
  distacne_cm = duration /29 / 2 ;
  return distacne_cm;
  } else {
  distance_inc = duration / 74 / 2;
  return distance_inc; }
}
El sketch que tu has puesto, a mí tampoco me funciona, en cambio quitando las instrucciones en el void setup me va todo como la seda, alimento el sensor con los 5v y masa del arduino, no declarando los pines 4 y 7 como Vcc y GND, te dejo el código
Código:
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( http://www.jra.so )
// more info at http://www.ardublog.com
// Wiki: https://github.com/elrodri/Ultrasonic-HC-SR04/wiki/Plug-&-Play

#include <Ultrasonic.h>

Ultrasonic ultrasonic(6,7); // (Trig PIN,Echo PIN)

void setup() {
  Serial.begin(9600);

}

void loop()
{
  Serial.print(ultrasonic.Ranging(CM)); // CM or INC
  Serial.println(" cm" );
  delay(100);
}
EDITO:
Respecto a lo que dices, que te da 51cm con el sensor desconectado, te da ese valor porque es la máxima distancia que esta configurado para medir con el (Time_out=3000Guiño, en mi caso a 30000, me da 517cm por ejemplo. Eso pasa porque al no encontrar ningún obstáculo, el arduino te da la referencia máxima que tiene predeterminada, que en tu caso seguro que tienes de timeout 3000, por tanto siempre dará la máxima medida.

A mí ayer probando mi montaje, resultaba que tenía dos archivos Ultrasonic.cpp, uno era residual de otra librería que no se me llegó a borrar y otro era el archivo que reamente usa la librería que tengo instalada, revisa esto que comento por si se da la casualidad que estas modificando otro archivo .cpp que tu librería actual no utiliza.
Comenta con lo que sea
Citar
#13
Buenas a tod@s:

Pues lo que he hecho es copiar el codigo de tu librería y copiarlo en la mía y sustituir la líbrería y funcionó!!! :aplauso:

Ahora toca hacerlo con todos los códigos que tengan la librería de ultrasonidos.

He borrado el codigo de mi librería y he copiado el tuyo. Pero cuando guardo y cierro el programa y lo vuelvo a abrir me vuelve aparecer mi código.

Como lo puedo hacer para que se me mantenga tu código???

Pasame el link de descarga de tu librería y así suprimiendo la mía completamente y copiando toda la tuya me sale correctamente. Porque borrando solo el código no funciona.

Gracias.
Citar
#14
Prueba a pegar en el archivo.cpp lo que te he puesto y cierras el documento guardando los cambios, después cierra todas las ventanas de arduino y más tarde vuelve a cargar el sketch que te funciona, no debería darte más problema.
A ver si hay suerte
Citar
#15
El enlace de descarga es éste: https://github.com/elrodri/Ultrasonic-HC...master.zip
es el de la página del compañero JRodrigo
Citar
#16
Buenas a tod@s:

Problema solucionado. No sé como, pero al final lo conseguí. Después de tantos cambios no sé como funcionó, pero lo conseguí Confundidoing:

Muchas gracias y ahora a continuar practicando Confundidois1:
Citar
#17
Me alegro, para eso estamos.
Un saludo
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
Pregunta Es MQ-2 sensor de humo fiable Paquechu 2 691 13-08-2017, 10:00 AM
Último mensaje: Paquechu
  mega sensor shield v2.0 jhon_bishop 2 1,058 20-10-2015, 07:42 PM
Último mensaje: ebludt
  LCD sensor distancia numeros de varias cifras Asclem 10 1,923 31-07-2015, 11:11 AM
Último mensaje: calpanxo
  Problemas con Sensor de ultrasonido mchisnerman 3 1,785 17-08-2014, 10:19 PM
Último mensaje: biketrial981
  Código para cabeza robot (sensor ultrasonico + servo) Electromecánico 1 5,956 01-06-2014, 10:54 AM
Último mensaje: Electromecánico