
accelerometer long not working
Dependencies: mbed MMA7660 USBDevice
main.cpp@0:ff58cbebdb75, 2019-10-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |