Daten vom BMA180-Beschleunigungsmesser in Arduino sind sporadisch

Ich habe versucht, einen BMA180 (ich bin bereits auf meinem zweiten) dazu zu bringen, einen kontinuierlichen Strom von Beschleunigungsdaten über eine serielle Schnittstelle zu senden (eventuell Bluetooth, aber das ist ein Problem für einen anderen Tag). Ich habe mir zahlreiche Beispiele angesehen und versucht, sie nachzuahmen, und bin immer wieder auf das Problem gestoßen, dass Daten in „Anfällen und Anfängen“ ankommen. Ein Paket, ein oder zwei Sekunden warten, ein paar Pakete mehr usw. Normalerweise endet dies damit, dass die Daten alle zusammen nach 5, 10, 50 Chunks anhalten.

Meine Verkabelung ist wie hier gezeigt, aber ich habe VIO nicht angeschlossen. Wenn VIO an 3,3 V gebunden ist, ist mein Ausgang nur Nullen. :Verkabelung des Anschlusses zwischen Platine und Arduino

Dies ist mein Code, der aus mehreren anderen Quellen übernommen wurde:

#include <Wire.h>
#define DEVICE ((byte)0x40)  
#define DATA_X0      0x02   
#define AXIS_SHIFT   2   
#define DELAY_RATE   500

int counter = 0;


static void readFrom(byte address, byte num, byte *buff) {
  Wire.beginTransmission(DEVICE); 
  Wire.write(address);      
  Wire.endTransmission(); 

  Wire.requestFrom(DEVICE, num);  
  num = Wire.available();

  while(num-- > 0) {
    *(buff++) = Wire.read(); // receive a byte
  }
}

void setup()
{
  Wire.begin();          // join i2c bus (address optional for master)
  Serial.begin(115200);  // start serial for output
  Serial.flush();
  delay(15);
}

void loop()
{
  digitalWrite(13, HIGH); 
  int axis[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);             
}

Dies ist, was ich in seltsamen sporadischen Stößen in den seriellen Monitor bekomme:

-879
321
17077
16519

-411
345
16761
16695

249
0
0
249

........etc...... Ich vermute, dass der 249 /0 /0/ 249-Klumpen die Temperatur ist, weil sie ein wenig steigen und fallen wird, obwohl die Anwendung meiner Schreibtischlampe dazu führte, dass alle Daten aufhörten . Ich bin verblüfft. Die 'L'-LED auf dem Arduino blinkt, wenn die Pakete herausgeschoben werden, also denke ich, dass es kein Problem mit der seriellen Schnittstelle ist. Ich würde mich hier wirklich über Ideen freuen.

Was ist ein "BMA180"?
@LeonHeller Es ist die 3:30 von Atlanta nach Boston, nicht wahr?
So leid. Es ist ein Beschleunigungsmesser. Siehe hier: sparkfun.com/products/9723
@Kardasis, hast du VIO sowohl von der Level-Shifting-Platine als auch vom eigentlichen Modul getrennt?
Jemand hat den Datenblatt-Link vergessen, ich verstehe die Frustration, aber zwei Downvotes? Könnte jemand erklären. Es sieht so aus, als ob jemand versucht, ein Elektronikproblem zu lösen, selbst wenn er gerade erst anfängt. Für das Verteidigungsniveau von Off-Topic-Fragen finde ich das erstaunlich.
@kortuk Ich habe wegen fehlender Details abgelehnt. Ich glaube nicht, dass es eine enge Abstimmung rechtfertigt. Jetzt wurde das Detail hinzugefügt, mein Downvote wurde rückgängig gemacht.
VIO ist mit der Level-Shifting-Platine verbunden. 3,3 V auf der BMA180-Seite und 5 V auf der Arduino-Seite.
Die ganze Schaltung sieht für mich falsch aus. Das BMA180-Board hat eine Pinbelegung, die mir "SPI" zuruft. Es ist jedoch mit den I²C-Pins des Arduino verbunden. Das macht keinen Sinn, es sei denn, der BMA180 kann sowohl im I²C- als auch im SPI-Modus laufen. Kann es? Wie sagen Sie ihm, was er verwenden soll?
@Majenko - anscheinend haben Sie es in den I2C-Modus versetzt, indem Sie CS hoch und SDO niedrig binden.
FYI: Ich habe dieses Breakout-Board ohne Pegelwandlung auf I2C-Busleitungen verwendet und es ist nicht ausgefallen ;) Ich denke, die Widerstände, die Sie auf dem Board sehen können, kümmern sich darum.

