Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MMA8452Q SDSD
main.cpp@4:aa82d3dbbe0f, 2021-11-20 (annotated)
- 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?
| User | Revision | Line number | New 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 |
