Interfaz Arduino con sensor de presión I2C

Tengo un sensor de presión Honeywell ASDXRRX100PD2A5 I2C que quiero leer usando un Arduino.

Mirando la hoja de datos, sé que la dirección I2C es 0x28, y he jugado con fragmentos de código que he encontrado en Internet, pero ninguno de ellos tiene ningún sentido. Los números aumentan a medida que aumento la presión, pero no en la escala que se muestra en la hoja de datos.

Aquí hay un enlace a dicha hoja de datos: http://www.farnell.com/datasheets/1676926.pdf

Aquí hay una hoja de datos que tiene información sobre la comunicación con sensores Honeywell usando I2C: http://sensing.honeywell.com/index.php/ci_id/45841/la_id/1/document/1/re_id/0

Sin tener mucha experiencia con I2C en el pasado, es difícil para mí entenderlo.

Además, aquí hay una foto de mi configuración:

mi configuración

El código que estoy usando para probarlo en este momento es el siguiente:

#include<Wire.h>
#define sensor 0x28 //Unique bus address 

void setup()
{ 
  Wire.begin();//Wakes up I2C bus 
  Serial.begin(9600);
}

void getdata(byte *a, byte *b)
{
  //Move register pointer back to first register
  //Wire.beginTransmission(sensor);
  //Wire.write(1);
  //Wire.endTransmission();
  Wire.requestFrom(sensor,2);//Sends content of first two registers
  *a = Wire.read(); //first byte recieved stored here
  *b = Wire.read(); //second byte recieved stored here
}

void showdata()
{
  byte aa,bb;
  float pressure =0;
  getdata(&aa,&bb);
  Serial.print("byte 1: ");Serial.println(aa,DEC);
  Serial.print("byte 2 ");Serial.println(bb,DEC);
 delay(1000);

}

void loop()
{
  showdata();
}

Obtengo los siguientes resultados a las siguientes presiones:

0psi    byte1: 31
        byte2: 246

10psi   byte1: 34
        byte2: 102

20psi   byte1: 32
        byte2: 30

30psi   byte1: 39
        byte2: 167

Cualquier ayuda que me indique la dirección correcta sería muy apreciada.

El tipo de presión 100PD no está presente en la hoja de datos dada. Puede ser diferente. puedes comprobar de nuevo
También lo he notado, pero supongo que es solo un ejemplo, ya que el modelo que tengo es de 100 psi. Aquí está el sensor exacto que compré de Element14: uk.farnell.com/honeywell-sc/asdxrrx100pd2a5/…
¿Cómo es el protocolo de software I2c? ¿Es solo una lectura de esa dirección en particular (0x28)? ¿Tiene una tabla de mapeo para valores i2c y presión real?
En la página 4 de la hoja de datos, la Tabla 6 muestra la salida del sensor en porcentajes significativos. Estoy buscando para ser capaz de leer algo a lo largo de las líneas de esto.
¿ Qué escala siguen los números? ¿Es lineal? Tal vez podría publicar algunos ejemplos de lo que obtiene a diferentes presiones.
He editado la publicación para mostrar esto.

Respuestas (4)

¿Qué ocurre?

El sensor es diferencial, hasta 100 psi.
asi que PAG metro i norte es -100 psi, PAG metro a X es +100 psi.
Total 14 bits (de 0 a 2 14 -1),
PAG metro i norte está al 10%, entonces O tu T PAG tu T metro i norte es 1638
PAG metro a X está al 90%, entonces O tu T PAG tu T metro a X es 14745

de la hoja de datos:

PAG = ( O tu T PAG tu T O tu T PAG tu T metro i norte ) ( PAG metro a X PAG metro i norte ) O tu T PAG tu T metro a X O tu T PAG tu T metro i norte + O tu T PAG tu T metro i norte

  • tu primero O tu T PAG tu T el valor es ( 31 256 ) + 246 = 8182
    según la hoja de datos la presión es:
    ( 8182 1638 ) ( 100 ( 100 ) ) 14745 1638 100 0.14496071
  • tu segundo valor es ( 34 256 ) + 102 = 8806
    ( 8806 1638 ) ( 100 ( 100 ) ) 14745 1638 100 9.376669

    la precisión no es tan buena, pero sigue siendo aceptable
  • tercer valor: ( 32 256 ) + 30 = 8222
    ( 8222 1638 ) ( 100 ( 100 ) ) 14745 1638 100 0.46540017

    algo sale mal, no es como 20 psi, es como 0 psi.
  • cuarto valor: ( 39 256 ) + 167 = 10151
    ( 10151 1638 ) ( 100 ( 100 ) ) 14745 1638 100 29.900053
Hice una edición bastante extensa en tu publicación para formatear las expresiones usando el estilo LaTeX (MathJaX). ¿Podría por favor verificar si hay errores? ¡Gracias! Además, ¿es la segunda referencia realmente a O tu T PAG tu T metro i norte o para O tu T PAG tu T metro a X ?
Muchas gracias. Fue mi primera respuesta, usaré el formato la próxima vez.

Probablemente necesite agregar resistencias pull-up al reloj I2C y las líneas de datos. La hoja de datos dice que 1   k Ω es el mínimo, así que tal vez intente 2.2   k Ω . Las resistencias deben ir desde los pines hasta el suministro de +5V.

Desde entonces, agregué estas resistencias y todavía tengo problemas para comprender los datos.

Tengo el sensor diferencial ASDXRRX010ND2A5 con interfaz I2C. Le proporciona 2 bytes de datos que debe combinar para obtener el resultado.

