megan gimple / Mbed 2 deprecated gimple_A5_Accel

Dependencies:   mbed MMA8452Q SDSD

Committer:
mgimple
Date:
Sat Nov 20 04:54:37 2021 +0000
Revision:
5:b286f58edcfa
Parent:
4:aa82d3dbbe0f
Logging; Servo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mgimple 2:8e2c44115ce0 1 //Assignment 5 Accelerometer and Servo with Data Logging
mgimple 2:8e2c44115ce0 2 //Starter code from Stephen Licht
mgimple 0:d1f1b7e3b561 3 //Created 11/9/2021
mgimple 0:d1f1b7e3b561 4
mgimple 0:d1f1b7e3b561 5 #include "mbed.h"
mgimple 0:d1f1b7e3b561 6 #include "MMA8452Q.h"
mgimple 2:8e2c44115ce0 7 #include "SDFileSystem.h"
mgimple 3:9e69b148d807 8 #include <cmath> //for fabs
mgimple 3:9e69b148d807 9 #include <math.h> //for atan
mgimple 0:d1f1b7e3b561 10
mgimple 0:d1f1b7e3b561 11 //Define constants for timing of read and write:
mgimple 3:9e69b148d807 12 #define READTIME 0.2 //5 Hz
mgimple 3:9e69b148d807 13 #define WRITETIME 1.0 //1sec
mgimple 3:9e69b148d807 14 #define STORETIME 0.2 //5 Hz
mgimple 3:9e69b148d807 15 #define SERVOTIME 0.2 //5 Hz
mgimple 3:9e69b148d807 16
mgimple 3:9e69b148d807 17 MMA8452Q accel(p28,p27,0x1D);
mgimple 3:9e69b148d807 18 Serial pc(USBTX,USBRX);
mgimple 3:9e69b148d807 19 SDFileSystem sd(p5, p6, p7, p8, "sd");
mgimple 3:9e69b148d807 20 PwmOut servo(p21);
mgimple 0:d1f1b7e3b561 21
mgimple 1:bee807884a79 22 DigitalOut Led1(LED1);
mgimple 1:bee807884a79 23 DigitalOut Led2(LED2);
mgimple 1:bee807884a79 24 DigitalOut Led3(LED3);
mgimple 0:d1f1b7e3b561 25
mgimple 0:d1f1b7e3b561 26 Ticker accel_reading;
mgimple 3:9e69b148d807 27 Ticker file;
mgimple 3:9e69b148d807 28 Ticker servo_move;
mgimple 3:9e69b148d807 29
mgimple 0:d1f1b7e3b561 30 Timer serial_reporting;
mgimple 3:9e69b148d807 31 Timer t;
mgimple 3:9e69b148d807 32
mgimple 4:aa82d3dbbe0f 33 int filecount = 0; //define count as starting at 0
mgimple 3:9e69b148d807 34 int data=0; //dataCount
mgimple 3:9e69b148d807 35
mgimple 3:9e69b148d807 36 float pulseWidth=0; //pulse width of servo
mgimple 3:9e69b148d807 37
mgimple 3:9e69b148d807 38 double angle_rad=0; //angle of servo in rad
mgimple 3:9e69b148d807 39 float angle_deg=0; //angle of servo in deg
mgimple 0:d1f1b7e3b561 40
mgimple 0:d1f1b7e3b561 41 float accX_g,accY_g,accZ_g;
mgimple 0:d1f1b7e3b561 42
mgimple 3:9e69b148d807 43 void light();
mgimple 3:9e69b148d807 44 void getAccelerometerValues();
mgimple 3:9e69b148d807 45 void infostore();
mgimple 3:9e69b148d807 46 void servo_set_angle(float angle);
mgimple 3:9e69b148d807 47 void angle();
mgimple 3:9e69b148d807 48
mgimple 3:9e69b148d807 49
mgimple 0:d1f1b7e3b561 50 int main()
mgimple 0:d1f1b7e3b561 51 {
mgimple 4:aa82d3dbbe0f 52 t.start(); //start overall timer
mgimple 3:9e69b148d807 53
mgimple 0:d1f1b7e3b561 54 //Initialize accelerometer:
mgimple 0:d1f1b7e3b561 55 accel.init();
mgimple 0:d1f1b7e3b561 56
mgimple 0:d1f1b7e3b561 57 //Start ticker to read accelerometer at 5Hz
mgimple 0:d1f1b7e3b561 58 accel_reading.attach(&getAccelerometerValues,READTIME);
mgimple 0:d1f1b7e3b561 59
mgimple 3:9e69b148d807 60 //Start ticker to store data at 5Hz
mgimple 3:9e69b148d807 61 file.attach(&infostore,STORETIME);
mgimple 3:9e69b148d807 62
mgimple 3:9e69b148d807 63 //Start ticker to adjust servo at 5Hz
mgimple 3:9e69b148d807 64 servo_move.attach(&angle,SERVOTIME);
mgimple 3:9e69b148d807 65
mgimple 0:d1f1b7e3b561 66 //Begin serial write timer for the first time:
mgimple 0:d1f1b7e3b561 67 serial_reporting.start();
mgimple 0:d1f1b7e3b561 68
mgimple 0:d1f1b7e3b561 69 while(1) {
mgimple 0:d1f1b7e3b561 70 //Use a timer to manage writing to the serial port (approximate timing):
mgimple 0:d1f1b7e3b561 71 if(serial_reporting.read()>WRITETIME) {
mgimple 0:d1f1b7e3b561 72 serial_reporting.reset();
mgimple 0:d1f1b7e3b561 73 serial_reporting.start();
mgimple 5:b286f58edcfa 74 pc.printf("$ACC, Time Since Start%f[MS],X Acceleration%f[G],Y Acceleration%f[G],Z Acceleration%f[G]\r\n", t.read(), accX_g, accY_g, accZ_g);
mgimple 3:9e69b148d807 75 }
mgimple 4:aa82d3dbbe0f 76 //new file count every ten seconds or 50 data points
mgimple 4:aa82d3dbbe0f 77 if(data>=50){
mgimple 4:aa82d3dbbe0f 78 filecount=filecount+1;
mgimple 3:9e69b148d807 79 data=0;
mgimple 0:d1f1b7e3b561 80 }
mgimple 5:b286f58edcfa 81
mgimple 5:b286f58edcfa 82 light();
mgimple 5:b286f58edcfa 83
mgimple 3:9e69b148d807 84 }
mgimple 3:9e69b148d807 85 }
mgimple 2:8e2c44115ce0 86
mgimple 3:9e69b148d807 87 void infostore()
mgimple 3:9e69b148d807 88 {
mgimple 3:9e69b148d807 89 mkdir("/sd/mydir", 0777);
mgimple 3:9e69b148d807 90 char file_name[100];
mgimple 4:aa82d3dbbe0f 91 sprintf(file_name,"/sd/mydir/log_file_%d.txt",filecount);
mgimple 4:aa82d3dbbe0f 92 FILE *fp = fopen(file_name,"a");
mgimple 3:9e69b148d807 93 if(fp == NULL) {
mgimple 3:9e69b148d807 94 error("Could not open file for write /n");
mgimple 0:d1f1b7e3b561 95 }
mgimple 1:bee807884a79 96
mgimple 3:9e69b148d807 97 fprintf(fp,"$ACC,%f,%f,%f,%f\r\n",t.read(),accX_g,accY_g,accZ_g);
mgimple 3:9e69b148d807 98 fprintf(fp, "$SERV,%f,%f,%f\r\n",t.read(),(pulseWidth/1000000.000)*5*100,angle_deg);
mgimple 3:9e69b148d807 99 fclose(fp);
mgimple 4:aa82d3dbbe0f 100 data = data+1;
mgimple 4:aa82d3dbbe0f 101 }
mgimple 3:9e69b148d807 102
mgimple 4:aa82d3dbbe0f 103 void getAccelerometerValues()
mgimple 4:aa82d3dbbe0f 104 {
mgimple 4:aa82d3dbbe0f 105 accX_g = accel.readX();
mgimple 4:aa82d3dbbe0f 106 accY_g = accel.readY();
mgimple 4:aa82d3dbbe0f 107 accZ_g = accel.readZ();
mgimple 1:bee807884a79 108 }
mgimple 3:9e69b148d807 109
mgimple 3:9e69b148d807 110 void light()
mgimple 3:9e69b148d807 111 {
mgimple 3:9e69b148d807 112 float abs_accX=fabs(accX_g);
mgimple 3:9e69b148d807 113 float abs_accY=fabs(accY_g);
mgimple 3:9e69b148d807 114 float abs_accZ=fabs(accZ_g);
mgimple 3:9e69b148d807 115
mgimple 3:9e69b148d807 116 if (abs_accX>abs_accY && abs_accX>abs_accZ) {
mgimple 3:9e69b148d807 117 Led1=1;
mgimple 3:9e69b148d807 118 Led2=0;
mgimple 3:9e69b148d807 119 Led3=0;
mgimple 3:9e69b148d807 120 }
mgimple 3:9e69b148d807 121 if (abs_accY>abs_accX && abs_accX>abs_accZ) {
mgimple 3:9e69b148d807 122 Led1=0;
mgimple 3:9e69b148d807 123 Led2=1;
mgimple 3:9e69b148d807 124 Led3=0;
mgimple 3:9e69b148d807 125 }
mgimple 3:9e69b148d807 126 if (abs_accZ>abs_accX && abs_accX>abs_accY) {
mgimple 3:9e69b148d807 127 Led1=0;
mgimple 3:9e69b148d807 128 Led2=0;
mgimple 3:9e69b148d807 129 Led3=1;
mgimple 3:9e69b148d807 130 }
mgimple 3:9e69b148d807 131 }
mgimple 3:9e69b148d807 132 void angle()
mgimple 3:9e69b148d807 133 {
mgimple 3:9e69b148d807 134 angle_rad=atan((accZ_g)/(accY_g));
mgimple 3:9e69b148d807 135 angle_deg=angle_rad*180/(3.14159265359);
mgimple 3:9e69b148d807 136 servo_set_angle(angle_deg);
mgimple 3:9e69b148d807 137 }
mgimple 3:9e69b148d807 138
mgimple 3:9e69b148d807 139 void servo_set_angle(float angle)
mgimple 3:9e69b148d807 140 {
mgimple 3:9e69b148d807 141 float pulseCoeff = 10.0;
mgimple 3:9e69b148d807 142 float pulseOffset = 400;
mgimple 4:aa82d3dbbe0f 143
mgimple 4:aa82d3dbbe0f 144 //Check to make sure commanded angle is within min-max bounds:
mgimple 4:aa82d3dbbe0f 145 /*if (angle < 0) {
mgimple 4:aa82d3dbbe0f 146 angle = 0;
mgimple 4:aa82d3dbbe0f 147 } else if (angle > 180) {
mgimple 4:aa82d3dbbe0f 148 angle = 180;
mgimple 4:aa82d3dbbe0f 149 }*/
mgimple 4:aa82d3dbbe0f 150
mgimple 4:aa82d3dbbe0f 151 //pc.printf("Current angle: %f\r\n", angle);
mgimple 3:9e69b148d807 152
mgimple 3:9e69b148d807 153 pulseWidth =pulseCoeff*angle +pulseOffset;
mgimple 3:9e69b148d807 154 servo.pulsewidth(pulseWidth/1000000.000);
mgimple 3:9e69b148d807 155 }
mgimple 3:9e69b148d807 156
mgimple 3:9e69b148d807 157
mgimple 3:9e69b148d807 158