Hoy os traigo una versión mejorada del sensor de parking que ya os mostré en un post anterior, pero esta vez para obtener la distancia vamos a utilizar un sensor ultrasónico impermeable JSN-SR04T. Además vamos a trabajar con dos librerías diferentes, “NewPing.h” y “Ultrasonic.h”, que se pueden descargar desde este enlace y de esta manera obtener dos códigos idénticamente funcionales.
El sensor JSN-SR04T es un sensor de distancia que utiliza ultrasonidos (sonar) para determinar la distancia a la que se encuentra de un objeto. Destaca por su pequeño tamaño, bajo consumo energético, buena precisión y especialmente por su resistencia al agua. Contiene toda la electrónica necesaria para realizar la medición. A continuación os dejo una tabla con las especificaciones técnicas más relevantes de este sensor.
El sensor tiene un funcionamiento muy simple, es decir, emite un pulso de sonido (TRIG), después mide la anchura del pulso de retorno (ECHO), y por último se calcula la distancia a partir de las diferencias de tiempos entre el TRIG y ECHO, aunque no debemos de preocuparnos de esto en exceso puesto que las dos librerías anteriormente mencionadas se van a encargar directamente de esta tarea, facilitándonos en gran medida el uso del sensor ultrasónico impermeable JSN-SR04T. El funcionamiento no se ve afectado por la luz solar o material negro, aunque los materiales blandos acústicamente como tela o lana pueden ser difíciles de detectar. Es perfecto para aplicaciones donde el sensor va a estar expuesto a la intemperie, como es nuestro caso.
Cualquiera de los dos códigos que os dejo más abajo, funcionan de una manera idéntica. El sistema va a activar un «Zumbador» cuando el objeto se encuentra a una distancia inferior o igual a la distancia configurada dentro de la variable “distancia_Alarma», que en nuestro caso es de 30 cm. Cuando la distancia supere dicho valor (distancia_Alarma), el zumbador permanecerá desactivado. El sistema está dotado de un pulsador y de un LED indicador para controlar el modo parking, es decir, que la funcionalidad del modo parking se active únicamente cuando nosotros lo necesitemos, además de encenderse un LED indicador de modo. Además, se incluye un display de 4 dígitos y 7 segmentos con controlador TM1637 que nos va a mostrar la distancia en centímetros cuando el modo parking está activado y en caso contrario nos muestra «—-» a través del display. Es necesario revisar la cabecera del código para conocer la conexión de los componentes auxiliares del sistema como son el LED indicador y el Pulsador de modo.
Lista de Materiales
-
- Arduino UNO Rev.3
- Cable USB tipo A-B
- Sensor ultrasónico impermeable JSN-SR04T
- Display de 4 dígitos y 7 segmentos con controlador TM1637
- LED 3mm (De cualquier color)
- Resistencia de 220Ω.
- Buzzer activo (Zumbador)
- Pulsador.
- Protoboard
- Cables de conexión
Programas
Programa con librería “NewPing.h”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
/* TITULO: Sensor de parking con JSN-SR04T y display de 4 dígitos TM1637 (librería NewPing.h) AUTOR: MARIANO DEL CAMPO GARCÍA (@2018) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Este programa es capaz de activar un "Zumbador" cuando el objeto se encuentra a una distancia inferior o igual a la distancia configurada dentro de la variable "distancia_Alarma". Cuando la distancia supere dicho valor (distancia_Alarma), el zumbador permanecerá desactivado. El sistema está dotado de un pulsador y de un LED indicador para controlar el modo parking, es decir, que la funcionalidad del modo parking se active únicamente cuando nosotros lo necesitemos, además de encenderse un LED indicador de modo. Además, se incluye un display de 4 dígitos y 7 segmentos con controlador TM1637 que nos va a mostrar la distancia en centímetros cuando el modo parking está activado y en caso contrario nos muestra "----" a través del display. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | Pin "DIO" del display de 4 dígitos y 7 segmentos | [ ]RST MOSI/11[ ]~| Pin "CLK" del display de 4 dígitos y 7 segmentos | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| ECHO | [ ]GND -| R |- 8[ ] | TRIG | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | ZUMBADOR(+) | -| I |- 6[ ]~| LED(+) | [ ]A0 -| N |- 5[ ]~| PA | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Sensor ultrasónico impermeable JSN-SR04T: Además de las conexiones TRIG y ECHO que van directamente al Arduino, necesitamos alimentarlo también en sus terminales VCC (+5V) y GND (masa) a través de nuestro Arduino. - El ZUMBADOR tiene dos terminales, ZUMBADOR(+) que es el más largo y el que va conectado al pin digital correspondiente de arduino, y ZUMBADOR(-) que va conectado directamente a GND. - Cátodo(-) del LED(-) a GND a través de una resistencia de 220 ohms. - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos) - Conexión PULL_UP del pulsador: Se utiliza una resistencia interna del Arduino como resistencia PULL_UP por lo que no es necesario añadir más componentes al pulsador para que funcione correctamente. - PB conectado a GND. - PA conectado al pin digital correspondiente de Arduino. - Alimentación del display de 4 dígitos y 7 segmentos: Directamente conectada a +5V y GND de Arduino */ #include <NewPing.h> // Librería necesaria para trabajar con el sensor ultrasónico impermeable JSN-SR04T. #include "TM1637.h" // Librería necesaria para el display de 4 dígitos #define CLK 11 // Pin CLK #define DIO 12 // Pin DIO #define TRIGGER_PIN 8 // Pin digital para el pin TRIG del sensor ultrasónico impermeable JSN-SR04T. #define ECHO_PIN 9 // Pin digital para el pin ECHO del sensor ultrasónico impermeable JSN-SR04T. #define MAX_DISTANCE 200 // Variable que almacena la máxima distancia a medir con el sensor ultrasónico impermeable JSN-SR04T (mide entre 25-450 cm) const int ZUMBADOR = 7; // Pin digital para el ZUMBADOR const int LED = 6; // Pin digital para el LED const int PULSADOR = 5; // Pin digital para el PULSADOR const int tiempoAntirrebote = 10; // Variable que almacena el tiempo antirrebote para los pulsadores de control de la velocidad // Variables para controlar el funcionamiento del sistema int distancia = 0; int distancia_Alarma = 30; // Distancia límite para la Alarma en centímetros byte modo_parking = 0; // Declaración de los estados internos de los pulsadores que controlan la velocidad de giro del motor en rpm int estadoPulsador; int estadoPulsadorAnterior = 1; // Declaración del objeto para el sensor ultrasónico impermeable JSN-SR04T NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Declaración del objeto para el display de 4 dígitos TM1637 Display1(CLK,DIO); // Matriz de letras que se van a mostrar inicialmente int8_t vacio[4] = {0x10,0x10,0x10,0x10}; // Se muestra el símbolo "-" pero con 0x13 se muestra " " (vacío) void setup() { pinMode(ZUMBADOR, OUTPUT); // Pin digital 7 como SALIDA pinMode(LED, OUTPUT); // Pin digital 6 como SALIDA pinMode(PULSADOR, INPUT_PULLUP); // Pin digital 5 como ENTRADA PULLUP digitalWrite(ZUMBADOR, LOW); // Inicialmente el ZUMBADOR se encuentra desactivado digitalWrite(LED, LOW); // Inicialmente el LED se encuentra desactivado Display1.init(); // Inicializa display de 4 dígitos Display1.set(3); // Brillo, 0 (mínimo) a 7 (máximo) Display1.point(POINT_OFF); // Apaga dos puntos, POINT_ON para encenderlos // Vaciamos todos los dígitos del display Display1.display(vacio); } void loop() { // Leemos el estado del pulsador del modo parking estadoPulsador = digitalRead(PULSADOR); // Si hay un cambio en el estado del pulsador del modo parking if(estadoPulsador != estadoPulsadorAnterior) { // y si se ha eliminado ya el rebote del pulsador del modo parking if(antirrebote(PULSADOR)) { // Se suma una unidad al modo_parking modo_parking++; // Si el modo_parking es igual a 2, pasa a valer 0 if(modo_parking == 2) modo_parking = 0; } // Actualizamos el estado anterior del pulsador del modo parking estadoPulsadorAnterior = estadoPulsador; } // Si se ha activado el modo parking if(modo_parking == 1) { digitalWrite(LED, HIGH); // Se activa el LED indicador del modo parking // Leemos y registramos la distancia en centímetros que está detectando el sensor ultrasónico impermeable JSN-SR04T. distancia = sonar.ping_cm(); delay(50); // Tiempo mínimo en milisegundos para la lectura del sensor ultrasónico impermeable JSN-SR04T. if(distancia <= distancia_Alarma) // Si la distancia es inferior o igual a la distancia de alarma configurada { digitalWrite(ZUMBADOR, HIGH); // Se activa el ZUMBADOR } else // Si la distancia es superior a la distancia de alarma configurada { digitalWrite(ZUMBADOR, LOW); // Se desactiva el ZUMBADOR } // Llamada a la función que muestra la distancia a través del display encender_display(distancia); } // Si no se ha activado el modo parking if(modo_parking == 0) { digitalWrite(LED, LOW); // Se desactiva el LED indicador del modo parking digitalWrite(ZUMBADOR, LOW); // Se desactiva el ZUMBADOR // Vaciamos todos los dígitos del display Display1.display(vacio); } } // Función antirrebote boolean antirrebote(int pin) { int contador = 0; boolean estado; boolean estadoAnterior; do { estado = digitalRead(pin); if(estado != estadoAnterior) { contador = 0; estadoAnterior = estado; } else { contador = contador+ 1; } delay(1); } while(contador < tiempoAntirrebote); return estado; } // Función que muestra el número de pasos a través del display void encender_display(int cm) { if(cm <= 99) { Display1.display(3, cm/1 % 10); // Dígito 3 Display1.display(2, cm/10 % 10); // Dígito 2 Display1.display(1, 0x13); // Dígito 1 => " " (Vacío) Display1.display(0, 0x13); // Dígito 0 => " " (Vacío) } if(cm >99 && cm <=999) { Display1.display(3, cm/1 % 10); // Dígito 3 Display1.display(2, cm/10 % 10); // Dígito 2 Display1.display(1 ,cm/100 % 10); // Dígito 1 Display1.display(0, 0x13); // Dígito 0 => " " (Vacío) } } |
Programa con librería “Ultrasonic.h”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
/* TITULO: Sensor de parking con JSN-SR04T y display de 4 dígitos TM1637 (librería Ultrasonic.h) AUTOR: MARIANO DEL CAMPO GARCÍA (@2018) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Este programa es capaz de activar un "Zumbador" cuando el objeto se encuentra a una distancia inferior o igual a la distancia configurada dentro de la variable "distancia_Alarma". Cuando la distancia supere dicho valor (distancia_Alarma), el zumbador permanecerá desactivado. El sistema está dotado de un pulsador y de un LED indicador para controlar el modo parking, es decir, que la funcionalidad del modo parking se active únicamente cuando nosotros lo necesitemos, además de encenderse un LED indicador de modo. Además, se incluye un display de 4 dígitos y 7 segmentos con controlador TM1637 que nos va a mostrar la distancia en centímetros cuando el modo parking está activado y en caso contrario nos muestra "----" a través del display. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | Pin "DIO" del display de 4 dígitos y 7 segmentos | [ ]RST MOSI/11[ ]~| Pin "CLK" del display de 4 dígitos y 7 segmentos | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| ECHO | [ ]GND -| R |- 8[ ] | TRIG | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | ZUMBADOR(+) | -| I |- 6[ ]~| LED(+) | [ ]A0 -| N |- 5[ ]~| PA | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Sensor ultrasónico impermeable JSN-SR04T: Además de las conexiones TRIG y ECHO que van directamente al Arduino, necesitamos alimentarlo también en sus terminales VCC (+5V) y GND (masa) a través de nuestro Arduino. - El ZUMBADOR tiene dos terminales, ZUMBADOR(+) que es el más largo y el que va conectado al pin digital correspondiente de arduino, y ZUMBADOR(-) que va conectado directamente a GND. - Cátodo(-) del LED(-) a GND a través de una resistencia de 220 ohms. - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos) - Conexión PULL_UP del pulsador: Se utiliza una resistencia interna del Arduino como resistencia PULL_UP por lo que no es necesario añadir más componentes al pulsador para que funcione correctamente. - PB conectado a GND. - PA conectado al pin digital correspondiente de Arduino. - Alimentación del display de 4 dígitos y 7 segmentos: Directamente conectada a +5V y GND de Arduino */ #include <Ultrasonic.h> // Librería necesaria para trabajar con el sensor ultrasónico impermeable JSN-SR04T. #include "TM1637.h" // Librería necesaria para el display de 4 dígitos #define CLK 11 // Pin CLK #define DIO 12 // Pin DIO const int ECHO = 9; // Pin digital para el pin ECHO del sensor ultrasónico impermeable JSN-SR04T. const int TRIG = 8; // Pin digital para el pin TRIG del sensor ultrasónico impermeable JSN-SR04T. const int TIME_OUT = 30000; // Variable que almacena el time out del sensor ultrasónico impermeable JSN-SR04T (mide entre 25-450 cm) const int ZUMBADOR = 7; // Pin digital para el ZUMBADOR const int LED = 6; // Pin digital para el LED const int PULSADOR = 5; // Pin digital para el PULSADOR const int tiempoAntirrebote = 10; // Variable que almacena el tiempo antirrebote para los pulsadores de control de la velocidad // Variables para controlar el funcionamiento del sistema int distancia = 0; int distancia_Alarma = 30; // Distancia límite para la Alarma en centímetros byte modo_parking = 0; // Declaración de los estados internos de los pulsadores que controlan la velocidad de giro del motor en rpm int estadoPulsador; int estadoPulsadorAnterior = 1; // Declaración del objeto para el sensor ultrasónico impermeable JSN-SR04T Ultrasonic ultrasonic(TRIG, ECHO, TIME_OUT); // Declaración del objeto para el display de 4 dígitos TM1637 Display1(CLK,DIO); // Matriz de letras que se van a mostrar inicialmente int8_t vacio[4] = {0x10,0x10,0x10,0x10}; // Se muestra el símbolo "-" pero con 0x13 se muestra " " (vacío) void setup() { pinMode(ZUMBADOR, OUTPUT); // Pin digital 7 como SALIDA pinMode(LED, OUTPUT); // Pin digital 6 como SALIDA pinMode(PULSADOR, INPUT_PULLUP); // Pin digital 5 como ENTRADA PULLUP digitalWrite(ZUMBADOR, LOW); // Inicialmente el ZUMBADOR se encuentra desactivado digitalWrite(LED, LOW); // Inicialmente el LED se encuentra desactivado Display1.init(); // Inicializa display de 4 dígitos Display1.set(3); // Brillo, 0 (mínimo) a 7 (máximo) Display1.point(POINT_OFF); // Apaga dos puntos, POINT_ON para encenderlos // Vaciamos todos los dígitos del display Display1.display(vacio); } void loop() { // Leemos el estado del pulsador del modo parking estadoPulsador = digitalRead(PULSADOR); // Si hay un cambio en el estado del pulsador del modo parking if(estadoPulsador != estadoPulsadorAnterior) { // y si se ha eliminado ya el rebote del pulsador del modo parking if(antirrebote(PULSADOR)) { // Se suma una unidad al modo_parking modo_parking++; // Si el modo_parking es igual a 2, pasa a valer 0 if(modo_parking == 2) modo_parking = 0; } // Actualizamos el estado anterior del pulsador del modo parking estadoPulsadorAnterior = estadoPulsador; } // Si se ha activado el modo parking if(modo_parking == 1) { digitalWrite(LED, HIGH); // Se activa el LED indicador del modo parking // Leemos y registramos la distancia en centímetros que está detectando el sensor ultrasónico impermeable JSN-SR04T. distancia = ultrasonic.Ranging(CM); delay(50); // Tiempo mínimo en milisegundos para la lectura del sensor ultrasónico impermeable JSN-SR04T. if(distancia <= distancia_Alarma) // Si la distancia es inferior o igual a la distancia de alarma configurada { digitalWrite(ZUMBADOR, HIGH); // Se activa el ZUMBADOR } else // Si la distancia es superior a la distancia de alarma configurada { digitalWrite(ZUMBADOR, LOW); // Se desactiva el ZUMBADOR } // Llamada a la función que muestra la distancia a través del display encender_display(distancia); } // Si no se ha activado el modo parking if(modo_parking == 0) { digitalWrite(LED, LOW); // Se desactiva el LED indicador del modo parking digitalWrite(ZUMBADOR, LOW); // Se desactiva el ZUMBADOR // Vaciamos todos los dígitos del display Display1.display(vacio); } } // Función antirrebote boolean antirrebote(int pin) { int contador = 0; boolean estado; boolean estadoAnterior; do { estado = digitalRead(pin); if(estado != estadoAnterior) { contador = 0; estadoAnterior = estado; } else { contador = contador+ 1; } delay(1); } while(contador < tiempoAntirrebote); return estado; } // Función que muestra el número de pasos a través del display void encender_display(int cm) { if(cm <= 99) { Display1.display(3, cm/1 % 10); // Dígito 3 Display1.display(2, cm/10 % 10); // Dígito 2 Display1.display(1, 0x13); // Dígito 1 => " " (Vacío) Display1.display(0, 0x13); // Dígito 0 => " " (Vacío) } if(cm >99 && cm <=999) { Display1.display(3, cm/1 % 10); // Dígito 3 Display1.display(2, cm/10 % 10); // Dígito 2 Display1.display(1 ,cm/100 % 10); // Dígito 1 Display1.display(0, 0x13); // Dígito 0 => " " (Vacío) } } |
Video
Eso es todo por ahora. Esperamos que testa información sea de utilidad para ustedes.