Go Down

Topic: Lectura de sensor I2C, transmisión por ADC. (Read 732 times) previous topic - next topic

AdalSC

Hola, estoy trabajando en un proyecto, tengo 4 sensores I2C, pero no tienen la posibilidad de hacer el cambio de la dirección, por lo que se me a ocurrido colocar una ATtiny85 a cada sensor, de esta manera hacer la lectura en protocolo I2C, para después enviarla por los pines análogos a una ARDUINO MEGA, mi pregunta es, si ¿Es posible realizar ambas operaciones en la ATtiny? leer el sensor I2C y transmitir el valor de la lectura por un pin análogo. En todo caso que me sugieren el mayor problema, como ya lo mencioné, es que no se puede realizar el cambio de dirección de los sensores.

surbyte

Puedes usar un CD4051 he ir moviendo con la direccion (3 bits) el pis SDA a cada sensor I2C.



Esta idea la vi en el foro del Sr. Gammon Multiplexing I2C, asi que adjunto su código tmb

Code: [Select]
include <Wire.h>

const byte SLAVE_ADDRESS = 42;
const byte LED = 13;

const byte slaveCount = 3;  // how many slaves

// the multiplexer address select lines (A/B/C)
const byte addressA = 6; // low-order bit
const byte addressB = 5;
const byte addressC = 4; // high-order bit


void setup ()
  {
  Wire.begin ();
  pinMode (LED, OUTPUT);   
  pinMode (addressA, OUTPUT);
  pinMode (addressB, OUTPUT);
  pinMode (addressC, OUTPUT);
   
  }  // end of setup

int selectTarget (const byte which)
  {
  // select correct MUX channel
  digitalWrite (addressA, (which & 1) ? HIGH : LOW);  // low-order bit
  digitalWrite (addressB, (which & 2) ? HIGH : LOW);
  digitalWrite (addressC, (which & 4) ? HIGH : LOW);  // high-order bit
  }  // end of readSensor

 
void loop ()
  {
  for (byte target = 0; target < slaveCount; target++)
    {
    selectTarget (target);
    for (byte x = 2; x <= 7; x++)
      { 
      Wire.beginTransmission (SLAVE_ADDRESS);
      Wire.write (x);
      if (Wire.endTransmission () == 0)
        digitalWrite (LED, HIGH);
      else
        digitalWrite (LED, LOW);
       
      delay (200);
      }  // end of for loop
    }
  }  // end of loop





AdalSC

Es muy útil esa opción, ya había considerado utilizar un mux, pero lo descarté por las ATtinys para tener la opción de actualizar el sistema después. Lo que quiero confirmar, es que, si conecto una ATtiny a cada sensor, obtengo su señal por i2c, ¿De que manera envío esa lectura a una Arduino central que recopilará todas las lecturas? Sin utilizar el mismo protocolo I2C, como lo dice el título tenia pensado utilizar los pines análogos, pero quiero confirmar si no existe algún conflicto entre librerías, o algún otro.

surbyte

#3
Mar 21, 2017, 05:10 pm Last Edit: Mar 21, 2017, 05:12 pm by surbyte
Tienes un ATtiny leyendo el sensor y debes reportarlo al MASTER, pues tienes varios caminos.
1 es por RS485, otro es por radio usando por ejemplo un nRF24.
Transmitir por ADC no existe.. diras que quieres transmitir por corriente o sea 4-20mA por ejemplo, lo que implica interfaz.
Me parece muy complicado pero no entiendo porque esa manera de tansmitir la info a menos que tengas un PLC o una placa que solo pueda recibir los datos de ese modo.


Transmitir una tensión no es un modo apropiado, x la longitud de los cables. El modo que se usa en industria es x corriente como ya te he mencionado 4-20mA

Yo usaría los modulos nRF24 o bien usaría ESP8266-07 o 12 para leer el sensor y enviar todo por WIFI al maestro.

Es como lo visualizo yo, claro que tal vez tu tengas restricciones de otra índole.

AdalSC

La opción que mencionas de utilizar los módulos de RS485, me parece muy bien, hace más robusto el sistema, te agradezco mucho, solo la última duda, el bus del i2c y el rs485 no me generan conflictos entre ellos? Por RS485 ya solo me estaría comunicando entre ATtinys y Arduino, sin conflicto con las direcciones de mis sensores?

surbyte

El unico tema es que tengas suficientes pines.
RS485 requieres 3 pines ademas de GND. TX RX y un pin para control de la comunicación.

Debes agregar un simple protocolo tal que pongas a todos los esclavos escuchando siempre y respondan las peticiones del MASTER. Cada esclavo tendra un numero de nodo de 1 a N y será consultado por el master.
Master envia un telegrama a todos, responde solo el que corresponda a ese nodo y luego se pone en modo TX y el master en modo RX.
Asi funciona.

Un protocolo que lo hace es MODBUS pero en el playgound encontrarás protocolos RS485 simples.
Solo envias bytes con algo como  NN CC Cr donde

NN son bytes para identificar los nodos
CC es un código de 2 bytes que puede ser solo 1 tmb
Cr un checksum para descartar o aceptar el paquete enviado/recibido.


Go Up