 |
| Arduino Nano 3.0 und Modul mit einem Beschleunigungssensor |
Zugegeben habe ich etwas lange gebraucht, um zu verstehen, wie ich diesen Sensor auslesen kann. Das liegt einerseits daran, dass ich bisher noch nichts mit I²C oder SPI gemacht habe. Nachdem ich die Anleitung gelesen hatte, habe ich erst mal nur Bahnhof verstanden. Das änderte sich, als ich es hinbekam, die gemessenen Daten auszulesen.
Da frage ich mich manchmal, warum ich das nicht gleich verstanden habe. Zum Glück gibt es ja google, das mich hin und wieder auf die richtige Seite bringt. Allerdings enthielten die Erklärungen teilweise große Lücken im Verlauf. Vielleicht schaffe ich es hier in meinem Blog dies näher und leichter zu erläutern. Und wenn nicht, kann hier entsprechend auch einen Kommentar abgeben werden für Verbesserungen. Dafür bin ich immer offen.
Zunächst haben wir hier den Sensor von Bosch Sensortec, den BMA020. Auf den 2 Bildern ist das Modul zu sehen, auf den der Sensor gelötet ist. Im Grunde ist es der kleine schwarze SMD Chip, der die Beschleunigung ausliest. Das Modul selbst besteht aus verschiedenen Schaltungen, um z.B. eine stabile Spannungsversorgung zu gewährleisten. Bestellt habe ich mir das Modul bei Amazon, wobei hier anzumerken ist, das der eigentliche Händler ELV ist. Für die Montage selbst müssen die Steckleisten verlötet werden.
 |  |
| Unterseite mit den bestückten SMD Komponenten | Oberseite mit den Beschriftungen und Ausrichtungen des Sensors |
Als zweites habe ich den Arduino Nano 3.0, der mit einem ATMega 328 bestückt ist und für seine Baugröße zahlreiche Ein- und Ausgänge bereit stellt. Für das Auslesen, brauchen wir Pin A4 und Pin A5 für die I²C Verbindung zum Sensor Modul.
 |
| Arduino Nano 3.0 |
Jetzt müssen die beiden nur richtig verbunden werden. Hierzu sind nur wenige Kabelverbindungen notwendig, wie bereits hier im Schaltbild zu sehen ist.
 |
| Links der Beschleunigungssensor, rechts der Arduino Nano 3.0 |
Als weiteres benötigen wir in C geschriebenes Programm. Hierfür habe ich in verschiedenen Foren gesucht und wurde auch fündig. Am Ende ist dieser Code herausgekommen.
#include <Wire.h>
#define AccelerometerAddress 0x38 #define Axis_X_Out1 0x02 #define Axis_X_Out2 0x03 #define Axis_Y_Out1 0x04 #define Axis_Y_Out2 0x05 #define Axis_Z_Out1 0x06 #define Axis_Z_Out2 0x07
void setup() { Wire.begin(); Serial.begin(9600); }
void loop() { Serial.println(); Serial.print("X1:"); Serial.print(readAcceleration(Axis_X_Out1), BIN); Serial.print("SX2:"); Serial.print(readAcceleration(Axis_X_Out2), BIN); Serial.print("@Y1:"); Serial.print(readAcceleration(Axis_Y_Out1), BIN); Serial.print("SY2:"); Serial.print(readAcceleration(Axis_Y_Out2), BIN); Serial.print("@Z1:"); Serial.print(readAcceleration(Axis_Z_Out1), BIN); Serial.print("SZ2:"); Serial.print(readAcceleration(Axis_Z_Out2), BIN); delay(500); }
byte readAcceleration(byte address) { byte val = 0x00; Wire.beginTransmission(AccelerometerAddress); Wire.write(address); Wire.endTransmission(); Wire.requestFrom(AccelerometerAddress, 1); val = Wire.read(); return val; } |
| Die Ausgabe kann über die Serielle Verbindung gelesen werden. |
Um eine gewisse Übersicht zu behalten, habe ich darauf geachtet, dass der Code auch wirklich kurz gehalten ist und keine unnötigen weiteren Funktionen hat.
Mit #include wird die Library eingebunden, die für die I²C Verbindung erforderlich ist. Die darauf folgenden #define sind Adressen für das auslesen des Sensors. Die erste davon ist die Adresse vom Sensor selbst, da an dem I²C Bus auch mehrere Geräte oder Module Angeschlossen werden können. Mit “Axis_X_Out1” werden die ersten zwei Bits gelesen. Um die eine Achse von ihren Werten vollständig zu erhalten, ist anschließend die Abfrage mit der Adresse “Axis_X_Out2” erforderlich. Zusammengesetzt sind es dann 10 Bits. Die ersten 2 Bits sagen aus, mit wie viel G einwirkt. Die weiteren 8 Bits geben dann den eigentlichen Wert wieder. Das gleiche gilt auch für die weiteren 2 Achsen.
Nun zur Methode “byte readAcceleration(byte address)”. Sie erledigt die eigentliche Aufgabe, die gewünschten Daten aus dem Sensor zu bekommen. Mit “Wire.beginTransmisson” und der Übergabe der Adresse zum Sensor stellen wir eine Verbindung her. Anschließend mit “Wire.write” übergeben wir nun die Adresse für eine der Achsen und mit “Wire.endTransmission” geben wir hier ebenfalls die Adresse des Sensors, um die Verbindung zu beenden. Im folgenden muss noch die Methode “Wire.requestFrom” mit der Adresse des Sensors und ein weiterer Wert für die Anzahl zu erwartenden Bytes.
So, das war die Beschreibung zum Code, der auf dem Arduino ausgeführt wird. Nun will man ja auch das ganze auf dem Bildschirm sehen.
 |
| Alle Werte der 3 Achsen, allerdings noch in Binär. Das ist für die meisten schlecht zu lesen. |
Zur Not kann auch der Serial Monitor vom Arduino Programm verwendet werden, oder man schreibt sich eine Desktop Anwendung, die das auch visualisiert.
 |
| Desktop Anwendung für die Visualisierung der gemessenen Daten aus dem Sensor. |
Da die Beschreibung der Anwendung meinen Rahmen für einen Blog Eintrag sprengen würde, belasse ich es hierbei. Als Hinweis gebe ich jedoch, wer hier mit dem .Net Framework arbeitet, benutzt am besten die Klasse “SerialPort”. Die kann alles, was man für das Auslesen zu einer seriellen Verbindung benötigt.