Lector de telémetro SRFxx de Sonic

Este ejemplo muestra cómo leer  un telémetro ultrasónico Devantech SRFxx, que se comunica a través del protocolo serie síncrono de I2C, usando la biblioteca Wire de Arduino.

El protocolo I2C implica el uso de dos líneas para enviar y recibir datos:
  • un pin de reloj serie (SCL) envía los impulsos de la placa Arduino o Genuino Maestro a intervalos regulares,
  • un pin de datos serie (SDA) sobre el cual se envían los datos entre los dos dispositivos.
A medida que cambian las líneas de reloj de LOW a HIGH (conocido como el flanco de subida del pulso de reloj), un único bit de información - que va a formar de la secuencia de la dirección de un dispositivo específico y mando de datos - se transfiere desde la placa para el dispositivoI2C a través de la línea SDA. Cuando se envía esta información - bit a bit -, la llamada del dispositivo ejecuta la solicitud y transmite datos de nuevo es - si es necesario - a la placa sobre la misma línea utilizando la señal de reloj que sigue siendo generada por el Maestro en SCL como la sincronización.
 Debido a que el protocolo I2C permite a cada dispositivo habilitado a tener su propia dirección única, y como los dispositivos maestro y esclavo hacen turnos para comunicarse a través de una sola línea, es posible que la placa Arduino o Genuino se comunique (a su vez) con muchos dispositivos , u otras plataformas, utilizando sólo dos pines del microcontrolador.

Hardware necesario

  • Arduino o Genuino
  • Devantech SRFxx Range Finder (modelos SRF02 o SRF10 haga clic para ver)
  • Condensador de 100 uf
  • Cable para interconexion
  • Protoboard


Circuito

Una el pin SDA de su SRFxx al pin analógico 4 de su placa Arduino, y el pin SCL al pin analógico 5. Alimente su SRFxx de 5V, añadiendo un condensador de 100 uF en paralelo con el telémetro para alisar es la fuente de alimentación.


Esquema


Código


// I2C SRF10 or SRF08 Devantech Ultrasonic Ranger Finder
// por Nicholas Zambetti <http://www.zambetti.com>
// y James Tichenor <http://www.jamestichenor.net>

// Demuestra el uso de la biblioteca Wire library leyendo datos de

// un sensor Devantech Utrasonic Rangers SFR08 ySFR10

// Creaso 29 Abril de 2006


// Este codigo es de dominio público



#include <Wire.h>

void setup() {
  Wire.begin();                // se conecta al bus i2c (direccion para el Maestro opcional)
  Serial.begin(9600);      // inicia la comunicacion Seria a 9600bps
}

int reading = 0;

void loop() {
  // Paso 1: instruir sensor para leer los ecos
  Wire.beginTransmission(112); // transmite al dispositivo numero 112 (0x70)
  // la direccion especificada en la Hoja de Datos es 224 (0xE0)
  // pero el direccionamiento i2c los 7 bits más altos de 112
  Wire.write(byte(0x00));      // conjuntos de registros puntero al registro de comandos (0x00)
  Wire.write(byte(0x50));      // instruye al sensor para medir en "pulgadas" (0x50)
  // use 0x51 para centimetros
  // use 0x52 para microsegundos
  Wire.endTransmission();      // parada de transmision

  // Paso 2: espera a que sucedan las lecturas
  delay(70);                   // la Hoja de Datos sugiere al menos 65 milisegundos

  // Paso 3: instruye sensor para devolver un eco particular, la lectura
  Wire.beginTransmission(112); // se transmite al dispositivo numero 112
  Wire.write(byte(0x02));      // conjuntos de registros puntero a registro eco # 1 (0x02)
  Wire.endTransmission();      // parada de transmision

  // Paso 4: solicita la lectura del sensor
  Wire.requestFrom(112, 2);    //solicita 2 bytes desde el dispositivo esclavo numero 112

  // Paso 5:recibe la lectura del sensor
  if (2 <= Wire.available()) { //si se han recibido 2 bytes
    reading = Wire.read();  // recibe byte alto (sobrescribe la lectura previa)
    reading = reading << 8;    // cambiar byte alto para ser los 8 bits más altos
    reading |= Wire.read(); // recibe el byte bajo como los 8 bits mas bajos
    Serial.println(reading);   //imprime la lectura
  }
  delay(250);                  // esperar un poco para poder leer la salida :)
}


/*

// El codigo siguiente camabia la direccion de un Devantech Ultrasonic Range Finder (SRF10 o SRF08)
// Uso: Cambio de dirección (0x70, 0xE6);

void changeAddress(byte oldAddress, byte newAddress)
{
  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA0));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xAA));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA5));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(newAddress);
  Wire.endTransmission();
}

*/

No hay comentarios:

Publicar un comentario