El sensor de ultrasonido funciona como un sonar, emite un pulso de ultrasonido por un tiempo de disparo, y luego mide el tiempo de retorno del eco.
El diagrama muestra el concepto a ser aplicado:
Conversión de tiempor dt_Echo a distancias
La velocidad del sonido en el aire es de 343.2 m/s a 20°C y 50% de Humedad.
Referencia: https://es.wikipedia.org/wiki/Velocidad_del_sonido
Usando la fórmula básica de velocidad se tiene que:
\text{velocidad del sonido} = \frac{\delta x}{\delta t} = 343.2\text{ }m/s \delta x = 343.2\text{ }\delta tPara convertir los tiempos a distancias, considere que el recorrido del pulso es de ida y vuelta, por lo que la distancia del dispositivo al objeto será la mitad.
Considere además que la fórmula está dada en convertirla a segundos y los datos estan en μs
aplicando lo anterior, y convirtiendo a cm
\delta x = \Big[ 343.2 \frac{m}{s} \frac{100\text{ }cm}{1\text{ }m} \Big] \Big[ \frac{Echo}{2} \frac{1\text{ }s}{1000000\text{ }\mu s} \Big]se obtiene la fórmula a usar en cm:
distancia = 0,01716 \text{ } EchoDesarrollo del concepto
Se desarrolla el concepto en dos partes:
- En arduino se realizan las lecturas de echo del sensor de ultrasonido, los datos se envian al computador por puerto serial (USB)
- Los dados se procesa en la computadora con Python, fórmulas, conversión de unidades, gráficas, etc.
Lecturas de datos en Arduino
En la parte de Arduino se usan los siguientes componentes:
- Arduino UNO con cable USB
- Sensor de ultrasonido HC-SR04
- Cables de Conexión (4 hembra macho)
El arduino envía al computador los tiempos de recorrido del PULSO en μs.
La recepción de datos en la computadora en forma Serial se detallan las secciones con Python:
Serial – Envia y Recibe texto
http://blog.espol.edu.ec/edelros/serial-envia-y-recibe-texto/
Serial – Lectura datos
http://blog.espol.edu.ec/edelros/serial-lectura-datos/
Sensor HC-SR04
El dispositivo HC-SR04 se opera como un dispositivo que requiere alimentación (Vcc y GND), una señal de disparo del pulso (Trigger) y una señal para la lectura del eco (Echo).
La duración del pulso se controla con tpulsoON, y el tiempo de apagado con tpulsoOFF, se usa un tiempo adicional dt_apaga, para asegurarse que no exista interferencia entre el apagado del pulso y la lectula del retorno del eco.
La conexión del dispositivo con el Arduino como controlador, se realiza por medio de los pines indicados en el script.
/* Sensor de ultrasonido HC-SR04 * Válido con objetos distantes entre 2 y 400 cm (aproximado) usado para medir tiempo de returno de un pulso __________ ____________| PULSO |___ tpulsoOFF tpulsoON dt_apaga dt_Echo e el tiempo de retorno del PULSO los tiempos son en microsegundos Los datos se envian por Serial para procesar en Python * http://blog.espol.edu.ec/edelros/sensor-ultrasonido-hc-sr04/ */ // Disparo del PULSO, Trigger int TriggerPin = 12; int tpulsoON = 15; int tpulsoOFF = 2000; // Sensor del Retorno del PULSO, Echo int EchoPin = 11; int dt_apaga = 10; // tiempo de retorno Echo float dt_Echo; void setup() { Serial.begin(9600); pinMode(TriggerPin, OUTPUT); pinMode(EchoPin, INPUT); } void loop(){ // tiempo entre PULSOs: tpulsoOFF digitalWrite(TriggerPin, LOW); delayMicroseconds(tpulsoOFF); // Dispara PULSO de duración: tpulsoON digitalWrite(TriggerPin, HIGH); delayMicroseconds(tpulsoON); digitalWrite(TriggerPin, LOW); delayMicroseconds(dt_apaga); // Lectura sensor pulso: tiempo de echo dt_Echo = pulseIn(EchoPin, HIGH); Serial.println(dt_Echo); delay(10); }
Referencia
https://www.arduino.cc/en/tutorial/ping
Procesamiento de datos en Python
El arduino envía al computador los tiempos de recorrido del PULSO en μs, se usa la fórmula para encontrar la distancia en cm:
distancia = 0,01716 \text{ } dtEchoLa lectura y aplicación de fórmula en Python tiene como resultado por ejemplo de 12 cm:
12.149280000000001 11.72028 12.13212 11.806080000000001 12.13212 11.703120000000002 11.703120000000002 12.217920000000001 11.788920000000001 11.685960000000001 11.668800000000001
Nota: La medición se realizó sosteniendo con la mano el sensor apuntando al una superficie plana, por lo que se muestran variaciones en la lectura. Realizar sus propias mediciones al respecto en superficies fijas, y con el sensor fijo a un soporte.
En caso de realizar una gráfica de los datos recibidos, se crea un vector datos, con tamaño «ventana» para graficar los puntos.
# Datos desde puerto Serial # generados desde arduino import serial, time # INGRESO puerto = 'com10' baudios = 9600 ventana = 20 # tamaño ventana datos datos=[] # vector para graficar # PROCEDIMIENTO arduino = serial.Serial(puerto, baudios) arduino.setDTR(False) time.sleep(0.3) # limpia buffer de datos anteriores arduino.flushInput() arduino.setDTR() time.sleep(0.3) print('\nEstado del puerto: ',arduino.isOpen()) print('Nombre del dispositivo conectado: ', arduino.name) print('Dump de la configuración:\n ',arduino) print('\n###############################################\n') # Lectura de datos while True: #esperar hasta recibir un dato while (arduino.inWaiting()==0): pass # leer linea desde puerto serial lectura = arduino.readline() # binario a texto, elimina /r/n texto = lectura.decode().strip() valor = float(texto) # Aplica fórmula valor = 0.01716 *valor datos.append(valor) # mantiene el tamaño "ventana" de datos if (len(datos)>=ventana): datos.pop(0) print(valor) # Cerrar el puerto serial. serial.Serial.close