El SRF08 es una versión evolucionada del sensor por ultrasonidos SRF04. Entre esas mejoras destaca, sin lugar a dudas, que el cálculo de la distancia al objeto la realiza el propio sensor, con lo cual se evita la necesidad de implementar dicho código en el PIC de control. Además la comunicación con éste se realiza por el bus I2C con lo que permitiría la conexión de varios dispositivos SRF08 (hasta 16) con el PIC ocupando tan solo dos lineas. Además dispone de un sensor para la medida de la luminosidad ambiental.
En este proyecto vamos a mostrar como controlar el componente con un PIC 16F876A. En un primer momento, al iniciar la aplicación mostraremos la versión de firmware del componente sobre un display LCD mediante la lectura del correspondiente registro. Posteriormente y a intervalos regulares, mediremos la distancia a un objeto frontal así como la luminosidad ambiental y la mostraremos sobre el mismo display LCD.
Para realizar una operación deberemos escribir el correspondiente comando sobre el registro nº 0 del SRF08. Para realizar el cálculo de la distancia a un objeto frontal en modo normal existen 3 posibles comandos según la unidad de medida en el que se desee el resultado. En pulgadas, centímetros y micro segundos y sus correspondientes comandos 0x50, 0x51 y 0x52. Aquí obtendremos el resultado en centímetros por lo que se empleará el comando 0x51 (81 en decimal).
SRF08_ID = 0xe0; //Dirección I2C del SRF08
registro = 0x00; //Registro de comandos
comando = 81; //Comando calculo en cm
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(SRF08_ID); //...con la dirección del SD21...
i2c_write(registro); //apuntando al registro de comandos...
i2c_write(comando); //...comando
i2c_stop();
delay_ms (80); //Tiempo de adquisición de distancia
registro = 0x00; //Registro de comandos
comando = 81; //Comando calculo en cm
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(SRF08_ID); //...con la dirección del SD21...
i2c_write(registro); //apuntando al registro de comandos...
i2c_write(comando); //...comando
i2c_stop();
delay_ms (80); //Tiempo de adquisición de distancia
Una vez ejecutado el comando ya se pueden leer los resultados en los correspondientes registros:
- En el 0x01 el valor de la luminosidad en un valor desde 0x00 a 0xff.
- En el 0x02 el byte alto del primer eco recibido
- En el 0x03 el byte bajo del primer eco recibido
El SRF08 dispone de 32 registros más para almacenar los valores de otros ecos recibidos por objetos más distantes en una misma medición hasta un total de 17 ecos. Por ello es necesario un retardo de al menos 64ms antes de su lectura para asegurar la recepción de todos ellos.
- En el 0x01 el valor de la luminosidad en un valor desde 0x00 a 0xff.
- En el 0x02 el byte alto del primer eco recibido
- En el 0x03 el byte bajo del primer eco recibido
El SRF08 dispone de 32 registros más para almacenar los valores de otros ecos recibidos por objetos más distantes en una misma medición hasta un total de 17 ecos. Por ello es necesario un retardo de al menos 64ms antes de su lectura para asegurar la recepción de todos ellos.
SRF08_ID = 0xe0; //Dirección I2C del SRF08
registro=0x01; //Primer registro a leer
n_registros=0x03; //Total de registros a leer
indice = 0;
contador = 0;
i2c_start(); //Comienzo de la comunicación I2C...
i2c_write(SRF08_ID); //...con la dirección I2c del SRF08...
i2c_write(registro); //...apuntando al registro
i2c_start(); // Reinicio
i2c_write(SRF08_ID+1); // Cambio a función de lectura
//lectura de los n registros
For(contador=n_registros-1;contador>=1;contador--) {
I2C_Buffer[indice]=i2c_read(); //Envíar ACK y almacenar
en el buffer
indice++; //Siguiente posición del
buffer
}
I2C_Buffer[indice]=i2c_read(0); //Envíar NACK y almacena
en el buffer
i2c_stop(); //Secuencia de stop
En este caso solo leemos 3 registros; el registro de la luminosidad y los dos registros del primer eco recibido correspondiente al objeto más cercano.
[+/-] Ver / Ocultar programa completo en C
En esta animación se muestra el resultado del programa realizado:
El proyecto contenido en el artículo ha sido diseñado con la versión v4.084 de CCS PIC C COMPILER
1 comentario:
Is it work in real time like our overhead tank. What is the limits of temperature.
Publicar un comentario