#16  1-Wire To I2C

Introducción

   En este tutorial trabajaremos con una tarjeta fabricada por MCI, que nos facilita la conversión del protocolo 1-Wire a I2C. ¿Qué significa esto?, que dentro de ella se encuentra encapsulado un chip DS2482-100 de MAXIM, encargado de convertir el bus 1-Wire, procesarlo, y convertir la señal un una que utiliza el protocolo I2C. El I2C utiliza dos líneas para la comunicación, SCL para el tiempo de reloj y SDA que son los datos. Para que entiendan la diferencia de cada protocolo se los explicare a continuación:

1-Wire es un protocolo de comunicaciones diseñado por Dallas Semiconductor. Está basado en un bus, donde hay un maestro y pueden haber varios esclavos en una sola línea de datos. La línea de datos requiere una resistencia de pull-up conectada a la alimentación. Una red de dispositivos 1-Wire está conformada por un maestro y uno o mas esclavos que poseen un único pin de datos de tipo “opendrive”, al que se conecta una resistencia “Pull up” anclada a +5VDC. Una de las características de la tecnología 1-Wire, es que cada dispositivo esclavo tiene una única e irrepetible identificación grabada en su memoria ROM al momento de su fabricación . Las redes de dispositivos 1-Wire pueden tener fácilmente una longitud de 200m y contener unos 100 dispositivos. (Cabe resaltar que deben tener la misma distancia entre los dispositivos conectados, debido a que si hay distancias diferentes se cae la comunicación con alguno de los dispositivos), otra característica es que no se requiere del uso de una señal de reloj, ya que, cada dispositivo 1-Wire posee un oscilador interno que se sincroniza con el maestro cada vez que en la línea de datos aparezca un flanco de bajada. I2C

El I²C es un bus serie de datos desarrollado en 1982 por Philips Semiconductors (hoy NXP Semiconductors). Se utiliza principalmente para la comunicación entre diferentes partes de un circuito, por ejemplo, entre un controlador y circuitos periféricos integrados. Está diseñado como un bus maestro-esclavo. La transferencia de datos es siempre iniciada por un maestro; el esclavo reacciona. Es posible tener varios maestros mediante un modo multi maestro, en el que se pueden comunicar dos maestros entre sí, de modo que uno de ellos trabaja como esclavo.

• Se necesitan solamente dos líneas, la de datos (SDA) y la de reloj (SCL).

• Cada dispositivo conectado al bus tiene un código de dirección seleccionable mediante software.

• El bus permite la conexión de varios Masters, ya que incluye un detector de colisiones.

• El protocolo de transferencia de datos y direcciones posibilita diseñar sistemas completamente definidos por software.

• Los datos y direcciones se transmiten con palabras de 8 bits.

• Las líneas SDA (serial Data) y SCL (serial Clock) son bidireccionales, conectadas al positivo de la alimentación a través de las resistencias de pull-up. Cuando el bus está libre, ambas líneas están en nivel alto.

Para tener mas información acerca de los protocolos, puedes al siguiente link.

Ahora que ya tenemos una pequeña descripción de los dos protocolos, explicaré el proyecto que se realiza en este tutorial. Trabajaremos con el sensor de temperatura DS18B20 de MAXIM, este poderoso sensor trabaja con el protocolo 1-Wire. Para desarrollar el montaje, se utiliza un cable de teléfono (Como el que esta conectado al teléfono de tu casa), es decir son 4 cables con una cubierta de plástico, conectamos los 3 pines al sensor, uno a GND , el siguiente al pin DQ y el último a VCC y del otro extremo del cable se coloca un conector RJ11 para conectarlo a la tarjeta 1-Wire to I2C, en la tarjeta tenemos un terminal de 4 conectores que son: SCL, SDA, VCC y GND; que en esta caso los conectaremos a la PICARO.

Seguro te preguntas, porque es útil esta herramienta, la verdad es que al momento del programar es mucho más sencillo, debido a que el integrado DS2482-100 ya tiene las funciones predefinidas dentro de sí. Sólo debes enviar los comandos correctos para obtener los datos. Debes tener en consideración que el modo de trabajo del sensor DS18B20 necesita ciertos comandos en un orden especifico. Adicional a esto evita el hardware adicional, es decir, no necesitas las resistencias “Pull-Up” de I2C y de igual manera funcionara correctamente. Ten en cuenta que es posible utilizar este sensor de temperatura directamente con tu tarjeta Picaro, pero para ello deberás programar la comunicación 1-Wire en tu tarjeta lo que se hace más extenso y complicado. De igual manera, en Internet encontraras una librería OneWire, la puedes descargar en este link, para que observes las diferencias de programar el protocolo 1-Wire y el protocolo I2C.

Si necesitas conectar varios sensores, debes tenerlos a la misma distancia entre si. Si lo anterior no ocurre, alguno de ellos podría perder la comunicación.

Pasos a seguir:

#1   Armar el circuito según la imagen

#2   Abrir el IDE de Arduino y conectar la tarjeta PICARO al computador

#3   Seleccionar el tipo de tarjeta como Arduino Uno

#4   Elegir el puerto serial en que se encuentra conectada la tarjeta PICARO

#5   Copiar el código de ejemplo al IDE, compilarlo y subirlo

Listado de componentes :

Descargas:

Código:

En este programa utilizamos dos librerías, la Wire.h que es para trabajar con el protocolo de comunicación I2C y la librería DS2482, donde se encuentran todos los comandos que necesita el chip ubicado en la tarjeta 1-Wire to I2C para obtener los datos, en el área de descargas la puedes obtener. Al trabajar en conjunto con estas librerías y enviando los comandos que necesita el sensor , obtenemos la temperatura. todas las funciones que empiezan en ds. , son funciones de la librería del chip DS2482, los comandos que se escriben en hex, son para poder leer los datos del sensor, los puedes revisar en el datasheet del dispositivo. Adicional a esto mostramos en un display LCD 16×2 controlado por un Serial Backpack V2 que lo vimos en el tutorial anterior, por eso se encuentran las funciones del Backpack al final del código
#include  //Incluye libreria para I2C

