Control del sensor de ultrasonidos US-100 en modo serie

En un artículo anterior trabajamos con el sensor US-100 en modo ancho de pulso, consistente básicamente en enviar un primer pulso de inicio y medir la anchura del pulso de retorno. El problema de este modo de funcionamiento es que desaprovechamos una de las características de este sensor, consistente en compensar el cálculo de la distancia con la temperatura ambiente.

En este artículo vamos a estudiar el comportamiento del US-100 en modo serie.

Configuración y mensajería del US-100 en modo serie

us100_1La configuración del modo serie en este sensor se realiza vía jumper. Así, nos aseguraremos de que el jumper trasero se encuentre cerrado.

En este modo, las comunicaciones serie se llevarían a cabo a través de los pines marcados con Tx y Rx, que serían conectados respectivamente a los pines de transmisión y recepción de nuestro Arduino. El puerto serie se configurará como 9600 8N1.

A nivel de mensajería, este dispositivo en modo serie permite dos comandos:

  • 0x55: petición de medida de distancia
  • 0x50: petición de medida de temperatura

Los mensajes de respuesta serán:

  • Distancia en milímetros, dos bytes según la expresión: MSB * 256 + LSB
  • Temperatura en grados centígrados, un byte según la expresión: BYTE – 45

Montaje del circuito de pruebas

us100_bbRealizaremos el montaje mostrado en la figura basado en los siguientes componentes:

Como se puede comprobar en la figura, conectaremos los pines 2 y 3 con los pines “trigger/tx” y “echo/rx” del US-100. El US-100 requiere, además, que las dos patillas “GND” sean cortocircuitadas y conectadas al GND en Arduino.

Programación de Arduino

Utilizaremos el siguiente código para comprobar el sensor:

// Prueba de medidas de distancia y temperatura con US-100 en modo serie
// Por RafaG, 2014

#include <SoftwareSerial.h>

const int US100_TX = 2;
const int US100_RX = 3;

// Instancia nuevo canal serie
SoftwareSerial puertoUS100(US100_RX, US100_TX);

unsigned int MSByteDist = 0;
unsigned int LSByteDist = 0;
unsigned int mmDist = 0;
int temp = 0;

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

void loop() {

    puertoUS100.flush(); // limpia el buffer del puerto serie
    puertoUS100.write(0x55); // orden de medición de distancia

    delay(500);

    if(puertoUS100.available() >= 2) // comprueba la recepción de 2 bytes
    {
        MSByteDist = puertoUS100.read(); // lectura de ambos bytes
        LSByteDist  = puertoUS100.read();
        mmDist  = MSByteDist * 256 + LSByteDist; // distancia
        if((mmDist > 1) && (mmDist < 10000)) // comprobación de la distancia dentro de rango { Serial.print("Distancia: "); Serial.print(mmDist, DEC); Serial.println(" mm"); } } puertoUS100.flush(); // limpia el buffer del puerto serie puertoUS100.write(0x50); // orden de medición de distancia delay(500); if(puertoUS100.available() >= 1) // comprueba la recepción de 1 byte
    {
        temp = puertoUS100.read(); // lectura del byte
        if((temp > 1) && (temp < 130)) // comprobación de rango válido
        {
            temp -= 45; // corrige offset de 45º
            Serial.print("Temperatura: ");
            Serial.print(temp, DEC);
            Serial.println(" ºC.");
        }
    }

    delay(500);
}

Nótese que se hace uso de la librería SoftwareSerial para habilitar los pines 2 y 3 como un nuevo puerto serie para nuestro Arduino. Por lo demás, el código se limita a enviar sucesivamente los comandos de medida de distancia y de temperatura, mostrando los resultados obtenidos.

Realización de las pruebas y resultados

entorno100Una vez realizado el montaje anterior -e introducido el código en nuestro Arduino- se colocará la placa protoboard con el sensor instalado frente a una superficie sólida, utilizando una regla de escritorio como referencia de las medidas, tal como indica la figura:

Tomando como referencia una regla graduada en centímetros, se han tomado cinco medidas para cada una de las distancias de referencia (30, 25, 20, 15, 10, 5 y 3 cm). Los errores del promedio de cada grupo de medidas respecto a la referencia se muestra en la siguiente gráfica:

graf100Puede verse que el error de medida se mantiene dentro de las especificaciones del fabricante. Para distancias pequeñas este error llega a ser despreciable.

Esta entrada fue publicada en Arduino, Sensores y actuadores y etiquetada , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s