12 Beschleunigungssensor
Beschleunigungssensor
Der MMA7455L ist ein sehr günstiger Beschleunigungssensor von
Freescale. Er wird über das i2c Interface angesprochen und kann auf drei verschiedenen Stufen (2g, 4g, 8g) betrieben werden. Um die Handhabung so einfach wie möglich zu machen existiert eine
Library für Arduino und der Sensor kommt auf einem
Breakout-Board.
Das I2C Interface
Das
i2c Interface wurde ursprünglich von Phillips entwickelt um eine Kommunikation von einzelnen Komponenten zu ermöglichen. Manche Hersteller verwenden auch die Bezeichnung TWI Interface (Two-Wired-Interface). Wie der Name schon verrät nutzt das i2c Interface zwei Signalleitungen um mit der Peripherie zu kommunizieren. Eine Leitung ist dabei die Taktleitung (SCL) und die andere die Datenleitung (SDA). Beide Leitungen liegen mit einem Pullup Widerstand an VCC.
Sensor Anschliessen
Der Anscluss des Beschleunigungssensors (MMA 7455L) ist relativ einfach. Die i2c Schnittstelle verlangt lediglich zwei Leitungen (Analog4/SCL und Analog5/SDA) wovon eine die Clock bedient und eine die Daten. Um die Kommunikation zu gewährleisten müssen zusätzlich an die SCL und SDA Leitung jeweils ein Pullup Widerstand zu VCC (3.3V) eingefügt werden. Der Sensor läuft mit 2.4–3.7V weshalb wir ihn an dem 3.3V Ausgang des Arduino betreiben. GND wird wie gewohnt mit dem GND des Arduino verbunden.
VCC → 3.3V
GND → GND
SDA → A5
SCL → A4
Download Library
Download Library
Die MMA_7455 Library für Arduino macht das Ansteuern des Sensors sehr einfach. Die Library muss heruntergeladen werden und wird dann in Macintosh "HD/Applications/Arduino.app/Contents/Resources/Java/libraries" kopiert. Danach sollte Arduino neu gestartet werden um die Library einzubinden.
Funktionen
MMA_7455
Diese Funktion instanziert die MMA_7455 Library und aktiviert die
Wire Library, welche für die Kommunikation über i2c gebraucht wird.
initSensitivity(int)
Hier wird festgelegt, wie sensibel der Sensor reagieren soll. Dies hängt stark von der Nutzung des Sensors ab. Über die Variable kann die Sensibilität angegeben werden. Dabei gilt: 2=2g, 4=4g und 8=8g.
calibrateOffset(float, float, float)
Hier kann das Offset des Sensors kalibriert werden. Über die drei float-Werte können Korrekturen vorgenommen werden. Um die korrekten Werte dafür zu ermitteln sollten zunächst ohne Kalibrierung die Werte des Sensors ausgelesen werden, wenn dieser auf einer flachen Oberfläche aufliegt. Die so erhaltenen Werten sollten so korrigiert werden, dass für xVal+float = 0, yVal+float = 0 und zVal+float = 64 herauskommt. Dann kann die calibrateOffset() Funktion im setup() einmalig mit den korrigierten Werten aufgerufen werden.
readAxis(char)
Hier wird der Sensor ausgelesen. Durch die Übergabe des entsprechenden Parameters ('x', 'y' oder 'z') wird die gewünschte Achse angesprochen.
Code
#include <Wire.h> //Include the Wire library
#include <MMA_7455.h> //Include the MMA_7455 library
MMA_7455 mySensor = MMA_7455(); //Make an instance of MMA_7455
char xVal, yVal, zVal; //Variables for the values from the sensor
void setup()
{
Serial.begin(9600);
// Set the sensitivity you want to use
// 2 = 2g, 4 = 4g, 8 = 8g
mySensor.initSensitivity(2);
// Calibrate the Offset, that values corespond in
// flat position to: xVal = -30, yVal = -20, zVal = +20
// !!!Activate this after having the first values read out!!!
//mySensor.calibrateOffset(5, 20, -68);
}
void loop()
{
xVal = mySensor.readAxis('x'); //Read out the 'x' Axis
yVal = mySensor.readAxis('y'); //Read out the 'y' Axis
zVal = mySensor.readAxis('z'); //Read out the 'z' Axis
Serial.print(xVal, DEC);
Serial.print("\t");
Serial.print(yVal, DEC);
Serial.print("\t");
Serial.println(zVal, DEC);
}
// SERIAL READ
// Embodied Interaction Design Basics
// Moritz Kemper, IAD Physical Computing Lab
// ZHdK, 30/10/2011
import processing.serial.*; // Import the Processing Serial Library for communicating with arduino
Serial myPort; // The used Serial Port
int xVal, yVal, zVal; // fourthValue, fifthValue, ... // add more if needed
int xPosition = 0;
float xRotation, yRotation;
boolean Q1, Q2, Q3, Q4;
void setup()
{
background(0);
size(500, 500, P3D);
println(Serial.list()); // Prints the list of serial available devices (Arduino should be on top of the list)
myPort = new Serial(this, Serial.list()[16], 9600); // Open a new port and connect with Arduino at 9600 baud
}
void draw()
{
background(0);
translate(width/2, height/2);
float xValCorrected = float(xVal)/64;
float yValCorrected = float(yVal)/64;
float zValCorrected = float(zVal)/64;
rotateX(atan(yValCorrected/sqrt(sq(xValCorrected)+sq(zValCorrected))));
rotateZ(atan(xValCorrected/sqrt(sq(yValCorrected)+sq(zValCorrected))));
fill(255);
box(80);
//println(xVal+"\t"+yVal+"\t"+zVal+"\t");
println(xValCorrected+"\t"+yValCorrected+"\t"+zValCorrected+"\t");
//println(xRotation+"\t"+yRotation);
}
void serialEvent(Serial myPort) // Is called everytime there is new data to read
{
if (myPort.available() > 0)
{
String completeString = myPort.readStringUntil(10); // Read the Serial port until there is a linefeed/carriage return
if (completeString != null) // If there is valid data insode the String
{
trim(completeString); // Remove whitespace characters at the beginning and end of the string
String seperateValues[] = split(completeString, ","); // Split the string everytime a delimiter is received
xVal = int(seperateValues[0]);
yVal = int(seperateValues[1]);
zVal = int(seperateValues[2]);
}
}
}
Weitere Informationen
Datenblatt
Calibrating 0g Offset for the MMA745xL Family
http://www.starlino.com/imu_guide.html