megan gimple / Mbed 2 deprecated OCE360_Final_Project

Dependencies:   mbed MMA8452Q MS5837 SDFileSystem SCI_SENSOR

Committer:
mgimple
Date:
Tue Nov 30 15:22:51 2021 +0000
Revision:
6:5f55105701ac
Parent:
5:17f2b3e61112
Child:
7:834315c46d94
defining pw and on_time; print message

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elizabethtaylor 2:a3b55216ffbd 1 //Eliza
mgimple 3:22a86bc49f44 2 //Megan
slicht_instructor 0:6e97f9a6aca0 3 /*
slicht_instructor 0:6e97f9a6aca0 4 Author Mingxi Zhou
slicht_instructor 0:6e97f9a6aca0 5 OCE360 underwater float template program
slicht_instructor 0:6e97f9a6aca0 6 */
slicht_instructor 0:6e97f9a6aca0 7 #include "mbed.h"
slicht_instructor 0:6e97f9a6aca0 8 #include "MMA8452Q.h" //accelerometer library
slicht_instructor 0:6e97f9a6aca0 9 #include "MS5837.h" //pressure sensor library***
mgimple 1:e1a2b47c3098 10 #include "SCI_SENSOR.h" //science sensor library, photocell, temperature cell
slicht_instructor 0:6e97f9a6aca0 11 #include "SDFileSystem.h" // SD card library
slicht_instructor 0:6e97f9a6aca0 12
slicht_instructor 0:6e97f9a6aca0 13 DigitalOut led1(LED1);
slicht_instructor 0:6e97f9a6aca0 14 DigitalOut led2(LED2);
slicht_instructor 0:6e97f9a6aca0 15
mgimple 1:e1a2b47c3098 16 Serial pc(USBTX, USBRX); //initial serial
mgimple 1:e1a2b47c3098 17 Serial BLE(p13,p14); //Bluetooth
mgimple 1:e1a2b47c3098 18 MMA8452Q accel(p28,p27,0x1D); //initial accelerometer
mgimple 1:e1a2b47c3098 19 LM19 temp(p19); //temperature sensor
mgimple 1:e1a2b47c3098 20 PhotoCell light(p20); //photocell
slicht_instructor 0:6e97f9a6aca0 21 MS5837 p_sensor(p9, p10, ms5837_addr_no_CS); //pressure sensor
slicht_instructor 0:6e97f9a6aca0 22 PwmOut thruster(p21); //set PWM pin //max 1.3ms min 1.1ms
slicht_instructor 0:6e97f9a6aca0 23 PwmOut thruster2(p22); //set PWM pin
slicht_instructor 0:6e97f9a6aca0 24 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
slicht_instructor 0:6e97f9a6aca0 25
slicht_instructor 0:6e97f9a6aca0 26 //global ticker
slicht_instructor 0:6e97f9a6aca0 27 Ticker log_ticker;
slicht_instructor 0:6e97f9a6aca0 28 Ticker accel_ticker;
mgimple 1:e1a2b47c3098 29
slicht_instructor 0:6e97f9a6aca0 30 // global timer
slicht_instructor 0:6e97f9a6aca0 31 Timer t;
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
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
slicht_instructor 0:6e97f9a6aca0 51 //Control related functions
slicht_instructor 0:6e97f9a6aca0 52 void thrust_on(float pw, float on_time); //input is pulse width
slicht_instructor 0:6e97f9a6aca0 53
mgimple 5:17f2b3e61112 54 //Control Parameters
mgimple 5:17f2b3e61112 55 float on_time = 5; //on for 5 seconds part one
mgimple 6:5f55105701ac 56 float pw=200; //pw? //define this? is ths where we define % of full thrust ie. 20/1000
mgimple 5:17f2b3e61112 57
slicht_instructor 0:6e97f9a6aca0 58 //-------------Main functions-----------------------------------------------------------------------------------------
slicht_instructor 0:6e97f9a6aca0 59 int main()
slicht_instructor 0:6e97f9a6aca0 60 {
slicht_instructor 0:6e97f9a6aca0 61 //-----Initialization realted code-------//
slicht_instructor 0:6e97f9a6aca0 62 //inital set the thruster esc to 1ms duty cycle
slicht_instructor 0:6e97f9a6aca0 63 thruster.period(0.002); // 2 ms period
slicht_instructor 0:6e97f9a6aca0 64 thruster.pulsewidth(1.0/1000.000);
mgimple 4:d87b1e40d419 65
slicht_instructor 0:6e97f9a6aca0 66 //Initialize accelerometer:
slicht_instructor 0:6e97f9a6aca0 67 accel.init();
slicht_instructor 0:6e97f9a6aca0 68 led1=1;
mgimple 4:d87b1e40d419 69
slicht_instructor 0:6e97f9a6aca0 70 //initialize pressure sensor
slicht_instructor 0:6e97f9a6aca0 71 pc.printf("setting the pressure sensor\r\n");
slicht_instructor 0:6e97f9a6aca0 72 p_sensor.MS5837Reset();
slicht_instructor 0:6e97f9a6aca0 73 p_sensor.MS5837Init();
mgimple 6:5f55105701ac 74 pc.printf("setting the tickers\r\n");
slicht_instructor 0:6e97f9a6aca0 75 t.start();
slicht_instructor 0:6e97f9a6aca0 76 led2=1;
slicht_instructor 0:6e97f9a6aca0 77 welcome();
mgimple 4:d87b1e40d419 78
slicht_instructor 0:6e97f9a6aca0 79 //-----setup ticker-------//
slicht_instructor 0:6e97f9a6aca0 80 //setup ticker to separate log and IMU data update.
slicht_instructor 0:6e97f9a6aca0 81 //so we could have all our control code in the while loop
slicht_instructor 0:6e97f9a6aca0 82 // //log at 2 Hz
slicht_instructor 0:6e97f9a6aca0 83 accel_ticker.attach(&accel_update,0.1); //10Hz
slicht_instructor 0:6e97f9a6aca0 84 log_ticker.attach(&log_data,0.5);
slicht_instructor 0:6e97f9a6aca0 85 wait(1);
slicht_instructor 0:6e97f9a6aca0 86 while(1)
slicht_instructor 0:6e97f9a6aca0 87 {
mgimple 5:17f2b3e61112 88
slicht_instructor 0:6e97f9a6aca0 89 // put your main control code here
slicht_instructor 0:6e97f9a6aca0 90 }
slicht_instructor 0:6e97f9a6aca0 91
slicht_instructor 0:6e97f9a6aca0 92 }
slicht_instructor 0:6e97f9a6aca0 93
slicht_instructor 0:6e97f9a6aca0 94 //-------------Customized functions---------------------------------------------//----------------------------------------
slicht_instructor 0:6e97f9a6aca0 95 ///-----------Welcome menu---------------------///
slicht_instructor 0:6e97f9a6aca0 96 void welcome()
slicht_instructor 0:6e97f9a6aca0 97 {
slicht_instructor 0:6e97f9a6aca0 98 char buffer[100]={0};
slicht_instructor 0:6e97f9a6aca0 99 int flag=1;
slicht_instructor 0:6e97f9a6aca0 100 //Flush the port
slicht_instructor 0:6e97f9a6aca0 101 while(BLE.readable())
slicht_instructor 0:6e97f9a6aca0 102 {
slicht_instructor 0:6e97f9a6aca0 103 BLE.getc();
slicht_instructor 0:6e97f9a6aca0 104 }
slicht_instructor 0:6e97f9a6aca0 105 while(flag)
slicht_instructor 0:6e97f9a6aca0 106 {
slicht_instructor 0:6e97f9a6aca0 107 BLE.printf("### I am alive\r\n");
slicht_instructor 0:6e97f9a6aca0 108 BLE.printf("### Please enter the log file name you want\r\n");
slicht_instructor 0:6e97f9a6aca0 109 if(BLE.readable())
slicht_instructor 0:6e97f9a6aca0 110 {
slicht_instructor 0:6e97f9a6aca0 111 BLE.scanf("%s",buffer);
slicht_instructor 0:6e97f9a6aca0 112 sprintf(fname,"/sd/mydir/%s.txt",buffer); //make file name
slicht_instructor 0:6e97f9a6aca0 113
slicht_instructor 0:6e97f9a6aca0 114 flag = 0; //set the flag to 0 to break the while
slicht_instructor 0:6e97f9a6aca0 115 }
slicht_instructor 0:6e97f9a6aca0 116 wait(1);
slicht_instructor 0:6e97f9a6aca0 117 }
slicht_instructor 0:6e97f9a6aca0 118 //print name
slicht_instructor 0:6e97f9a6aca0 119 BLE.printf("### name received\r\n");
slicht_instructor 0:6e97f9a6aca0 120 BLE.printf("### file name and directory is: \r\n %s\r\n",fname); //file name and location
slicht_instructor 0:6e97f9a6aca0 121 //open file test
slicht_instructor 0:6e97f9a6aca0 122 mkdir("/sd/mydir",0777); //keep 0777, this is magic #
slicht_instructor 0:6e97f9a6aca0 123 fp = fopen(fname, "a");
slicht_instructor 0:6e97f9a6aca0 124 if(fp == NULL){
slicht_instructor 0:6e97f9a6aca0 125 BLE.printf("Could not open file for write\n");
slicht_instructor 0:6e97f9a6aca0 126 }
slicht_instructor 0:6e97f9a6aca0 127 else
slicht_instructor 0:6e97f9a6aca0 128 {
slicht_instructor 0:6e97f9a6aca0 129 BLE.printf("##file open good \n"); //open file and tell if open
slicht_instructor 0:6e97f9a6aca0 130 fprintf(fp, "Hello\r\n");
slicht_instructor 0:6e97f9a6aca0 131 fclose(fp);
slicht_instructor 0:6e97f9a6aca0 132 }
slicht_instructor 0:6e97f9a6aca0 133
slicht_instructor 0:6e97f9a6aca0 134 BLE.printf("### The main program will start in 10 seconds\r\n");
slicht_instructor 0:6e97f9a6aca0 135 wait(5);
slicht_instructor 0:6e97f9a6aca0 136 }
slicht_instructor 0:6e97f9a6aca0 137
slicht_instructor 0:6e97f9a6aca0 138 ///-----------log functions---------------------///
slicht_instructor 0:6e97f9a6aca0 139 void log_data()
slicht_instructor 0:6e97f9a6aca0 140 {
slicht_instructor 0:6e97f9a6aca0 141 //log system time t.read()
slicht_instructor 0:6e97f9a6aca0 142 // log imu data, log science data
slicht_instructor 0:6e97f9a6aca0 143 // log pulse width
slicht_instructor 0:6e97f9a6aca0 144 // log pressure sensor data.
slicht_instructor 0:6e97f9a6aca0 145 //science sensor: temp.temp(), light.light()
slicht_instructor 0:6e97f9a6aca0 146 //IMU sensor
slicht_instructor 0:6e97f9a6aca0 147
slicht_instructor 0:6e97f9a6aca0 148 }
slicht_instructor 0:6e97f9a6aca0 149
slicht_instructor 0:6e97f9a6aca0 150 ///-----------acceleromter related functions---------------------///
slicht_instructor 0:6e97f9a6aca0 151 void accel_update()
slicht_instructor 0:6e97f9a6aca0 152 {
slicht_instructor 0:6e97f9a6aca0 153 accelData[0] = accel.readX();
slicht_instructor 0:6e97f9a6aca0 154 accelData[1] = accel.readY();
slicht_instructor 0:6e97f9a6aca0 155 accelData[2] = accel.readZ();
slicht_instructor 0:6e97f9a6aca0 156 }
slicht_instructor 0:6e97f9a6aca0 157
slicht_instructor 0:6e97f9a6aca0 158 ///-----------Control related functions---------------------///
slicht_instructor 0:6e97f9a6aca0 159 ////Thruster on control, pw->pulse width in milli-second//
slicht_instructor 0:6e97f9a6aca0 160 //// pw range between 1 to 1.5//
slicht_instructor 0:6e97f9a6aca0 161 //// on_time-> thruster on time.
slicht_instructor 0:6e97f9a6aca0 162 void thrust_on(float pw, float on_time) //input is pulse width
slicht_instructor 0:6e97f9a6aca0 163 {
slicht_instructor 0:6e97f9a6aca0 164 float pw_max=2.0;
slicht_instructor 0:6e97f9a6aca0 165 if(pw>pw_max)
slicht_instructor 0:6e97f9a6aca0 166 {
slicht_instructor 0:6e97f9a6aca0 167 pw=pw_max; //hard limitation
slicht_instructor 0:6e97f9a6aca0 168 }
slicht_instructor 0:6e97f9a6aca0 169 Timer tt;
slicht_instructor 0:6e97f9a6aca0 170 tt.reset();
slicht_instructor 0:6e97f9a6aca0 171 tt.start();
slicht_instructor 0:6e97f9a6aca0 172 // lets set the pulse width
slicht_instructor 0:6e97f9a6aca0 173 //thruster.period(20.0/1000.00); // 20 ms period
slicht_instructor 0:6e97f9a6aca0 174 thruster.pulsewidth(pw/1000.00);
slicht_instructor 0:6e97f9a6aca0 175 thruster2.pulsewidth(pw/1000.00);
slicht_instructor 0:6e97f9a6aca0 176 //PWM will be kept until time out
slicht_instructor 0:6e97f9a6aca0 177 while(tt.read()<=on_time)
slicht_instructor 0:6e97f9a6aca0 178 {
mgimple 6:5f55105701ac 179 pc.printf("thruster on?...mack is cool\r\n"); //print check
mgimple 6:5f55105701ac 180 //turn on thurster
slicht_instructor 0:6e97f9a6aca0 181 }
slicht_instructor 0:6e97f9a6aca0 182 //stop the timer
slicht_instructor 0:6e97f9a6aca0 183 tt.stop();
slicht_instructor 0:6e97f9a6aca0 184 //turn off the thruster
slicht_instructor 0:6e97f9a6aca0 185 thruster.pulsewidth(1.0/1000.00);
slicht_instructor 0:6e97f9a6aca0 186 thruster2.pulsewidth(1.0/1000.00);
slicht_instructor 0:6e97f9a6aca0 187
slicht_instructor 0:6e97f9a6aca0 188 }
slicht_instructor 0:6e97f9a6aca0 189