PaulS:
2- TWO triple access accelerometer breakouts
Are they anything like triple axis accelerometers?
I think they're fairly similar.
Here's what I have so far.
It's basically just a copy of the example code for the accelerometer with a couple calculations that print out to the display...
The problem I'm running into is how to attach TWO of the triple axle accelerometers.
/*
Acclerometer Code Used (modified for LCD Display):
MMA8452Q Basic Example Code
Nathan Seidle
SparkFun Electronics
November 5, 2012
License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license).
This example code shows how to read the X/Y/Z accelerations and basic functions of the MMA5842. It leaves out
all the neat features this IC is capable of (tap, orientation, and inerrupts) and just displays X/Y/Z. See
the advanced example code to see more features.
Hardware setup:
MMA8452 Breakout ------------ Arduino
3.3V --------------------- 3.3V
SDA -------^^(330)^^------- A4
SCL -------^^(330)^^------- A5
GND ---------------------- GND
The MMA8452 is 3.3V so we recommend using 330 or 1k resistors between a 5V Arduino and the MMA8452 breakout.
The MMA8452 has built in pull-up resistors for I2C so you do not need additional pull-ups.
*/
#include <Wire.h> // Used for I2C
// Use the softwareserial library to create a new "soft" serial port
// for the display. This prevents display corruption when uploading code.
#include <SoftwareSerial.h>
// Attach the serial display's RX line to digital pin 2
SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX (unused)
// The SparkFun breakout board defaults to 1, set to 0 if SA0 jumper on the bottom of the board is set
#define MMA8452_ADDRESS 0x1D // 0x1D if SA0 is high, 0x1C if low
//Define a few of the registers that we will be accessing on the MMA8452
#define OUT_X_MSB 0x01
#define XYZ_DATA_CFG 0x0E
#define WHO_AM_I 0x0D
#define CTRL_REG1 0x2A
#define GSCALE 2 // Sets full-scale range to +/-2, 4, or 8g. Used to calc real g values.
void setup()
{
Serial.begin(57600);
Serial.println("MMA8452 Basic Example");
Wire.begin(); //Join the bus as a master
initMMA8452(); //Test and intialize the MMA8452
mySerial.begin(9600); // set up serial port for 9600 baud
delay(500); // wait for display to boot up
}
void loop()
{
int accelCount[3]; // Stores the 12-bit signed value
readAccelData(accelCount); // Read the x/y/z adc values
// Now we'll calculate the accleration value into actual g's
float accelG[3]; // Stores the real accel value in g's
for (int i = 0 ; i < 3 ; i++)
{
accelG = (float) accelCount / ((1<<12)/(2*GSCALE)); // get actual g value, this depends on scale being set
* }*
//Calculations
float X = accelG[1];
float Y = accelG[2];
float Z = accelG[3];
float a = sqrt(pow(X,2) + pow(Y,2) + pow(Z,2));
* Serial.println();*
* mySerial.print(254); // move cursor to beginning of first line*
* mySerial.print(128);*
* mySerial.print(" "); // clear display*
* mySerial.print(" ");*
* mySerial.print(254); // move cursor to beginning of first line*
* mySerial.print(128);*
* mySerial.print("X");*
* mySerial.print(X);*
* mySerial.print(ā Yā); //*
* mySerial.print(Y);*
* mySerial.print(ā Zā); //*
* mySerial.print(Z);*
* mySerial.print(254); // move cursor to beginning of second line*
* mySerial.print(192);*
* mySerial.print("Mag ");*
* mySerial.print(a);*
* delay(100); // Delay here for visibility*
}
void readAccelData(int *destination)
{
* byte rawData[6]; // x/y/z accel register data stored here*
* readRegisters(OUT_X_MSB, 6, rawData); // Read the six raw data registers into data array*
* // Loop to calculate 12-bit ADC and g value for each axis*
* for(int i = 0; i < 3 ; i++)*
* {*
_ int gCount = (rawData[i*2] << 8) | rawData[(i2)+1]; //Combine the two 8 bit registers into one 12-bit number_
_ gCount >>= 4; //The registers are left align, here we right align the 12-bit integer*_
* // If the number is negative, we have to make it so manually (no 12-bit data type)*
_ if (rawData[i*2] > 0x7F)
* { *
* gCount = ~gCount + 1;*
gCount = -1; // Transform into negative 2's complement #_
_ }_
_ destination = gCount; //Record this gCount into the 3 int array
}
}
// Initialize the MMA8452 registers*
// See the many application notes for more info on setting all of these registers:
// http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8452Q
void initMMA8452()
{
* byte c = readRegister(WHO_AM_I); // Read WHO_AM_I register*
* if (c == 0x2A) // WHO_AM_I should always be 0x2A*
* {
Serial.println("MMA8452Q is online...");
}
else*
* {
Serial.print("Could not connect to MMA8452Q: 0x");
Serial.println(c, HEX);
while(1) ; // Loop forever if communication doesn't happen*
* }
MMA8452Standby(); // Must be in standby to change registers*
* // Set up the full scale range to 2, 4, or 8g.
byte fsr = GSCALE;
if(fsr > 8) fsr = 8; //Easy error check*
* fsr >>= 2; // Neat trick, see page 22. 00 = 2G, 01 = 4A, 10 = 8G*
* writeRegister(XYZ_DATA_CFG, fsr);*
* //The default data rate is 800Hz and we don't modify it in this example code*
* MMA8452Active(); // Set to active to start reading*
}
// Sets the MMA8452 to standby mode. It must be in standby to change most register settings
void MMA8452Standby()
{
* byte c = readRegister(CTRL_REG1);
writeRegister(CTRL_REG1, c & ~(0x01)); //Clear the active bit to go into standby*
}
// Sets the MMA8452 to active mode. Needs to be in this mode to output data
void MMA8452Active()
{
* byte c = readRegister(CTRL_REG1);
writeRegister(CTRL_REG1, c | 0x01); //Set the active bit to begin detection*
}
// Read bytesToRead sequentially, starting at addressToRead into the dest byte array
void readRegisters(byte addressToRead, int bytesToRead, byte * dest)
{
* Wire.beginTransmission(MMA8452_ADDRESS);*
* Wire.write(addressToRead);
Wire.endTransmission(false); //endTransmission but keep the connection active*
* Wire.requestFrom(MMA8452_ADDRESS, bytesToRead); //Ask for bytes, once done, bus is released by default*
* while(Wire.available() < bytesToRead); //Hang out until we get the # of bytes we expect*
* for(int x = 0 ; x < bytesToRead ; x++)
dest[x] = Wire.read();
}
// Read a single byte from addressToRead and return it as a byte*
byte readRegister(byte addressToRead)
{
* Wire.beginTransmission(MMA8452_ADDRESS);*
* Wire.write(addressToRead);
Wire.endTransmission(false); //endTransmission but keep the connection active*
* Wire.requestFrom(MMA8452_ADDRESS, 1); //Ask for 1 byte, once done, bus is released by default*
* while(!Wire.available()) ; //Wait for the data to come back*
* return Wire.read(); //Return this one byte*
}
// Writes a single byte (dataToWrite) into addressToWrite
void writeRegister(byte addressToWrite, byte dataToWrite)
{
* Wire.beginTransmission(MMA8452_ADDRESS);*
* Wire.write(addressToWrite);
Wire.write(dataToWrite);
Wire.endTransmission(); //Stop transmitting*
}_