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@5:b286f58edcfa, 2021-11-20 (annotated)
- 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?
| 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 | 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 |
