megan gimple / Mbed 2 deprecated gimple_A5_Accel

Dependencies:   mbed MMA8452Q SDSD

Committer:
mgimple
Date:
Sat Nov 20 04:45:50 2021 +0000
Revision:
4:aa82d3dbbe0f
Parent:
3:9e69b148d807
Child:
5:b286f58edcfa
no longer count error; lights not working

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 3:9e69b148d807 74 pc.printf("X,Y,Z[Gs]:%5.2f,%5.2f,%5.2f\r\n",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 3:9e69b148d807 81 }
mgimple 3:9e69b148d807 82 }
mgimple 2:8e2c44115ce0 83
mgimple 3:9e69b148d807 84 void infostore()
mgimple 3:9e69b148d807 85 {
mgimple 3:9e69b148d807 86 mkdir("/sd/mydir", 0777);
mgimple 3:9e69b148d807 87 char file_name[100];
mgimple 4:aa82d3dbbe0f 88 sprintf(file_name,"/sd/mydir/log_file_%d.txt",filecount);
mgimple 4:aa82d3dbbe0f 89 FILE *fp = fopen(file_name,"a");
mgimple 3:9e69b148d807 90 if(fp == NULL) {
mgimple 3:9e69b148d807 91 error("Could not open file for write /n");
mgimple 0:d1f1b7e3b561 92 }
mgimple 1:bee807884a79 93
mgimple 3:9e69b148d807 94 fprintf(fp,"$ACC,%f,%f,%f,%f\r\n",t.read(),accX_g,accY_g,accZ_g);
mgimple 3:9e69b148d807 95 fprintf(fp, "$SERV,%f,%f,%f\r\n",t.read(),(pulseWidth/1000000.000)*5*100,angle_deg);
mgimple 3:9e69b148d807 96 fclose(fp);
mgimple 4:aa82d3dbbe0f 97 data = data+1;
mgimple 4:aa82d3dbbe0f 98 }
mgimple 3:9e69b148d807 99
mgimple 4:aa82d3dbbe0f 100 void getAccelerometerValues()
mgimple 4:aa82d3dbbe0f 101 {
mgimple 4:aa82d3dbbe0f 102 accX_g = accel.readX();
mgimple 4:aa82d3dbbe0f 103 accY_g = accel.readY();
mgimple 4:aa82d3dbbe0f 104 accZ_g = accel.readZ();
mgimple 1:bee807884a79 105 }
mgimple 3:9e69b148d807 106
mgimple 3:9e69b148d807 107 void light()
mgimple 3:9e69b148d807 108 {
mgimple 3:9e69b148d807 109 float abs_accX=fabs(accX_g);
mgimple 3:9e69b148d807 110 float abs_accY=fabs(accY_g);
mgimple 3:9e69b148d807 111 float abs_accZ=fabs(accZ_g);
mgimple 3:9e69b148d807 112
mgimple 3:9e69b148d807 113 if (abs_accX>abs_accY && abs_accX>abs_accZ) {
mgimple 3:9e69b148d807 114 Led1=1;
mgimple 3:9e69b148d807 115 Led2=0;
mgimple 3:9e69b148d807 116 Led3=0;
mgimple 3:9e69b148d807 117 }
mgimple 3:9e69b148d807 118 if (abs_accY>abs_accX && abs_accX>abs_accZ) {
mgimple 3:9e69b148d807 119 Led1=0;
mgimple 3:9e69b148d807 120 Led2=1;
mgimple 3:9e69b148d807 121 Led3=0;
mgimple 3:9e69b148d807 122 }
mgimple 3:9e69b148d807 123 if (abs_accZ>abs_accX && abs_accX>abs_accY) {
mgimple 3:9e69b148d807 124 Led1=0;
mgimple 3:9e69b148d807 125 Led2=0;
mgimple 3:9e69b148d807 126 Led3=1;
mgimple 3:9e69b148d807 127 }
mgimple 3:9e69b148d807 128 }
mgimple 3:9e69b148d807 129 void angle()
mgimple 3:9e69b148d807 130 {
mgimple 3:9e69b148d807 131 angle_rad=atan((accZ_g)/(accY_g));
mgimple 3:9e69b148d807 132 angle_deg=angle_rad*180/(3.14159265359);
mgimple 3:9e69b148d807 133 servo_set_angle(angle_deg);
mgimple 3:9e69b148d807 134 }
mgimple 3:9e69b148d807 135
mgimple 3:9e69b148d807 136 void servo_set_angle(float angle)
mgimple 3:9e69b148d807 137 {
mgimple 3:9e69b148d807 138 float pulseCoeff = 10.0;
mgimple 3:9e69b148d807 139 float pulseOffset = 400;
mgimple 4:aa82d3dbbe0f 140
mgimple 4:aa82d3dbbe0f 141 //Check to make sure commanded angle is within min-max bounds:
mgimple 4:aa82d3dbbe0f 142 /*if (angle < 0) {
mgimple 4:aa82d3dbbe0f 143 angle = 0;
mgimple 4:aa82d3dbbe0f 144 } else if (angle > 180) {
mgimple 4:aa82d3dbbe0f 145 angle = 180;
mgimple 4:aa82d3dbbe0f 146 }*/
mgimple 4:aa82d3dbbe0f 147
mgimple 4:aa82d3dbbe0f 148 //pc.printf("Current angle: %f\r\n", angle);
mgimple 3:9e69b148d807 149
mgimple 3:9e69b148d807 150 pulseWidth =pulseCoeff*angle +pulseOffset;
mgimple 3:9e69b148d807 151 servo.pulsewidth(pulseWidth/1000000.000);
mgimple 3:9e69b148d807 152 }
mgimple 3:9e69b148d807 153
mgimple 3:9e69b148d807 154
mgimple 3:9e69b148d807 155