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:
Descargas:
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
¿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. 1105, Providencia, Santiago, Chile.
Phone: +56 2 2333 9579 / +56 2 2231 9268
Horario Lunes a Viernes de 8:00 a 18:00
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.