Antworten (1)

I2C ist ein bidirektionaler Datenbus. Sie scheinen einen unidirektionalen Pegelübersetzer (wahrscheinlich http://www.sparkfun.com/products/8745 ) zu verwenden, der so verdrahtet ist, dass er nur Daten von der Niederspannungsseite zur Hochspannungsseite übertragen kann und nicht umgekehrt . Dadurch werden Sie daran gehindert, Befehle an den Beschleunigungsmesser zu senden, um Daten anzufordern, sodass Sie nur etwas sehen würden, wenn er beschließt, selbst Daten zu produzieren. (EDIT: Anscheinend ist der Konverter zumindest etwas bidirektional)

Außerdem müssen Sie das VIO hoch binden. Indem Sie es schwebend lassen, lassen Sie wahrscheinlich Rauschen den Chip irgendwie auslösen, um gelegentlich Daten zu erzeugen.

Beachten Sie auch, dass I2C Pullup-Widerstände benötigt.

Der Wechsel zu SPI könnte eine Option sein, da in diesem Fall jeder Pin ungerichtet wäre, Sie müssen jedoch 3 Ausgänge von der 5-V- bis zur 3,3-V-Seite (/CS, SCK, MOSI) ansteuern und Ihr vorhandener Übersetzer unterstützt nur 2. Sie könnte etwas für den dritten aus Diskreten bauen.

Wenn Sie CS und SDO nicht verbunden lassen, können Sie den Chip möglicherweise im Stand-Alone-Modus betreiben, wo er zuverlässig Daten selbst produziert, aber dann müssten Sie das Programm in die Lage versetzen, die Daten zu erfassen, wann immer sie erscheinen, vielleicht indem Sie eine verwenden unterbrechen (oder eine Polling-Schleife, wenn Sie garantieren können, dass nichts anderes vor sich geht).

Hier ist ein Tutorial zum Modifizieren des Arduino selbst, um auf 3,3 V zu laufen, wodurch das Problem der Pegelkonvertierung beseitigt wird: http://www.adafruit.com/blog/2011/04/19/tutorial-tuesday-converting-an-arduino- zu-3-3v/

Die Sparkfun-Seite für den Pegelwandler sagt, dass er mit I2C kompatibel ist, und ich bin mir ziemlich sicher, dass die Anfragen (zumindest manchmal) an den Chip gelangen, weil die herauskommenden Daten korrekte Beschleunigungsdaten in x, y, z sind). es kommt einfach nicht vorhersehbar oder kontinuierlich. Pull-up-Widerstände sind meiner Meinung nach in den Logikpegelwandler eingebaut.
@Kardasis - Möglicherweise, aber Sie müssen das VIO für einen zuverlässigen Betrieb anschließen. Dass Sie dabei Nullen erhalten, weist darauf hin, dass Sie eine Datenanforderung nicht erfolgreich stellen - höchstwahrscheinlich, wenn Sie Daten erhalten, ist dies "aus Versehen".
O JUNGE! Beim VIO hast du recht. Was Sie nicht bemerkt haben, ist, dass ich ein totaler n00b / yutz bin und die LED, die ich vom SDI-Pin mit Masse verbunden habe, den Pin anscheinend auf Low gezogen hat. Ugggg. Danke für die Hilfe.