megan gimple / Mbed 2 deprecated OCE360_Final_Project

Dependencies:   mbed MMA8452Q MS5837 SDFileSystem SCI_SENSOR

Committer:
mgimple
Date:
Fri Dec 03 20:21:19 2021 +0000
Revision:
18:b5f58a274570
Parent:
17:e72c4ac9a39e
Child:
19:c78d3e8353c4
Part Three Initial Code:; bang bang

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