07-19-2013 05:23 AM
Hello everyone. I am curretly working on a project to control the yaw, pitch and roll axes of a robotic gimbal wrist using an Arduino UNO and a LabView interface.
In a nutshell, I want to read data from a MMA7660FC 3-axis accelerometer connected to the Arduino UNO via I2C using LIFA, process the data, and then send it back to the Arduino UNO for driving the motors.
I have the MMA7660FC accelerometer connected to the Arduino Uno communicating via I2C. I am able to read the axis values with the Arduino IDE, but I need to read the values from each axis with LabView.
Any suggestions?
07-19-2013 04:50 PM
If you post the working Arduino code for the accelerometer, it will be easier to port it over to LabVIEW.
07-22-2013 07:46 PM
I downloaded a library for the MMA77660FC. The code I've been using just calls on the library.
#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
void setup()
{
accelemeter.init();
Serial.begin(9600);
}
void loop()
{
int8_t x;
int8_t y;
int8_t z;
float ax,ay,az;
accelemeter.getXYZ(&x,&y,&z);
Serial.print("x = ");
Serial.println(x);
Serial.print("y = ");
Serial.println(y);
Serial.print("z = ");
Serial.println(z);
accelemeter.getAcceleration(&ax,&ay,&az);
Serial.println("accleration of X/Y/Z: ");
Serial.print(ax);
Serial.println(" g");
Serial.print(ay);
Serial.println(" g");
Serial.print(az);
Serial.println(" g");
Serial.println("*************");
delay(500);
}
07-22-2013 07:57 PM
This is the accelerometer register overview http://www.freescale.com/files/sensors/doc/app_note/AN3837.pdf
07-22-2013 10:28 PM
Can you please either attach the full working code (i.e. with library) or link to same files?
07-23-2013 02:27 AM
Thanks for your replies Nathan, I really appreciate your help on this.
Here it goes.
Link to the downloadable library:
http://www.seeedstudio.com/wiki/File:DigitalAccelerometer_MMA7660FC.zip
Link to the accelerometer register chart:
http://www.freescale.com/files/sensors/doc/app_note/AN3837.pdf
cpp file MMA7660.cpp :
#include <Wire.h>
#include "MMA7660.h"
/*Function: Write a byte to the register of the MMA7660*/
void MMA7660::write(uint8_t _register, uint8_t _data)
{
Wire.begin();
Wire.beginTransmission(MMA7660_ADDR);
Wire.write(_register);
Wire.write(_data);
Wire.endTransmission();
}
/*Function: Read a byte from the regitster of the MMA7660*/
uint8_t MMA7660::read(uint8_t _register)
{
uint8_t data_read;
Wire.begin();
Wire.beginTransmission(MMA7660_ADDR);
Wire.write(_register);
Wire.endTransmission();
Wire.beginTransmission(MMA7660_ADDR);
Wire.requestFrom(MMA7660_ADDR,1);
while(Wire.available())
{
data_read = Wire.read();
}
Wire.endTransmission();
return data_read;
}
void MMA7660::init()
{
setMode(MMA7660_STAND_BY);
setSampleRate(AUTO_SLEEP_32);
setMode(MMA7660_ACTIVE);
}
void MMA7660::setMode(uint8_t mode)
{
write(MMA7660_MODE,mode);
}
void MMA7660::setSampleRate(uint8_t rate)
{
write(MMA7660_SR,rate);
}
/*Function: Get the contents of the registers in the MMA7660*/
/* so as to calculate the acceleration. */
void MMA7660::getXYZ(int8_t *x,int8_t *y,int8_t *z)
{
unsigned char val[3];
int count = 0;
val[0] = val[1] = val[2] = 64;
while(Wire.available() > 0)
Wire.read();
Wire.requestFrom(MMA7660_ADDR,3);
while(Wire.available())
{
if(count < 3)
{
while ( val[count] > 63 ) // reload the damn thing it is bad
{
val[count] = Wire.read();
}
}
count++;
}
*x = ((char)(val[0]<<2))/4;
*y = ((char)(val[1]<<2))/4;
*z = ((char)(val[2]<<2))/4;
}
void MMA7660::getAcceleration(float *ax,float *ay,float *az)
{
int8_t x,y,z;
getXYZ(&x,&y,&z);
*ax = x/21.00;
*ay = y/21.00;
*az = z/21.00;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
library code MMA7660.h
#ifndef __MMC7660_H__
#define __MMC7660_H__
#define MMA7660_ADDR 0x4c
#define MMA7660_X 0x00
#define MMA7660_Y 0x01
#define MMA7660_Z 0x02
#define MMA7660_TILT 0x03
#define MMA7660_SRST 0x04
#define MMA7660_SPCNT 0x05
#define MMA7660_INTSU 0x06
#define MMA7660_MODE 0x07
#define MMA7660_STAND_BY 0x00
#define MMA7660_ACTIVE 0x01
#define MMA7660_SR 0x08 //sample rate register
#define AUTO_SLEEP_120 0X00 //120 sample per second
#define AUTO_SLEEP_64 0X01
#define AUTO_SLEEP_32 0X02
#define AUTO_SLEEP_16 0X03
#define AUTO_SLEEP_8 0X04
#define AUTO_SLEEP_4 0X05
#define AUTO_SLEEP_2 0X06
#define AUTO_SLEEP_1 0X07
#define MMA7660_PDET 0x09
#define MMA7660_PD 0x0A
class MMA7660
{
private:
void write(uint8_t _register, uint8_t _data);
uint8_t read(uint8_t _register);
public:
void init();
void setMode(uint8_t mode);
void setSampleRate(uint8_t rate);
void getXYZ(int8_t *x,int8_t *y,int8_t *z);
void getAcceleration(float *ax,float *ay,float *az);
};
#endif
07-26-2013 04:45 PM
I was working on doing this for you but my desktop fatally crashed last night so I will have to start over. FYI.
07-26-2013 09:32 PM
Ok, I've redone the small library. It is purely based on the library that you linked to. Let me know if you experience any issues.
07-27-2013 04:26 AM
Brilliant, thanks for your help, Nathan.
I'll get working on it and give you feedback as soon as possible.