Los datos del acelerómetro BMA180 en arduino son esporádicos

4

He estado tratando de obtener un BMA180 (ya estoy en mi segundo) para enviar un flujo continuo de datos de aceleración a través de un puerto serie (eventualmente bluetooth, pero eso es un problema para un día diferente). He mirado y tratado de emular numerosos ejemplos y constantemente me he encontrado con el problema de los datos que vienen en "ajustes y comienzos". Un paquete, espere uno o dos segundos, algunos paquetes más, etc. etc. Por lo general, esto termina cuando los datos se detienen todos juntos. Después de 5, 10, 50 trozos.

Mi cableado es como se muestra aquí pero tengo VIO desconectado. Cuando VIO está vinculado a 3.3V, mi salida es todos 0. :

Esteesmicódigo,queestáadaptadodevariasotrasfuentes:

#include<Wire.h>#defineDEVICE((byte)0x40)#defineDATA_X00x02#defineAXIS_SHIFT2#defineDELAY_RATE500intcounter=0;staticvoidreadFrom(byteaddress,bytenum,byte*buff){Wire.beginTransmission(DEVICE);Wire.write(address);Wire.endTransmission();Wire.requestFrom(DEVICE,num);num=Wire.available();while(num-->0){*(buff++)=Wire.read();//receiveabyte}}voidsetup(){Wire.begin();//joini2cbus(addressoptionalformaster)Serial.begin(115200);//startserialforoutputSerial.flush();delay(15);}voidloop(){digitalWrite(13,HIGH);intaxis[5]={0x0101,0,0,0,0};readFrom(DATA_X0,6,(byte*)(axis+1));axis[1]=axis[1];axis[2]=axis[2];axis[3]=axis[3];axis[4]=axis[1]+axis[2]+axis[3];Serial.println("");
  Serial.println(axis[1]);
  Serial.println(axis[2]);
  Serial.println(axis[3]);
  Serial.println(axis[4]);
  counter++;

  delay(100);              
  digitalWrite(13, LOW);  
  delay(100);             
}

Esto es lo que recibo al monitor en serie, en extraños esporádicos empujes:

-879
321
17077
16519

-411
345
16761
16695

249
0
0
249

........ etc ...... Sospecho que el fragmento 249/0/0/249 es la temperatura porque subirá y bajará un poco, aunque la aplicación de la lámpara de mi escritorio hizo que todos los datos cesaran. Estoy desconcertado El LED 'L' en el arduino parpadea cuando los paquetes se expulsan, así que creo que no es un problema de puerto serie. Realmente apreciaría cualquier idea aquí.

    
pregunta Kardasis

1 respuesta

3

I2C es un bus de datos bidireccional. Parece que estás usando un traductor de nivel unidireccional (probablemente enlace ) conectado de forma tal que solo pueda pasar datos desde el nivel bajo Tensión lateral a la alta tensión, y no a la inversa. Esto evitará que envíe comandos al Acelerómetro para solicitar datos, por lo que solo vería algo si decidiera producir datos por su cuenta. (EDITAR: aparentemente el converso es al menos un tanto bidireccional)

Además, debes atar el VIO alto. Al dejarlo flotando, probablemente esté permitiendo que el ruido active el chip de alguna manera para producir datos de vez en cuando.

También tenga en cuenta que I2C requiere resistencias pullup.

Cambiar a SPI podría ser una opción, ya que en ese caso cada pin sería unidireccional; sin embargo, necesita controlar 3 salidas desde el lado de 5v a 3.3v (/ CS, SCK, MOSI) y su traductor existente solo admite 2. Podrías construir algo para el tercero desde discretos.

Si deja CS y SDO desconectados, es posible que pueda operar el chip en modo independiente, ya que produciría datos de manera confiable por sí mismo, pero luego tendría que hacer que el programa sea capaz de capturar los datos cuando aparezcan, tal vez utilizando una interrupción (o un bucle de sondeo si puede garantizar que no va a pasar nada más).

Aquí hay un tutorial sobre cómo modificar el propio Arduino para que se ejecute en 3.3v, eliminando así el problema de conversión de nivel: enlace

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas