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. :
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.
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/
Leon Heller
Majenko
Kardasis
Kortuk
Kortuk
Majenko
Kardasis
Majenko
Chris Stratton
Mchl