accelerometer long not working

Dependencies:   mbed MMA7660 USBDevice

Committer:
knasp
Date:
Tue Oct 08 18:55:32 2019 +0000
Revision:
0:ff58cbebdb75
accelerometer not working long version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
knasp 0:ff58cbebdb75 1 #include "mbed.h"
knasp 0:ff58cbebdb75 2 #include "USBKeyboard.h"
knasp 0:ff58cbebdb75 3 #include "MMA7660.h"
knasp 0:ff58cbebdb75 4
knasp 0:ff58cbebdb75 5 MMA7660 MMA(p28, p27);
knasp 0:ff58cbebdb75 6 USBKeyboard keyboard;
knasp 0:ff58cbebdb75 7 DigitalOut connectionLed(LED1);
knasp 0:ff58cbebdb75 8
knasp 0:ff58cbebdb75 9 MMA7660::MMA7660(PinName sda, PinName scl, bool active) : _i2c(sda, scl)
knasp 0:ff58cbebdb75 10
knasp 0:ff58cbebdb75 11 {
knasp 0:ff58cbebdb75 12 setActive(active);
knasp 0:ff58cbebdb75 13 samplerate = 64;
knasp 0:ff58cbebdb75 14 }
knasp 0:ff58cbebdb75 15 bool MMA7660::testConnection( void )
knasp 0:ff58cbebdb75 16 {
knasp 0:ff58cbebdb75 17 if (_i2c.write(MMA7660_ADDRESS, NULL, 0) == 0 )
knasp 0:ff58cbebdb75 18 return true;
knasp 0:ff58cbebdb75 19 else
knasp 0:ff58cbebdb75 20 return false;
knasp 0:ff58cbebdb75 21 }
knasp 0:ff58cbebdb75 22
knasp 0:ff58cbebdb75 23 void MMA7660::setActive(bool state)
knasp 0:ff58cbebdb75 24 {
knasp 0:ff58cbebdb75 25 active = state;
knasp 0:ff58cbebdb75 26 char modereg = read(MMA7660_MODE_R);
knasp 0:ff58cbebdb75 27 modereg &= ~(1<<0);
knasp 0:ff58cbebdb75 28
knasp 0:ff58cbebdb75 29 //If it somehow was in testmode, disable that
knasp 0:ff58cbebdb75 30 if (modereg && (1<<2)) {
knasp 0:ff58cbebdb75 31 modereg &= ~(1<<2);
knasp 0:ff58cbebdb75 32 write(MMA7660_MODE_R, modereg);
knasp 0:ff58cbebdb75 33 }
knasp 0:ff58cbebdb75 34
knasp 0:ff58cbebdb75 35 modereg += state;
knasp 0:ff58cbebdb75 36 write(MMA7660_MODE_R, modereg);
knasp 0:ff58cbebdb75 37 } //MMA7660::MMA7660(PinName sda, PinName scl, bool active) : _i2c(sda, scl)
knasp 0:ff58cbebdb75 38 int main()
knasp 0:ff58cbebdb75 39
knasp 0:ff58cbebdb75 40 {
knasp 0:ff58cbebdb75 41 float x,y,z;
knasp 0:ff58cbebdb75 42 {
knasp 0:ff58cbebdb75 43 if (MMA.testConnection())
knasp 0:ff58cbebdb75 44 connectionLed = 1;
knasp 0:ff58cbebdb75 45 }
knasp 0:ff58cbebdb75 46 void MMA7660::setsamplerate (int samplerate)
knasp 0:ff58cbebdb75 47 {
knasp 0:ff58cbebdb75 48 bool active_old = active;
knasp 0:ff58cbebdb75 49 setActive(false); //Not allowed to be active to change anything
knasp 0:ff58cbebdb75 50 int rates[] = {120, 64, 32, 16, 8, 4, 2, 1}; //Allowed samplerates (and their number in array is also number required for MMA)
knasp 0:ff58cbebdb75 51 int sampleLoc = 0, sampleError = 10000, temp;
knasp 0:ff58cbebdb75 52 for (int i = 0; i<8; i++) {
knasp 0:ff58cbebdb75 53 temp = abs( rates[i] - samplerate );
knasp 0:ff58cbebdb75 54 if (temp<sampleError) {
knasp 0:ff58cbebdb75 55 sampleLoc = i;
knasp 0:ff58cbebdb75 56 sampleError=temp;
knasp 0:ff58cbebdb75 57 }
knasp 0:ff58cbebdb75 58 }
knasp 0:ff58cbebdb75 59 //Z1; //variables to store acceleration values in X and Y
knasp 0:ff58cbebdb75 60
knasp 0:ff58cbebdb75 61
knasp 0:ff58cbebdb75 62 }
knasp 0:ff58cbebdb75 63 void MMA7660::readData(int *data) {
knasp 0:ff58cbebdb75 64 bool active_old = active;
knasp 0:ff58cbebdb75 65 if (!active) {
knasp 0:ff58cbebdb75 66 setActive(true);
knasp 0:ff58cbebdb75 67 wait(0.012 + 1/samplerate); //Wait until new sample is ready, my experience is that 1/samplerate isnt needed, but datasheet says so
knasp 0:ff58cbebdb75 68 }
knasp 0:ff58cbebdb75 69
knasp 0:ff58cbebdb75 70 char temp[3];
knasp 0:ff58cbebdb75 71 bool alert;
knasp 0:ff58cbebdb75 72
knasp 0:ff58cbebdb75 73 do {
knasp 0:ff58cbebdb75 74 alert = false;
knasp 0:ff58cbebdb75 75 read(MMA7660_XOUT_R, temp, 3);
knasp 0:ff58cbebdb75 76 for (int i = 0; i<3; i++) {
knasp 0:ff58cbebdb75 77 if (temp[i] > 63)
knasp 0:ff58cbebdb75 78 alert = true;
knasp 0:ff58cbebdb75 79 if (temp[i] > 31)
knasp 0:ff58cbebdb75 80 temp[i] += 128+64;
knasp 0:ff58cbebdb75 81 data[i] = (signed char)temp[i];
knasp 0:ff58cbebdb75 82 }
knasp 0:ff58cbebdb75 83 } while (alert);
knasp 0:ff58cbebdb75 84
knasp 0:ff58cbebdb75 85 if (!active_old)
knasp 0:ff58cbebdb75 86 setActive(false);
knasp 0:ff58cbebdb75 87
knasp 0:ff58cbebdb75 88
knasp 0:ff58cbebdb75 89 }
knasp 0:ff58cbebdb75 90 void MMA7660::readData(float *data) {
knasp 0:ff58cbebdb75 91 int intdata[3];
knasp 0:ff58cbebdb75 92 readData(intdata);
knasp 0:ff58cbebdb75 93 for (int i = 0; i<3; i++)
knasp 0:ff58cbebdb75 94 data[i] = intdata[i]/MMA7660_SENSITIVITY;
knasp 0:ff58cbebdb75 95 }
knasp 0:ff58cbebdb75 96
knasp 0:ff58cbebdb75 97 float MMA7660::x( void ) {
knasp 0:ff58cbebdb75 98 return getSingle(0);
knasp 0:ff58cbebdb75 99 }
knasp 0:ff58cbebdb75 100
knasp 0:ff58cbebdb75 101 float MMA7660::y( void ) {
knasp 0:ff58cbebdb75 102 return getSingle(1);
knasp 0:ff58cbebdb75 103 }
knasp 0:ff58cbebdb75 104
knasp 0:ff58cbebdb75 105 float MMA7660::z( void ) {
knasp 0:ff58cbebdb75 106 return getSingle(2);
knasp 0:ff58cbebdb75 107 }
knasp 0:ff58cbebdb75 108
knasp 0:ff58cbebdb75 109 MMA7660::Orientation MMA7660::getSide( void ) {
knasp 0:ff58cbebdb75 110 char tiltreg = read(MMA7660_TILT_R);
knasp 0:ff58cbebdb75 111 //We care about 2 LSBs
knasp 0:ff58cbebdb75 112 tiltreg &= 0x03;
knasp 0:ff58cbebdb75 113 if (tiltreg == 0x01)
knasp 0:ff58cbebdb75 114 return MMA7660::Front;
knasp 0:ff58cbebdb75 115 if (tiltreg == 0x02)
knasp 0:ff58cbebdb75 116 return MMA7660::Back;
knasp 0:ff58cbebdb75 117 return MMA7660::Unknown;
knasp 0:ff58cbebdb75 118 }
knasp 0:ff58cbebdb75 119
knasp 0:ff58cbebdb75 120 MMA7660::Orientation MMA7660::getOrientation( void ) {
knasp 0:ff58cbebdb75 121 char tiltreg = read(MMA7660_TILT_R);
knasp 0:ff58cbebdb75 122
knasp 0:ff58cbebdb75 123 //We care about bit 2, 3 and 4 (counting from zero)
knasp 0:ff58cbebdb75 124 tiltreg &= 0x07<<2;
knasp 0:ff58cbebdb75 125 tiltreg >>= 2;
knasp 0:ff58cbebdb75 126 if (tiltreg == 0x01)
knasp 0:ff58cbebdb75 127 return MMA7660::Left;
knasp 0:ff58cbebdb75 128 if (tiltreg == 0x02)
knasp 0:ff58cbebdb75 129 return MMA7660::Right;
knasp 0:ff58cbebdb75 130 if (tiltreg == 0x05)
knasp 0:ff58cbebdb75 131 return MMA7660::Down;
knasp 0:ff58cbebdb75 132 if (tiltreg == 0x06)
knasp 0:ff58cbebdb75 133 return MMA7660::Up;
knasp 0:ff58cbebdb75 134 return MMA7660::Unknown;
knasp 0:ff58cbebdb75 135 }