En esto reto hay que hacer un radar de velocidad que pueda registrar la velocidad de coches de juguete.
Se trata de un reto de nivel iniciación.
Reto #11: Radar de velocidad con Arduino y mBlock.
El reto lanzado en el twitter de Juegos Robótica era el siguiente:
Este reto se puede resolver básicamente de dos maneras, y aunque ninguna de ellas funcione exactamente como un radar de velocidad real, nos devolverán la velocidad de un objeto que se acerque a nuestro radar.
La mayoría de radares funcionan a través de micro ondas que varían su frecuencia al rebotar en un vehículo según la velocidad a la que vaya, pudiendo calcular por tanto la velocidad real.
Una forma sería utilizar dos detecciones (ultrasónicos, infrarrojos, capacitivos, fotocélulas) separadas una distancia concreta por las que pasará el coche. Cronometrando el tiempo que pasa entre una detección y otra, y siendo conocida la distancia, podemos calcular la velocidad. Así funcionan algunos radares de tramo y de bandas.
La otra manera de resolver el reto del radar con Arduino sería medir cuanta distancia recorre el coche en un tiempo determinado. Esta es la opción que he elegido yo y que podéis ver en el vídeo.
Mediante un sensor de ultrasonidos tomaremos dos medidas de distancia en un intervalo de tiempo concreto, en mi caso una décima de segundo. Restando las distancias podemos saber la distancia recorrida en esa décima de segundo y por lo tanto calcular la velocidad.
Finalmente se muestra la medida en un display de cristal líquido mediante comunicación I2C.
El circuito básico utilizado es el siguiente, aunque se podría utilizar otro tipo de pantalla o un sensor de ultrasonidos de 3 pines en vez de 4 con trigger y echo. No olvides alimentar tus componentes aunque no aparezca en el esquema con 5v y conectar a masa.
Podéis ver el vídeo de la resolución en una placa Arduino Uno programada a través de mBlock (Scratch) por bloques.
Si queréis ser vosotros los que lancéis el reto con Lego Mindstorms EV3, mBot o Arduino no tenéis más que poneros en contacto o dejar un comentario.
La semana que viene tendremos nuevo reto, estad atent@s!
Muy buenas Dani.
En primer lugar, felicitarte por los excelentes vídeos que estás realizando.
Estoy intentando realizar esta actividad, pero tengo problemas con la subida a Arduino. El error que tengo es el siguiente:
C:\Program Files\mBlock\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files\mBlock\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files\mBlock\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files\mBlock\Arduino\hardware\arduino\avr\libraries\Wire -IC:\Program Files\mBlock\Arduino\hardware\arduino\avr\libraries\SoftwareSerial C:\Users\xxx~1\AppData\Local\Temp\build4291019640307635474.tmp\project_RadarMBOTPoliceconArduino5_2.cpp -o C:\Users\Jxxx~1\AppData\Local\Temp\build4291019640307635474.tmp\project_RadarMBOTPoliceconArduino5_2.cpp.o
project_RadarMBOTPoliceconArduino5_2.ino:5:31: fatal error: LiquidCrystal_I2C.h: No such file or directory
compilation terminated.
Error de compilaci髇
Supongo que será un problema de librería de “LiquidCrystal_I2C”, ya que en la ventana donde tenemos todos los bloques de código, en Robots, a ti te aparece “LCD with I2C interface” y a mi LCD1602IIC.
Espero tu respuesta.
Gracias de antemano
Hola José,
En mBlock entra en “extensiones” y una vez dentro pulsa “administrar extensiones” En la casilla “buscar” pon “I2C”o “LCD2 e intenta buscar la extensión “LCD with I2C interface”. Luego le das a “añadir extensión” y ya la deberías tener disponible.
En principio perfectamente te debería servir otra librería, pero si que parece que el problema está en la librería. Inténtalo y me dices.
Saludos!
Dani S.
Muy buenas de nuevo,
No he conseguido arreglarlo. Si que he importado la librería pero sigue dando el mismo fallo a la hora de compilar. He probado hacerlo con el MBOT pero no me calcula bien la velocidad. Si te paso una captura del código me podrías ayudar? Si quieres te lo dejo en los comentarios de la página de Facebook.
Saludos
Hola Jose!
Te envío un correo para estar en contacto y que me puedas enviar el código para probarlo.
Saludos!
Dani S.
buenas me puede ayudar porfa
Dime cómo puedo ayudarte y lo intento.
Hola Danni, tengo el mismo problema que JULIO says, hay manera de que puedas apoyar?
Hola Mario,
No veo cuál era el problema de Julio, pero con este reto hay personas que tienen problema con la librería de Arduino para manejar el display.
Podéis intentar reinstalar la librería directamente en el IDE de Arduino en vez de que venga dada por la extensión de mBlock o se puede utilizar otra extensión, o mostrar la velocidad de otra manera, pero el objeto del reto era entender cómo poder medir velocidad tomando distancias a lo largo del tiempo.
Ojalá pudiera dedicar más tiempo a vuestra dudas, pero intento aclarar las preguntas concretas que se plantean. Para ayudaros a configurar correctamente librerías en Arduino necesitaría más tiempo, y ese tipo de soporte está únicamente disponible para alumnos de la plataforma.
Saludos
Hola
Me sale este mensaje al momento de subir los comando
‘POSITIVE’ was not declared in this scope
Hola José,
Te está apareciendo un problema con la librería. ¿Tenías instalada anteriormente la librería “LiquidCrystal”o “LiquidCrystal_I2C”? Si tenías previamente la segunda instalada puede que esté entrando a utilizar esa en vez de “LiquidCrystal”, y la variable “positive” no la reconoce. Si es así prueba a desinstalar la librería.
También te aconsejo la lectura del tutorial de tmancebo sobre la instalación de librerías para usar LCD con mBlock en http://www.makeblock.es/foro/topic/407/lcd-con-arduino-y-mblock
Hola Dani! Soy José Luis, ya había contactado contigo. Decirte que he descargado una librería “IRremote” para controlar un sensor infrarrojo VS1838 B que si uso el IDE de Arduino me lo reconoce perfectamente pero el mBlock me dá problemas ya al compilarlo. Quizás esté usando mal los bloques de la librería, no lo sé. Si quieres luego por correo te envío foto de lo que he hecho.
Lo pensaba usar para leer los códigos HEXA que llegan al sensor desde un mando a distancia y que el programa ponga a “1” o “0” algunas salidas digitales. Cualquier ayuda es bienvenida!!
Hola José Luis,
Puede que el problema esté en la forma de usar los bloques, pero efectivamente sería mejor ver la captura y el programa. Estoy atento al correo.
Saludos!
Dani S.
Hola, me interesa mucho este proyecto (reto # 11), lo quiero aplicar para medir la velocidad de una pelota de fútbol.
Me podrían mandar el esquema de cómo armar el circuito y cómo conectarlo ?
Por favor es para un proyecto de la escuela
Gracias.
Daniel.
Hola Daniel,
He añadido un esquema a la entrada, tan sólo ten en cuenta que debes alimentar los componentes con 5v y conectar a masa (GND) ya que no aparece en el esquema.
Respecto al proyecto no tengo claro que vayas a ser capaz de medir la velocidad de una pelota a gran velocidad. El paso de la pelota cerca del sensor tendría que ser muy preciso y aún así debido a la gran velocidad no tengo claro que diese tiempo a tomar las dos mediciones necesarias para hacerlo según el vídeo.
Saludos,
Dani S.
Hola, lo que pasa es que me sale el mismo error sobre que la libreria de “LiquidCrystal”, sin embargo ya descargue la extension “LCD with I2C interface” y sigue sin cargarme el programa a Arduino, no se cual sea la solución que usted pueda dar.
La instalación de librerías a veces dan mucha guerra en Arduino, y a esto se añade que la instalación se hace a través de una extensión de mBlock.
Una solución es intentar instalar la librería manualmente a través del IDE de Arduino independientemente de mblock, y luego ya compilar el programa con mblock.
Saludos
Hola Dani, en verdad necesito tu ayuda! estoy programando en Arduino y me sale: stray ´\342´ in program, que debería hacer?, espero tu pronta respuesta, gracias.
Hola Carlos,
No puedo ayudarte con algo tan concreto, pero este tipo de errores suelen venir por errores de sintáxis o por la copia de caracteres especiales de fuentes diferentes en un “copia y pega”. Lamento no poder ser de más ayuda.
Saludos
Hola Dani, estoy programando en arduino y me sale el problema: stray´\342´ in program; podrías ayudarme? espero tu pronta respuesta
Hola Carlos,
No puedo ayudarte con algo tan concreto, pero este tipo de errores suelen venir por errores de sintáxis o por la copia de caracteres especiales de fuentes diferentes en un “copia y pega”. Lamento no poder ser de más ayuda.
Saludos
Buenas. me encotrado este post y me parece muy interesante. Lo que necesito es si no tenes el diagrama de Conexion para armar todo. gracias muy bueno
Hola Guido,
En la imagen de arriba tienes el diagrama de conexión. Simplemente hay que conectar LCD y sensor de ultrasonidos.
Saludos
Gracias no me percate. Entonces no usas solo.los pines de Arduino para conectar el LCD. Y tampoco transistores o resistencias
Para este proyecto no hace falta nada más, tanto el LCD como el sensor de ultrasonidos ya están adaptados.
Buenas tardes me pasa lo mismo que jose says , no me deja subir el programa a arduino y eso que hiso lo mismo que el vídeo espero me puedas colaborar muchas gracias.
Hola Andrés,
Lo que os suele pasar a muchos con este proyecto es que la librería del LCD no se os queda correctamente instalada en Arduino. Independientemente de la programación que vemos en el vídeo si no tenéis bien instalada la librería en Arduino os va a dar un error de compilación.
Le puedes dar a “Editar con el IDE de Arduino” y lo puedes intentar compilar, pero si el error que da es que no encuentra la librería del LCD el problema está claro y tenéis que intentar resolverlo independientemente de la programación, no hay una respuesta general cuando hay un problema de instalación de librerías.
Saludos,
Hola Dani.
Buenas tardes. Quería saber si se puede implementar que en determinada velocidad esta mande una señal que accione un servomotor no se si sea viable poder implementar eso;¿crees que puedas ayudarme con eso? por favor, espero pronta respuesta de antemano gracias.
Hola,
Sería perfectamente posible. Podríamos indicar la velocidad por medio de un servo en una esfera similar a los velocímetros de los coches.
El reto 25 te puede servir de ayuda ya que trata precisamente ese tema.
Sería una muy buena opción para todas las personas que tienen problema con la librería para el display LCD. Quizá lo incluya como reto futuro.
Saludos
Buenos días, el proyecto es super interesante, pero mi duda va por como puedo elegir el tipo de placa arduino para este reto, con que nombre la puedo buscar o conseguir
Gracias de antemano
Hola Jeancarlo,
Lo puedes hacer con una placa Arduino UNO o con cualquier clon de ella, y también con otras placas Arduino como por ejemplo la Arduino Nano, pero si quieres hacerlo por bloques tal y como se muestra en el vídeo con mBlock te recomiendo la Arduino UNO.
Saludos
hola que acsorios necesito para el proyecto
Hola Santiago,
Para este proyecto se necesita una placa Arduino UNO, un sensor de ultrasonidos y una pantala LCD de 16×2 caracteres.
Saludos
Genial justo esto es lo que me faltaba para terminar mi trabajo, al fiiiiin T.T GRACIAS!
Me alegra que le hayas podido sacar provecho, saludos.
Me podés pasar el circuito???
Hola Ezequiel,
Tienes el circuito en el artículo del reto, pero te dejo enlace directo: https://juegosrobotica.es/wp-content/uploads/radar-velocidad-arduino.jpg
Saludos
no tenes un codigo para un display de 16×2, porque ese no nos sirve.
Precisamente está hecho con un display 16×2…
tengo un error y no se cual es podrias ayudarme, gracias
Files\mBlock\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files\mBlock\Arduino\hardware\arduino\avr\libraries\Wire -IC:\Program Files\mBlock\Arduino\hardware\arduino\avr\libraries\SoftwareSerial -IC:\Program Files\mBlock\Arduino\portable\sketchbook\libraries\LiquidCrystal_I2C-1.1.2 C:\Users\Usuario\AppData\Local\Temp\build8348563954025710442.tmp\project_dd210_2.cpp -o C:\Users\Usuario\AppData\Local\Temp\build8348563954025710442.tmp\project_dd210_2.cpp.o
project_dd210_2.ino:12:57: error: ‘POSITIVE’ was not declared in this scope
‘POSITIVE’ was not declared in this scope
Hola Daniela,
Ya te respondí por correo. Parece que tienes instalada la estensión/librería errónea. Revísalo porque ese error ya se ha reportado por utilizar otra librería para el LCD.
Si o si necesito usar Mbloc??
Si lo quieres hacer igual que nosotros puedes utilizar mBlock, pero se podrían utilizar otros entornos de programación por bloques o el IDE de Arduino.
HOLA DANI COMO PUEDO CONSEGUIR EL CÓDIGO ? ya te pregunte en YT pero creo que andas muy ocupado y mejor te escribí por aquí. SALUDOS
Hola Daniel,
Te respondí también por YouTube. Las soluciones paso a paso con la programación de los retos solo se ofrecen a alumnos de nuestra plataforma. Dale un vistazo por si puede ser de ayuda: https://juegosrobotica.es/plataforma-cursos/
Saludos y gracias por contactar.
El display tiene conectado ese módulo de 4 pines???
Efectivamente. Ese modulo que comentas es el que incluyen los displays que incorporan comunicación I2C.
//ASI ANADA GENTE FIJENSE QUE CORREGI ALGUNAS COSAS.ESPERO LES SIRVA–NANCY—-
ANA#include
#include
#include
#include
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
double DIST1;
double DIST2;
double VEL;
LiquidCrystal_I2C lcd(0x27,16,2);
float getDistance(int trig,int echo){
pinMode(trig,OUTPUT);
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
pinMode(echo, INPUT);
return pulseIn(echo,HIGH,30000)/58.0;
}
void setup(){
// Inicializar el LCD
lcd.init();
//Encender la luz de fondo.
lcd.backlight();
lcd.begin(16, 2);
}
void loop(){
lcd.clear();
lcd.setCursor( (4) – 1, (1) – 1 );
lcd.print( “RADAR ” );
lcd.setCursor( (4) – 1, (2) – 1 );
lcd.print( “DE VELOCIDAD” );
DIST1 = 0;
DIST2 = 0;
VEL = 0;
while(!((getDistance(8,9)) < (60)))
{
_loop();
}
DIST1 = getDistance(8,9);
_delay(0.1);
DIST2 = getDistance(8,9);
_delay(0.1);
VEL = ((DIST1) – (DIST2)) / (0.1);
_delay(0.5);
lcd.clear();
lcd.setCursor( (2) – 1, (1) – 1 );
lcd.print( "SU VELOCIDAD" );
lcd.setCursor( (2) – 1, (2) – 1 );
if (VEL <0){
VEL = VEL*(-1);
}
lcd.print( VEL);
lcd.setCursor( (8) – 1, (2) – 1 );
lcd.print( "CM/SEG" );
_delay(3);
lcd.clear();
lcd.setCursor( (2) – 1, (1) – 1 );
lcd.print( "SU VELOCIDAD" );
lcd.setCursor( (2) – 1, (2) – 1 );
lcd.print( VEL * 0.036 );
lcd.setCursor( (8) – 1, (2) – 1 );
lcd.print( "KM/H" );
_delay(3);
_loop();
}
void _delay(float seconds){
long endTime = millis() + seconds * 1000;
while(millis() < endTime)_loop();
}
void _loop(){
}
Gracias Nancy, seguro le es de gran ayuda a mucha gente.
Por si sirve de ayuda, hice un proyecto de arduino con mBlock donde necesitaba usar el LCD I2C, donde funcionó todo correctamente y al abrir el código en Arduino (IDE) me daba error. Al final se solucionó cambiando la librería de LCD, entrando en la carpeta donde está instalado el programa (tanto mBlock como Arduino) y pegando la librería nueva. (NewLiquidCrystal). Os dejo el link de descarga:
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
(Si copiamos toda la carpeta descomprimida da error, solo hay que pegar en la carpeta librerías la última carpeta que contenga los códigos. Para encontrar la carpeta destino (donde se pega lo que hemos descargado) hacer clic con botón derecho encima del icono de mBlock y en “abrir ubicación del archivo”, buscar carpeta libraries, sacamos la antigua carpeta liquidcrystal y pegamos NewLiquidCrystal.
Con esto no he vuelto a tener ningún problema con la LCD, ni en mblock ni en IDE de Arduino.
Saludos
Antonio
en los campos include que va?
Se incluyen las librerías Arduino.h, Wire.h, SoftwareSerial.h y LiquidCrystral_I2C.h, pero no todas son necesarias aunque mBlock las inclya al transformar desde bloques.
porque me da error en esta línea ” VEL = ((DIST1) – (DIST2)) / (0.1);” esto me dice” exit status 1
stray ‘\342’ in program”
Es probable que sea por copiar y pegar el código desde la web. Hazlo tecleando línea a línea porque te está cogiendo algún carácter unicode. Si no es eso no sé qué puede ser.
una pregunta el void _loop(){ } va bacio ?
una preunta mas que funcion tiene el while? while(!((getDistance(8,9)) < (60)))
{
_loop();
}
lo que pasa que cuando lo dejeo en el codigo no me muestra nada en la pantalla serial
Hola soy nuevo en arduino y no entiendo mucho del tema pero alguien me podria pasar el codigo que funcione porfavor , me salen muchos errores k no se resolver.
Gracias.
Hola Alejandro,
Accede a la plataforma de cursos para aprender con seguridad la programación de Arduino por bloques. Con la opción con soporte tendrás nuestro seguimiento para acompañarte en tu aprendizaje sorteando estos problemas.
Saludos
solo quiero aprobar fisica con el codigo me vale , gracias
Crea tu propio código y demuestra a tu profesor que entiendes que la velocidad es una relación del espacio recorrido en un tiempo determinado, luego lo expresas en unidades internacionales y ya lo tienes.
Si a parte de física quieres aprender a programar, que te será más útil que la física seguramente, puedes apuntarte a la plataforma.
En los comentarios tienes también código de otros usuarios que te puede servir.
Saludos y mucha suerte.
este radar para medir velocidades con este sensor se tiene un limite de velocidades es decir si ouede medir lanzamientos de pelotas de basesbol o cosas asi
No creo que pueda servir para algo así, sobre todo por la dificultad de captar la pelota con el sensor de ultrasonidos.