#include  //Incluye libreria para el Chip DS2482

DS2482 ds(0); //DS2482-100 se ajusta en 0 ya que tiene una sola linea al bus 1-Wire

byte data[8]; //Para almacenar los datos

byte addr[8]; //1-wire bus y direccion

String cadena; // Estas variables se utilizan para poder mostrar en la LCD

String cadena2;

int Tc_100; //Almacena la temperatura

void setup()

{

  Wire.begin(); //Inicia el protocolo

  ds.reset();

  Serial.begin(9600); // Inicia el pueto Serial

   ds.wireReset();

   ds.wireSkip();

   ds.wireWriteByte(0x44); //Inicia la conversion de temperatura en todos los dispositivos

   delay(1000); //Espera para la conversion

  }

void loop()

{

  //Realiza la busqueda

  if ( !ds.wireSearch(addr))

     {

  ds.wireResetSearch();

  ds.wireReset();

  ds.wireSkip();

  ds.wireWriteByte(0x44); //conversion de temperatura en todos los dispositivos

  delay(1000); //Espera para la conversion

  return;

      }

   

   for( int i = 0; i < 8; i++) { // Se van recibiendo los bytes a traves de este bucle

   cadena = String(addr[i], HEX);

       if (addr[i] < 16) // Esto es para agregar los 0 iniciales en los numeros Hex

       cadena2 =cadena2 + "0";

       cadena2 =cadena2 +cadena ; //Se tiene como un String la cadena de direccion

     } //Esto e spor si quieres mostrar la direccion

    if (ds.crc8(addr, 7) != addr[7]) { //Para chequear el CRC del Sensor

    //Serial.println("CRC is not valid!");

    return;

   }

   

if (addr[0]==0x28) { //Verifica que el sensor sea un DS18B20(La direccion inicia con un 0x28)

  //Leer los datos de temperatura.

  ds.wireReset();

  ds.selectChannel(0); //Es el canal del DS2482-100

  ds.wireSelect(addr);

  ds.wireWriteByte(0xbe); //Comando para leer el Scratchpad del sensor

//Muestra los valores hex del Scratchpad

 for ( int i = 0; i < 9; i++) { // Se necesitan 9 bytes

  data[i] = ds.wireReadByte(); //Se lee los datos y se alamcena en la variable

      }

//Convertir la temperatura a decimal

  int LowByte = data[0];

  int HighByte = data[1];

  int TReading = (HighByte << 8) + LowByte; //desplazamiento del Highbyte y se une al LOWbyte

  int SignBit = TReading & 0x8000; // testea el bit mas significativo

  if (SignBit) // si es negativo

  {

    TReading = (TReading ^ 0xffff) + 1; // 2's comp

  }

   Tc_100 = (double)TReading * 0.0625 * 10; //Conversion

  if (SignBit) // If its negative

  {

     Tc_100=0-Tc_100;

  }

   }

    //Imprimir temp para cada sensor

    //Para mostrar en la LCD

 selectLineOne();

 if (cadena2 == "280914c80600001f" ){

  Serial.print("Sensor1");

   }else if (cadena2 == "28946cc8060000b7"){

    Serial.print("Sensor3");

    } else if (cadena2 == "28a4b048060000fc"){

         Serial.print("Sensor2");

    }

// Serial.print(cadena2);

 cadena2= ""; //Limpia la variable

 selectLineTwo();

 Serial.print("Temp= ");

 Serial.print(Tc_100/10);

 Serial.print(".");

 Serial.print(Tc_100 % 10);

 delay(300);

 Tc_100=0; // limpia la variable

}

 //Funcione spara mostrar en el LCD a traves del Serial Backpack

void selectLineOne(){ //pone el cursor en la linea 1

   Serial.write(0xFE); //comando para iniciar

   Serial.write(128); //indica la posicion

   delay(10);

}

void selectLineTwo(){ //pone el cursor en la linea 2

   Serial.write(0xFE); //comando para iniciar

   Serial.write(192); //indica la posicion

   delay(10);

}

 

Demostración

Acá tenemos un vídeo donde podremos observar el funcionamiento de nuestro circuito. Como se explicó anteriormente, tenemos tres sensores de temperatura conectados a un bus 1-Wire y este bus va conectado a la tarjeta "1-Wire to I2C", de manera que tenemos dos líneas de comunicación, SDA y SCL, conectadas al PICARO. Podemos observar que gracias a ésta tarjeta, nos evitamos la utilización de resistencias Pull-Up para líneas SDA y SCL.

¿En busca del Kit PICARO?

Con el PICARO Starter Kit podrás realizar estos ejemplos ¡y mucho más!
Producto Chileno. Encuéntralo en MCI Electronics.

Contacto

Direccion Luis Thayer Ojeda 0115 Of. 1104,

(Piso 11) Providencia, Santiago, Chile.

Phone: +56 2 2333 9579

Horario Lunes a Viernes de 8:30 a 18:00 horas. 

Nosotros

En MCI Electronics, estamos aquí para mantener la industria en movimiento. Nuestro objetivo es difundir y hacer accesible el uso de la electrónica a todo aquel que tenga el interés. Para ello nos esforzamos para traer los mejores componentes y módulos de manera que puedas aprender desarrollando tus propios proyectos.

Somos tu aliado en electrónica.

Suscríbete a nuestro boletín