MMA8452 3 axis accelerometer.
Dependencies: MMA8452 N5110 mbed
Diff: main.cpp
- Revision:
- 0:bfe6cbe4dd56
- Child:
- 2:a659621a83b0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun May 10 11:12:24 2015 +0000 @@ -0,0 +1,209 @@ +#include "mbed.h" +#include "N5110.h" +#include "MMA8452.h" + + + +N5110 lcd(p7,p8,p9,p10,p11,p13,p26); +MMA8452 mma8452(p28,p27); // SDA, SCL +Serial serial(USBTX,USBRX);//serial port +InterruptIn button(p17);//button + +Ticker buzzer_timer;//buzzer timer +PwmOut buzzer(p21);//buzzer + +AnalogIn pot(p20); /* Potentiometer middle pin connected to P0_11, other two ends connected to GND and 3.3V */ + + + + +int fsm[4] = {1,2,4,8}; // simple FSM counter has 4 states +int state = 0; // initial state 0 +// defines for direction +#define UP 0 +#define DOWN 1 +#define MID 2 + +int direction = UP; // initially count up + +float frequency=659; + + +int k=0; + +void buttonPressed() // toggle direction in ISR +{ + k++; + + direction=k%3; + + +} + +int main() + { + lcd.init(); + mma8452.init(); // 100 Hz update rate, ±4g scale + + float ain; + Acceleration acceleration; // Accleration structure declared in MMA8452 class + + + button.rise(&buttonPressed); // Use internal pullup for pushbutton + + + wait(.001);// Delay for initial pullup to take effect + + + while(1) + { + + acceleration = mma8452.readValues();// read current values and print over serial port + + + + //calculate the angle + float angleX = atan(acceleration.x/sqrt(pow(acceleration.y,2)+pow(acceleration.z,2)))*64; + float angleY = atan(acceleration.y/sqrt(pow(acceleration.x,2)+pow(acceleration.z,2)))*64; + float angleZ = atan(acceleration.z/sqrt(pow(acceleration.y,2)+pow(acceleration.x,2)))*64; + + + + //store the acceleration data + char buffer1[14]; + int length = sprintf(buffer1,"x = %.2f g",acceleration.x); + char buffer2[14]; + length = sprintf(buffer2,"y = %.2f g",acceleration.y); + char buffer3[14]; + length = sprintf(buffer3,"z = %.2f g",acceleration.z); + + + + + //store angle data + char buffer4[14]; + length = sprintf(buffer4,"X=%.3gDegree",angleX); + char buffer5[14]; + length = sprintf(buffer5,"Y=%.3gDegree",angleY); + char buffer6[14]; + length = sprintf(buffer6,"Z=%.3gDegree",angleZ); + char buffer7[14]; + length = sprintf(buffer7,"ACCELEROMETER"); + char buffer8[14]; + length = sprintf(buffer8,"PROTRACTOR"); + char buffer9[14]; + length = sprintf(buffer9,"Y"); + char buffer10[14]; + length = sprintf(buffer10,"X"); + + + + + wait(0.1); + lcd.clear(); + + + + if (angleY>=90||angleY<=-90||angleX>=90||angleX<=-90){ + + buzzer.period(1/frequency); // set PWM period + buzzer=0.5; // set duty cycle + + + } + + + else + { + buzzer.period(1/frequency); // set PWM period + buzzer=0; // set duty cycle + } + + + + + switch(direction)//button case when pressed + { + case UP://first pressed + direction = 0; + lcd.printString(buffer7,4,0); + lcd.printString(buffer1,3,2); + lcd.printString(buffer2,3,3); + lcd.printString(buffer3,3,4); + break; + + case DOWN://second pressed + direction = 1; + lcd.printString(buffer8,13,0); + lcd.printString(buffer4,3,2); + lcd.printString(buffer5,3,3); + lcd.printString(buffer6,3,4); + break; + case MID://third presssed + direction = 2; + + // x0,y0,x1,y1,type 0-white,1-black,2-dotted + lcd.drawLine(0,23,83,23,1); + + lcd.drawLine(41,0,41,48,1); + + lcd.drawLine(64,0,17,47,1); + + lcd.drawLine(18,0,65,47,1); + + lcd.drawCircle(41,23,13,0); // x,y,radius,black fill + lcd.drawCircle(41,23,25,0); + + + if (angleX<0||angleY>0){ //move right and forward + + + lcd.setPixel(41-angleX/3.6,23+angleY/3.6); + lcd.setPixel(41-angleX/3.6,22+angleY/3.6); + lcd.setPixel(41-angleX/3.6,24+angleY/3.6); + lcd.setPixel(42-angleX/3.6,23+angleY/3.6); + lcd.setPixel(40-angleX/3.6,23+angleY/3.6); + + } + lcd.refresh(); + + + + + if (angleX>0||angleY>0) //move left and backward + { + lcd.setPixel(41-angleX/3.6,23+angleY/3.6); + lcd.setPixel(41-angleX/3.6,22+angleY/3.6); + lcd.setPixel(41-angleX/3.6,24+angleY/3.6); + lcd.setPixel(40-angleX/3.6,23+angleY/3.6); + lcd.setPixel(42-angleX/3.6,23+angleY/3.6); + + lcd.refresh(); + + } + + + lcd.printString(buffer9,35,0); + lcd.printString(buffer10,75,2); + + break; + + + default: + + break; + + } + + + + ain = pot.read(); /* Read analog value (output will be any value between 0 and 1 */ + + + lcd.setBrightness(ain); //tune the screen brightness + lcd.refresh(); + + + } +} +