Este es mi código de prueba, da una salida de alrededor de 8190 cuando no se aplica presión. Según la hoja de datos, el valor de salida es la diferencia entre los 2 puertos.

    //Sensor ASDXRRX010ND2A5

#include <Wire.h>

float a, b, Output, Pressure;
const long OutMax = 14745, OutMin = 1638;
const long PressureMax = 10, PressureMin = -10; //Inches of H20

void setup() {
  Wire.begin(0x28);

  Serial.begin(9600);
}

void loop() {
  Wire.requestFrom(0x28, 2);
   a = Wire.read();
   b = Wire.read();
  Output = BitShiftCombine(a , b);

  Pressure = (((Output - OutMin) * (PressureMax - PressureMin)) / (OutMax - OutMin)) + PressureMin;

  Serial.println(Pressure); //Inches of H20
  delay(100);

}

long BitShiftCombine( unsigned char x_high, unsigned char x_low)
{
  long combined;
  combined = x_high;              //send x_high to rightmost 8 bits
  combined = combined << 8;       //shift x_high over to leftmost 8 bits
  combined |= x_low;              //logical OR keeps x_high intact in combined and fills in rightmost 8 bits
  return combined;
}

Realmente no puedo entender ni pies ni cabeza en esto. En particular, el valor de 20 PSI parece sospechoso, ya que es más bajo que el valor de 10 PSI. ¿Seguro que no es 37?

De todos modos, esta es una medida diferencial, por lo que sospecho que 32, 0 es la mitad de la escala, 63, 255 está en la parte superior (la escala máxima es 63 * 256 + 255 = 16383 (o 3FFFh)).

Entonces, cada valor que midas, debes restar 32*256 = 8192.

El valor de 0 PSI es 32, 246, el valor completo es 8438, por lo que la presión (todavía decimal) sería 8438 - 8192 = 246. Con la escala máxima (cada lado de 8192) correspondiente a 8192, sería 246/8192 = 3,0066 psi. ¿Presión residual? ¿O debería ser 31, 246?

El valor de 30 PSI 39, 167, es realmente 10151, luego 10151-8192=1959. Esto es 1959/8182 de 100 PSI, por lo que 23,9 PSI.

El valor de 10 PSI 34, 102, es realmente 8806, luego 8806-8192=614. Esto da como resultado 614/8192 de 100 PSI = 7,5 PSI

Hipotéticamente, si el primer número para 20PSI fuera 37, el número sería 9502, o 9502-8192= 1320 positivo, o 1320/8192 de 100PSI = 16PSI

¿Podría ser esta una buena explicación?

Aquí hay una captura de pantalla de una hoja de cálculo:

ingrese la descripción de la imagen aquí

Mmmm. 0PSI está muy lejos. ¿Quizás el valor era 31, 246? Eso da:

ingrese la descripción de la imagen aquí

¿Lo que me hace sospechar que tal vez deberías leer varias veces hasta que dos valores consecutivos coincidan? Tenga en cuenta que es poco probable que confunda 31 y 32 debido a una resistencia pull-up más o menos. 31 son 5 consecutivos, mientras que 32 es uno solo [;-)]. Además, el valor de 0PSI está realmente fuera del rango de calibración del fabricante, que va del 10 al 90%.

Editar : dudo que tenga errores de lectura (aunque, por supuesto, no puedo excluir la posibilidad). Para evaluar eso, le sugiero que intente hacer, digamos 100 mediciones en las mismas condiciones, es decir, la misma presión. Lo más fácil sería solo a 0 PSI. Intente hacer la prueba sin pausa, luego con intervalos de 100ms más o menos. Busque saltos mayores que 1 en la combinación de b1 y b2 (es decir, en el número b1*256 + b2.

He probado otros fragmentos de código con resultados diferentes, entonces, ¿podría ser que el código que estoy usando esté leyendo incorrectamente desde el sensor?
Encontré esta hoja de datos que se refiere a la comunicación I2C con sensores Honeywell. Lo agregaré a la pregunta principal: sensing.honeywell.com/index.php/ci_id/45841/la_id/1/document/1/…
Agregué una sugerencia para una prueba de confiabilidad a la respuesta.
Además, los cálculos de la aplicación confirman mis cálculos, con la diferencia de que resté la compensación en la lectura, mientras que la hoja de datos propone hacerlo en el valor de presión.
Desde entonces he aumentado la cantidad de bytes que se leen. Parece que el byte 15 es 4 por psi, por lo que 10 psi se mostrarían como 40, 20 psi se mostrarían como 80. Parece ser el único byte que he reconocido como una lectura consistente. Pero solo sube a 255, que son 63,75 psi. Gracias por tu ayuda hasta ahora por cierto
Eso es extraño. La información del protocolo I2C muestra solo un máximo de 4 bytes del sensor, en cuyo caso los bytes 3 y 4 son la temperatura del sensor de presión. Dudo que los bytes tan atrás estarían enviando información calibrada. ¿Quizás esos números no están calibrados? ¿Está utilizando el sensor real (plástico) o está integrado en un módulo? De la foto de arriba, tengo esa impresión.
Según la hoja de datos, el pin 5 es un pin de salida digital. ¿Podría ser necesario este pin para algo que desconozco? Gracias.
Es el sensor de plástico conectado a una placa de pruebas.
He hecho 100 lecturas, midiendo byte 1 y 2 para 0psi, 5psi y 10psi. Aquí hay un CSV de los datos: pastebin.com/XhxhsaHM