Trastejant

Crea, comparte, aprende y disfruta

Protocolo OneWire

Protocolo One Wire

Dallas Semiconductor fabrica una familia de dispositivos que pueden ser controlados mediante el protocolo 1-wire® (un cable)

En una red 1-wire- Denominadas MicroLan® un dispositivo Maestro se comunica con uno o más dispositivos esclavo que también soporten el protocolo 1-Wire® a través de un único cable de datos que además puede utilizarse para alimentar los dispositivos esclavos (a este modo se le conoce cómo funcionamiento en modo de potencia parasitaria).

Las MicroLand® son accesibles directamente con Arduino utilizando la librería 1-wire, o empleando una interfaz que se encarga de gestionar la conexión, reduciendo la carga de trabajo de Arduino.

Alimentación de dispositivos 1-wire®

Los chip que soportan el protocolo 1-wire® pueden ser alimentados en modo parasitario o con una fuente de alimentación externa(modo normal).

Modo parasitario

En este modo se necesitan únicamente dos cables, el de datos y el de tierra. para un buen funcionamiento es necesario colocar una resistencia pull-up de 4.7KOhm al cable que llevará los datos.

Cuando la linea esta recibiendo un valor alto el dispositivo se alimenta de ella y carga un condensador interno que permite el funcionamiento durante los pulsos bajos.

Algunas operaciones pueden requerir hasta 1.5mA y un tiempo de espera de hasta 750mS, durante este tiempo no se pueden enviar ordenes al dispositivo. La libreria OneWire se encarga de gestionar estos tiempos.

Fuente externa

Alimentación que se suele usar en todos los dispositivos, requiere de tres cables, dos de alimentación (Vcc y GND) y otro para los datos. En este ultimo la resistencia pull-up de 4.7KOhm sigue siendo necesaria, pero se eliminan los tiempos de espera, ya que el dispositivo esta siendo alimentado de manera continua y esta preparado para recibir nuevas ordenes tan pronto cómo termina la tarea actual.

Utilizando dispositivos OneWire

Cada dispositivo OneWire cuenta con una dirección única de 64bits grabada en su ROM. Esta clave esta compuesta por 8bits que definen la familia del dispositivo, 48bits que contienen el número de serie y un CRC de 8bits que se usa para comprobar la integridad de los datos.

Si por ejemplo quisiésemos acceder a un sensor de temperatura que soporte OneWire primero comprobamos que se trate de un dispositivo de la familia DS18S20 verificando el código de familia, que deberá ser 0x10.

Antes de enviar un comando a un dispositivo esclavo, el maestro deberá seleccionar dicho dispositivo mediante su dirección de la ROM. El comando skip rom evitaría esa comprobación, enviando los comandos a todos los dispositivos conectados. Pero esto puede provocar problemas de funcionamiento y comportamientos inesperados debido a las colisiones de datos que puede darse.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
    #include   
 
    // DS18S20 Temperature chip i/o  
    OneWire ds(10);  // on pin 10  
 
    void setup(void) {  
      // initialize inputs/outputs  
      // start serial port  
      Serial.begin(9600);  
    }  
 
    void loop(void) {  
      byte i;  
      byte present = 0;  
      byte data[12];  
      byte addr[8];  
 
      if ( !ds.search(addr)) {  
          Serial.print("No more addresses.\n");  
          ds.reset_search();  
          return;  
      }  
 
      Serial.print("R=");  
      for( i = 0; i < 8; i++) {  
        Serial.print(addr[i], HEX);  
        Serial.print(" ");  
      }  
 
      if ( OneWire::crc8( addr, 7) != addr[7]) {  
          Serial.print("CRC is not valid!\n");  
          return;  
      }  
 
      if ( addr[0] == 0x10) {  
          Serial.print("Device is a DS18S20 family device.\n");  
      }  
      else if ( addr[0] == 0x28) {  
          Serial.print("Device is a DS18B20 family device.\n");  
      }  
      else {  
          Serial.print("Device family is not recognized: 0x");  
          Serial.println(addr[0],HEX);  
          return;  
      }  
 
      ds.reset();  
      ds.select(addr);  
      ds.write(0x44,1);         // start conversion, with parasite power on at the end  
 
      delay(1000);     // maybe 750ms is enough, maybe not  
      // we might do a ds.depower() here, but the reset will take care of it.  
 
      present = ds.reset();  
      ds.select(addr);      
      ds.write(0xBE);         // Read Scratchpad  
 
      Serial.print("P=");  
      Serial.print(present,HEX);  
      Serial.print(" ");  
      for ( i = 0; i < 9; i++) {           // we need 9 bytes  
        data[i] = ds.read();  
        Serial.print(data[i], HEX);  
        Serial.print(" ");  
      }  
      Serial.print(" CRC=");  
      Serial.print( OneWire::crc8( data, 8), HEX);  
      Serial.println();  
    }

También te puede interesar...

No hay temas relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.