megan gimple / Mbed 2 deprecated OCE360_Final_Project

Dependencies:   mbed MMA8452Q MS5837 SDFileSystem SCI_SENSOR

Committer:
mgimple
Date:
Tue Dec 07 14:22:05 2021 +0000
Revision:
19:c78d3e8353c4
Parent:
18:b5f58a274570
Child:
20:6fb55c833f9f
Updated data logging; Part two timer established

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elizabethtaylor 11:fc58334fd36b 1 //OCE 360 Final Project
elizabethtaylor 11:fc58334fd36b 2 //Annaliese Nardi, Eliza Taylor, Mackenzie Fraser, Megan Gimple
elizabethtaylor 11:fc58334fd36b 3 //Updated Code by Stephen Licht
elizabethtaylor 11:fc58334fd36b 4 //Description:
elizabethtaylor 11:fc58334fd36b 5
slicht_instructor 0:6e97f9a6aca0 6 #include "mbed.h"
slicht_instructor 0:6e97f9a6aca0 7 #include "MMA8452Q.h" //accelerometer library
slicht_instructor 0:6e97f9a6aca0 8 #include "MS5837.h" //pressure sensor library***
mgimple 1:e1a2b47c3098 9 #include "SCI_SENSOR.h" //science sensor library, photocell, temperature cell
slicht_instructor 0:6e97f9a6aca0 10 #include "SDFileSystem.h" // SD card library
slicht_instructor 0:6e97f9a6aca0 11
slicht_instructor 0:6e97f9a6aca0 12 DigitalOut led1(LED1);
slicht_instructor 0:6e97f9a6aca0 13 DigitalOut led2(LED2);
slicht_instructor 0:6e97f9a6aca0 14
mgimple 1:e1a2b47c3098 15 Serial pc(USBTX, USBRX); //initial serial
mgimple 1:e1a2b47c3098 16 Serial BLE(p13,p14); //Bluetooth
mgimple 1:e1a2b47c3098 17 MMA8452Q accel(p28,p27,0x1D); //initial accelerometer
mgimple 1:e1a2b47c3098 18 LM19 temp(p19); //temperature sensor
mgimple 1:e1a2b47c3098 19 PhotoCell light(p20); //photocell
slicht_instructor 0:6e97f9a6aca0 20 MS5837 p_sensor(p9, p10, ms5837_addr_no_CS); //pressure sensor
slicht_instructor 0:6e97f9a6aca0 21 PwmOut thruster(p21); //set PWM pin //max 1.3ms min 1.1ms
slicht_instructor 0:6e97f9a6aca0 22 PwmOut thruster2(p22); //set PWM pin
slicht_instructor 0:6e97f9a6aca0 23 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
slicht_instructor 0:6e97f9a6aca0 24
slicht_instructor 0:6e97f9a6aca0 25 //global ticker
slicht_instructor 0:6e97f9a6aca0 26 Ticker log_ticker;
slicht_instructor 0:6e97f9a6aca0 27 Ticker accel_ticker;
mgimple 1:e1a2b47c3098 28
slicht_instructor 0:6e97f9a6aca0 29 // global timer
slicht_instructor 0:6e97f9a6aca0 30 Timer t;
mgimple 19:c78d3e8353c4 31 Timer t2; //part two timer
slicht_instructor 0:6e97f9a6aca0 32
slicht_instructor 0:6e97f9a6aca0 33 ///File
slicht_instructor 0:6e97f9a6aca0 34 FILE *fp;
slicht_instructor 0:6e97f9a6aca0 35 char fname[100];
slicht_instructor 0:6e97f9a6aca0 36 float PI = 3.14159265358979323846f;
slicht_instructor 0:6e97f9a6aca0 37
slicht_instructor 0:6e97f9a6aca0 38 //float operation parameters
mgimple 1:e1a2b47c3098 39 float target_depth=0; //global target depth default 0
mgimple 1:e1a2b47c3098 40 int yo_num=0; //global yo_num default 0
mgimple 1:e1a2b47c3098 41 float thrust_on_time=0; //global thrust_on time default 0
mgimple 1:e1a2b47c3098 42 float accelData[3]; //global accel data
mgimple 17:e72c4ac9a39e 43 float vessel_lenth=1;
slicht_instructor 0:6e97f9a6aca0 44
slicht_instructor 0:6e97f9a6aca0 45 //functions
slicht_instructor 0:6e97f9a6aca0 46 void welcome();
slicht_instructor 0:6e97f9a6aca0 47 void log_data();
mgimple 4:d87b1e40d419 48
slicht_instructor 0:6e97f9a6aca0 49 //IMU related
slicht_instructor 0:6e97f9a6aca0 50 void accel_update(); //update accelerometer related variables. we use imu_ticker to call this function
mgimple 5:17f2b3e61112 51
mgimple 9:e4e1d5db0c04 52 //Control Parameters
mgimple 9:e4e1d5db0c04 53 float tim =5; //define thruster on time
mgimple 14:ed172dec4022 54 float percent = 1.5; //user defined percent of thrust power
mgimple 9:e4e1d5db0c04 55
slicht_instructor 0:6e97f9a6aca0 56 //Control related functions
slicht_instructor 0:6e97f9a6aca0 57 void thrust_on(float pw, float on_time); //input is pulse width
mgimple 10:b2fe6d1dee81 58 //void thrust_off(float pw, float on_time); // turn off pulse width
mgimple 9:e4e1d5db0c04 59
mgimple 5:17f2b3e61112 60
elizabethtaylor 11:fc58334fd36b 61 //global variables
elizabethtaylor 11:fc58334fd36b 62
elizabethtaylor 11:fc58334fd36b 63
slicht_instructor 0:6e97f9a6aca0 64 //-------------Main functions-----------------------------------------------------------------------------------------
slicht_instructor 0:6e97f9a6aca0 65 int main()
slicht_instructor 0:6e97f9a6aca0 66 {
slicht_instructor 0:6e97f9a6aca0 67 //-----Initialization realted code-------//
mgimple 18:b5f58a274570 68 //inital set the thruster esc to 1ms duty cycle
slicht_instructor 0:6e97f9a6aca0 69 thruster.period(0.002); // 2 ms period
mgimple 18:b5f58a274570 70 thruster.pulsewidth(1.0/1000.000);
mgimple 18:b5f58a274570 71
slicht_instructor 0:6e97f9a6aca0 72 //Initialize accelerometer:
slicht_instructor 0:6e97f9a6aca0 73 accel.init();
slicht_instructor 0:6e97f9a6aca0 74 led1=1;
mgimple 18:b5f58a274570 75
slicht_instructor 0:6e97f9a6aca0 76 //initialize pressure sensor
slicht_instructor 0:6e97f9a6aca0 77 pc.printf("setting the pressure sensor\r\n");
slicht_instructor 0:6e97f9a6aca0 78 p_sensor.MS5837Reset();
slicht_instructor 0:6e97f9a6aca0 79 p_sensor.MS5837Init();
mgimple 6:5f55105701ac 80 pc.printf("setting the tickers\r\n");
slicht_instructor 0:6e97f9a6aca0 81 t.start();
slicht_instructor 0:6e97f9a6aca0 82 led2=1;
slicht_instructor 0:6e97f9a6aca0 83 welcome();
mgimple 18:b5f58a274570 84
slicht_instructor 0:6e97f9a6aca0 85 //-----setup ticker-------//
slicht_instructor 0:6e97f9a6aca0 86 //setup ticker to separate log and IMU data update.
slicht_instructor 0:6e97f9a6aca0 87 //so we could have all our control code in the while loop
slicht_instructor 0:6e97f9a6aca0 88 // //log at 2 Hz
slicht_instructor 0:6e97f9a6aca0 89 accel_ticker.attach(&accel_update,0.1); //10Hz
slicht_instructor 0:6e97f9a6aca0 90 log_ticker.attach(&log_data,0.5);
slicht_instructor 0:6e97f9a6aca0 91 wait(1);
mgimple 18:b5f58a274570 92
mgimple 17:e72c4ac9a39e 93 //Part One
mgimple 19:c78d3e8353c4 94 int count=0;
slicht_instructor 0:6e97f9a6aca0 95 while(1)
slicht_instructor 0:6e97f9a6aca0 96 {
mgimple 14:ed172dec4022 97 count=count+1;
mgimple 10:b2fe6d1dee81 98 float pw= percent;
mgimple 10:b2fe6d1dee81 99 float on_time =tim;
mgimple 10:b2fe6d1dee81 100 thrust_on(pw, on_time); //turn thruster on for 5 seconds
mgimple 14:ed172dec4022 101 wait(10);
mgimple 14:ed172dec4022 102 if count==3{
mgimple 14:ed172dec4022 103 return 0;
mgimple 14:ed172dec4022 104 }
mgimple 19:c78d3e8353c4 105 }
mgimple 18:b5f58a274570 106
mgimple 17:e72c4ac9a39e 107 //Part Two
mgimple 19:c78d3e8353c4 108 t2.start();
mgimple 18:b5f58a274570 109 while(1) {
mgimple 19:c78d3e8353c4 110
mgimple 17:e72c4ac9a39e 111 float current_depth=p_sensor.depth();
mgimple 17:e72c4ac9a39e 112 float pw=percent;
mgimple 17:e72c4ac9a39e 113 float on_time=3;
mgimple 18:b5f58a274570 114
mgimple 18:b5f58a274570 115 if (current_depth-vessel_length<2) {
mgimple 17:e72c4ac9a39e 116 thrust_on(pw,on_time);
mgimple 18:b5f58a274570 117 }
mgimple 19:c78d3e8353c4 118 if t2.read()>60{ //60 because counting in seconds?
mgimple 17:e72c4ac9a39e 119 return 0;
mgimple 17:e72c4ac9a39e 120 }
mgimple 18:b5f58a274570 121 }
mgimple 18:b5f58a274570 122
mgimple 19:c78d3e8353c4 123 /*Part Three
mgimple 18:b5f58a274570 124 while(1) {
mgimple 18:b5f58a274570 125 error_deep = 2.5; //deep end of error band 2.5m ?
mgimple 18:b5f58a274570 126 error_shallow = 1.5; //shallow end of error band 1.5m?
slicht_instructor 0:6e97f9a6aca0 127
mgimple 18:b5f58a274570 128 if (current_depth <= error_shallow) { //if float is less than 1.5meters deep
mgimple 18:b5f58a274570 129 thrust_on(pw,on_time); // turn on thruster at set pw and ontime
mgimple 18:b5f58a274570 130 else if (current_depth >= error_deep) //if float is more than 2.5 meters deep
mgimple 18:b5f58a274570 131 wait(1); // do nothing for 1 sec.. float will go up for 1 sec
mgimple 18:b5f58a274570 132 else
mgimple 18:b5f58a274570 133 pw = ; //very low thruster percentage
mgimple 18:b5f58a274570 134 thrust_on(pw,on_time); //run thruster at very low percentage to maintain depth
mgimple 18:b5f58a274570 135 }
mgimple 19:c78d3e8353c4 136 */
slicht_instructor 0:6e97f9a6aca0 137
slicht_instructor 0:6e97f9a6aca0 138 //-------------Customized functions---------------------------------------------//----------------------------------------
slicht_instructor 0:6e97f9a6aca0 139 ///-----------Welcome menu---------------------///
mgimple 18:b5f58a274570 140 void welcome() {
mgimple 18:b5f58a274570 141 char buffer[100]= {0};
mgimple 18:b5f58a274570 142 int flag=1;
mgimple 18:b5f58a274570 143 //Flush the port
mgimple 18:b5f58a274570 144 while(BLE.readable()) {
mgimple 18:b5f58a274570 145 BLE.getc();
mgimple 18:b5f58a274570 146 }
mgimple 18:b5f58a274570 147 while(flag) {
mgimple 18:b5f58a274570 148 BLE.printf("### I am alive\r\n");
mgimple 18:b5f58a274570 149 BLE.printf("### Please enter the log file name you want\r\n");
mgimple 18:b5f58a274570 150 if(BLE.readable()) {
mgimple 18:b5f58a274570 151 BLE.scanf("%s",buffer);
mgimple 18:b5f58a274570 152 sprintf(fname,"/sd/mydir/%s.txt",buffer); //make file name
slicht_instructor 0:6e97f9a6aca0 153
mgimple 18:b5f58a274570 154 flag = 0; //set the flag to 0 to break the while
mgimple 18:b5f58a274570 155 }
mgimple 18:b5f58a274570 156 wait(1);
mgimple 18:b5f58a274570 157 }
mgimple 18:b5f58a274570 158 //print name
mgimple 18:b5f58a274570 159 BLE.printf("### name received\r\n");
mgimple 18:b5f58a274570 160 BLE.printf("### file name and directory is: \r\n %s\r\n",fname); //file name and location
mgimple 18:b5f58a274570 161 //open file test
mgimple 18:b5f58a274570 162 mkdir("/sd/mydir",0777); //keep 0777, this is magic #
mgimple 18:b5f58a274570 163 fp = fopen(fname, "a");
mgimple 18:b5f58a274570 164 if(fp == NULL) {
mgimple 18:b5f58a274570 165 BLE.printf("Could not open file for write\n");
mgimple 18:b5f58a274570 166 } else {
mgimple 18:b5f58a274570 167 BLE.printf("##file open good \n"); //open file and tell if open
mgimple 18:b5f58a274570 168 fprintf(fp, "Hello\r\n");
mgimple 18:b5f58a274570 169 fclose(fp);
mgimple 18:b5f58a274570 170 }
mgimple 18:b5f58a274570 171
mgimple 18:b5f58a274570 172 BLE.printf("### The main program will start in 5 seconds\r\n");
mgimple 18:b5f58a274570 173 wait(5);
slicht_instructor 0:6e97f9a6aca0 174 }
slicht_instructor 0:6e97f9a6aca0 175
slicht_instructor 0:6e97f9a6aca0 176 ///-----------log functions---------------------///
mgimple 18:b5f58a274570 177 void log_data() {
mgimple 19:c78d3e8353c4 178 p_sensor.Barometer_MS5837();
mgimple 18:b5f58a274570 179 float current_time=t.read();
mgimple 18:b5f58a274570 180 float current_pressure=p_sensor.MS5837_Pressure();
mgimple 18:b5f58a274570 181 float current_depth=p_sensor.depth();
mgimple 18:b5f58a274570 182 float current_pw=percent;
mgimple 18:b5f58a274570 183 float current_Xaccel=accelData[0];
mgimple 18:b5f58a274570 184 float current_Yaccel=accelData[1];
mgimple 18:b5f58a274570 185 float current_Zaccel=accelData[2];
mgimple 18:b5f58a274570 186 float current_temp=temp.temp();
mgimple 18:b5f58a274570 187 float current_light=light.light();
slicht_instructor 0:6e97f9a6aca0 188
mgimple 18:b5f58a274570 189 fprintf(fp, "$DATA, %f, %f, %f, %f, %f, %f, %f, %f, %f\r\n", current_time,current_pressure,current_depth,current_Xaccel,current_Yaccel,current_Zaccel,current_temp,current_light,current_pw);
mgimple 18:b5f58a274570 190
mgimple 18:b5f58a274570 191 // log system time t.read()
mgimple 18:b5f58a274570 192 // log imu data, log science data
mgimple 18:b5f58a274570 193 // log pulse width
mgimple 18:b5f58a274570 194 // log pressure sensor data.
mgimple 18:b5f58a274570 195 // science sensor: temp.temp(), light.light()
mgimple 18:b5f58a274570 196 // IMU sensor
mgimple 18:b5f58a274570 197
mgimple 18:b5f58a274570 198 }
slicht_instructor 0:6e97f9a6aca0 199
slicht_instructor 0:6e97f9a6aca0 200 ///-----------acceleromter related functions---------------------///
mgimple 18:b5f58a274570 201 void accel_update() {
mgimple 18:b5f58a274570 202 accelData[0] = accel.readX();
mgimple 18:b5f58a274570 203 accelData[1] = accel.readY();
mgimple 18:b5f58a274570 204 accelData[2] = accel.readZ();
mgimple 18:b5f58a274570 205 }
slicht_instructor 0:6e97f9a6aca0 206
slicht_instructor 0:6e97f9a6aca0 207 ///-----------Control related functions---------------------///
slicht_instructor 0:6e97f9a6aca0 208 ////Thruster on control, pw->pulse width in milli-second//
slicht_instructor 0:6e97f9a6aca0 209 //// pw range between 1 to 1.5//
slicht_instructor 0:6e97f9a6aca0 210 //// on_time-> thruster on time.
mgimple 18:b5f58a274570 211 void thrust_on(float pw, float on_time) { //input is pulse width
slicht_instructor 0:6e97f9a6aca0 212
mgimple 18:b5f58a274570 213 float pw_max=2.0;
mgimple 18:b5f58a274570 214 if(pw>pw_max) {
mgimple 18:b5f58a274570 215 pw=pw_max; //hard limitation
mgimple 18:b5f58a274570 216 }
mgimple 18:b5f58a274570 217 Timer tt;
mgimple 18:b5f58a274570 218 tt.reset();
mgimple 18:b5f58a274570 219 tt.start();
mgimple 18:b5f58a274570 220 // lets set the pulse width
mgimple 18:b5f58a274570 221 //thruster.period(20.0/1000.00); // 20 ms period
mgimple 18:b5f58a274570 222 thruster.pulsewidth(pw/1000.00);
mgimple 18:b5f58a274570 223 thruster2.pulsewidth(pw/1000.00);
mgimple 18:b5f58a274570 224 //PWM will be kept until time out
mgimple 18:b5f58a274570 225 while(tt.read()<=on_time) {
mgimple 18:b5f58a274570 226
mgimple 18:b5f58a274570 227 pc.printf("thruster on?...mack is cool\r\n"); //print check
mgimple 18:b5f58a274570 228 }
mgimple 18:b5f58a274570 229 //stop the timer
mgimple 18:b5f58a274570 230 tt.stop();
mgimple 18:b5f58a274570 231 //turn off the thruster
mgimple 18:b5f58a274570 232 thruster.pulsewidth(1.0/1000.00);
mgimple 18:b5f58a274570 233 thruster2.pulsewidth(1.0/1000.00);
mgimple 18:b5f58a274570 234
mgimple 18:b5f58a274570 235 }
slicht_instructor 0:6e97f9a6aca0 236
mgimple 10:b2fe6d1dee81 237 ///void thrust_off(float pw, float on_time) //input is pulse width
mgimple 10:b2fe6d1dee81 238 //