KL46Z-lab3_full

Dependencies:   SLCD- mbed KL46Z-USBHost TSI MMA8451Q MAG3110 FATFileSystem

Committer:
Lokkus
Date:
Thu Feb 21 07:42:01 2019 +0000
Revision:
0:147f106a5503
KL46Z-lab3_full

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Lokkus 0:147f106a5503 1 //USB Academy - Lab3 rev 00
Lokkus 0:147f106a5503 2 //_____________________________________________________________//
Lokkus 0:147f106a5503 3 //======== INCLUDES ===========================================//
Lokkus 0:147f106a5503 4 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯//
Lokkus 0:147f106a5503 5 #include "mbed.h"
Lokkus 0:147f106a5503 6 #include "MMA8451Q.h"
Lokkus 0:147f106a5503 7 #include "MAG3110.h"
Lokkus 0:147f106a5503 8 #include "SLCD.h"
Lokkus 0:147f106a5503 9 #include "TSISensor.h"
Lokkus 0:147f106a5503 10
Lokkus 0:147f106a5503 11
Lokkus 0:147f106a5503 12 //#include "USBMouse.h" //Lab1-Hid
Lokkus 0:147f106a5503 13 //#include "USBSerial.h" //Lab2-cdc
Lokkus 0:147f106a5503 14 #include "USBHostMSD.h" //Lab3-MSd
Lokkus 0:147f106a5503 15
Lokkus 0:147f106a5503 16
Lokkus 0:147f106a5503 17
Lokkus 0:147f106a5503 18
Lokkus 0:147f106a5503 19
Lokkus 0:147f106a5503 20 //_____________________________________________________________//
Lokkus 0:147f106a5503 21 //======== DEFINES & VARIABLES ================================//
Lokkus 0:147f106a5503 22 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯//
Lokkus 0:147f106a5503 23 #define LED_ON 0 //outON, pwmON
Lokkus 0:147f106a5503 24 #define LED_OFF 1 //outOFF,pwmOFF
Lokkus 0:147f106a5503 25 DigitalOut gLED(LED_GREEN); //PTD5
Lokkus 0:147f106a5503 26
Lokkus 0:147f106a5503 27 #define rLEDperiod 150 //[ms]
Lokkus 0:147f106a5503 28 PwmOut rLED(LED_RED); //PTE29
Lokkus 0:147f106a5503 29
Lokkus 0:147f106a5503 30 #define PRESS_ON 0
Lokkus 0:147f106a5503 31 #define PRESS_OFF 1
Lokkus 0:147f106a5503 32 DigitalIn sw1(PTC3); //if(sw1) Release else Press
Lokkus 0:147f106a5503 33 DigitalIn sw3(PTC12); //while(sw3); wait for Press
Lokkus 0:147f106a5503 34
Lokkus 0:147f106a5503 35 #define MMA8451_I2C_ADDRESS (0x1d<<1)
Lokkus 0:147f106a5503 36 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
Lokkus 0:147f106a5503 37
Lokkus 0:147f106a5503 38 SLCD slcd; //[88:88][8.8.8.8] SegmentLCD
Lokkus 0:147f106a5503 39
Lokkus 0:147f106a5503 40 AnalogIn light(PTE22); //analog-light input
Lokkus 0:147f106a5503 41
Lokkus 0:147f106a5503 42 TSISensor slider; //Capacitive Touch Slider
Lokkus 0:147f106a5503 43
Lokkus 0:147f106a5503 44 MAG3110 mag(PTE25, PTE24); //Magnetometer
Lokkus 0:147f106a5503 45
Lokkus 0:147f106a5503 46 Serial usb_osda(USBTX, USBRX); //OpenSDA Terminal
Lokkus 0:147f106a5503 47 #define pf usb_osda //printf out -> osda (lab1,2,3)
Lokkus 0:147f106a5503 48
Lokkus 0:147f106a5503 49 struct KL46_SENSOR_DATA {
Lokkus 0:147f106a5503 50 int sw1State;
Lokkus 0:147f106a5503 51 int sw3State;
Lokkus 0:147f106a5503 52 float accValX;
Lokkus 0:147f106a5503 53 float accValY;
Lokkus 0:147f106a5503 54 float accValZ;
Lokkus 0:147f106a5503 55
Lokkus 0:147f106a5503 56 float slider;
Lokkus 0:147f106a5503 57 float light;
Lokkus 0:147f106a5503 58 int magValX;
Lokkus 0:147f106a5503 59 int magValY;
Lokkus 0:147f106a5503 60 int magValZ;
Lokkus 0:147f106a5503 61
Lokkus 0:147f106a5503 62 float magHeading;
Lokkus 0:147f106a5503 63 } sensorData;
Lokkus 0:147f106a5503 64 #define sD sensorData
Lokkus 0:147f106a5503 65
Lokkus 0:147f106a5503 66 void SLCD_blinking_msg_wait(char *slcd_msg1, char *slcd_msg2);
Lokkus 0:147f106a5503 67
Lokkus 0:147f106a5503 68
Lokkus 0:147f106a5503 69 int MagCalibrationXY(void); //mag calib
Lokkus 0:147f106a5503 70
Lokkus 0:147f106a5503 71
Lokkus 0:147f106a5503 72
Lokkus 0:147f106a5503 73 //_____________________________________________________________//
Lokkus 0:147f106a5503 74 //======== MAIN() =============================================//
Lokkus 0:147f106a5503 75 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯//
Lokkus 0:147f106a5503 76 int main(void)
Lokkus 0:147f106a5503 77 {
Lokkus 0:147f106a5503 78 int mag_calib = 0;
Lokkus 0:147f106a5503 79 FILE* fp;
Lokkus 0:147f106a5503 80 //Lab3add
Lokkus 0:147f106a5503 81
Lokkus 0:147f106a5503 82
Lokkus 0:147f106a5503 83 //---- MAIN/Inits -----------------------------------------//
Lokkus 0:147f106a5503 84
Lokkus 0:147f106a5503 85 sw1.mode(PullUp);
Lokkus 0:147f106a5503 86 sw3.mode(PullUp);
Lokkus 0:147f106a5503 87
Lokkus 0:147f106a5503 88 gLED = LED_ON; //Green LED ON to indicate running/writing
Lokkus 0:147f106a5503 89 rLED = LED_OFF; //Red LED OFF
Lokkus 0:147f106a5503 90 rLED.period(rLEDperiod); //Red LED (rLED) tsi/accZ/mag
Lokkus 0:147f106a5503 91
Lokkus 0:147f106a5503 92 //---- MAIN/Inits (Wait4SW1) -> Start! --------------------//
Lokkus 0:147f106a5503 93
Lokkus 0:147f106a5503 94 //wait for Press SW1 - e.g. for HID/CDC/MSD Windows install.
Lokkus 0:147f106a5503 95 //SLCD_blinking_msg_wait(" o","Helo"); //Helo (no usb);
Lokkus 0:147f106a5503 96 SLCD_blinking_msg_wait(" o","MSd ");//Lab1=Hid;2=cdc;3=Msd
Lokkus 0:147f106a5503 97
Lokkus 0:147f106a5503 98 //---- MAIN/Inits Interface -------------------------------//
Lokkus 0:147f106a5503 99
Lokkus 0:147f106a5503 100 usb_osda.baud(115200);
Lokkus 0:147f106a5503 101 usb_osda.printf("\n___________________________________\r\n");
Lokkus 0:147f106a5503 102 usb_osda.printf("\nFRDM-KL46Z_Lab\r\n \r\n I am a CDC serial port @OpenSDA/mUSB. Baud=115200 \r\n");
Lokkus 0:147f106a5503 103
Lokkus 0:147f106a5503 104 //---- MAIN/Inits Labs ------------------------------------//
Lokkus 0:147f106a5503 105 //---- MAIN/Inits (Wait4SW1) -> Calib. eCompass -----------//
Lokkus 0:147f106a5503 106 while (!mag_calib) {
Lokkus 0:147f106a5503 107 pf.printf(" Press and release SW1 to calibrate eCompass.\r\n");
Lokkus 0:147f106a5503 108 SLCD_blinking_msg_wait(" o","CAL ");
Lokkus 0:147f106a5503 109
Lokkus 0:147f106a5503 110 // Calibrate Magnetometer to eCompass
Lokkus 0:147f106a5503 111 pf.printf(" ... r o t a t e the FRDM board in 3d/360° until [donE].\r\n");
Lokkus 0:147f106a5503 112
Lokkus 0:147f106a5503 113 mag_calib = MagCalibrationXY(); //to wait untill calib or cancel!!!
Lokkus 0:147f106a5503 114
Lokkus 0:147f106a5503 115 if (mag_calib) {
Lokkus 0:147f106a5503 116 if (mag_calib == -1)
Lokkus 0:147f106a5503 117 {
Lokkus 0:147f106a5503 118 pf.printf(" [SKiP]! Calibration skipped! ... See Accelerometer Z-axis.\r\n");
Lokkus 0:147f106a5503 119 SLCD_blinking_msg_wait(" o","SKiP"); //->acc
Lokkus 0:147f106a5503 120 } else {
Lokkus 0:147f106a5503 121 pf.printf(" [donE]! Calibration completed! ... Press and release SW1 to try eCompass.\r\n");
Lokkus 0:147f106a5503 122 SLCD_blinking_msg_wait(" o","donE"); //->mag
Lokkus 0:147f106a5503 123 }
Lokkus 0:147f106a5503 124 break; //while (!mag_calib)
Lokkus 0:147f106a5503 125 } else {
Lokkus 0:147f106a5503 126 slcd.printf("erro");
Lokkus 0:147f106a5503 127 pf.printf("r\n Error Calib !!! try again !!!\r\n\r\n");
Lokkus 0:147f106a5503 128 } //repet calib
Lokkus 0:147f106a5503 129 }
Lokkus 0:147f106a5503 130
Lokkus 0:147f106a5503 131 pf.printf("\r\n Lab3: pls plug USB-stick into mUSB/KL46Z \r\n");
Lokkus 0:147f106a5503 132
Lokkus 0:147f106a5503 133 slcd.printf("USb~"); //Lab1=Hid;2=cdc;3=Msd
Lokkus 0:147f106a5503 134 USBHostMSD msd("usb"); //wait for plugged USB-stick
Lokkus 0:147f106a5503 135 if (!msd.connect()) {
Lokkus 0:147f106a5503 136 error(" USB Flash drive not found.\r\n");
Lokkus 0:147f106a5503 137 }
Lokkus 0:147f106a5503 138
Lokkus 0:147f106a5503 139 //Attempt to crete file /usb/usb_lab3.txt @USB-stick.
Lokkus 0:147f106a5503 140 fp = fopen("/usb/usb_lab3.txt", "w"); //rewrite, or create
Lokkus 0:147f106a5503 141 if (fp) {
Lokkus 0:147f106a5503 142 pf.printf(" ... sucess file-open (/usb/usb_lab3.txt @USB-stick)!\r\n\r\n");
Lokkus 0:147f106a5503 143 fprintf(fp, " Lab3: from FRDM-KL46Z \r\n\r\n");
Lokkus 0:147f106a5503 144 fclose(fp); fp=NULL;
Lokkus 0:147f106a5503 145 } else pf.printf(" ... failed file-open (/usb/usb_lab3.txt @USB-stick)!\r\n\r\n");
Lokkus 0:147f106a5503 146
Lokkus 0:147f106a5503 147
Lokkus 0:147f106a5503 148 //---- MAIN/Inits (Wait4SW1) -> Calib. eCompass -----------//
Lokkus 0:147f106a5503 149
Lokkus 0:147f106a5503 150 //---- MAIN/Inits Done! (Wait4SW1) -> MANI/Loop -----------//
Lokkus 0:147f106a5503 151
Lokkus 0:147f106a5503 152 gLED = LED_OFF; //Inits are done
Lokkus 0:147f106a5503 153
Lokkus 0:147f106a5503 154 //---- MAIN/Loop -----------------------------------------//
Lokkus 0:147f106a5503 155 while (1) {
Lokkus 0:147f106a5503 156 //disable all SLCD DPs
Lokkus 0:147f106a5503 157 slcd.DP(0, false); slcd.DP(1, false); slcd.DP(2, false);
Lokkus 0:147f106a5503 158
Lokkus 0:147f106a5503 159 // MAIN/Loop/Sensing and Storing data -----------------//
Lokkus 0:147f106a5503 160 sD.sw1State = sw1; sD.sw3State = sw3;
Lokkus 0:147f106a5503 161 sD.accValX = acc.getAccX(); //accX[-1..1]->mouse (Lab1)
Lokkus 0:147f106a5503 162 sD.accValY = acc.getAccY(); //accY[-1..1]->mouse (Lab1)
Lokkus 0:147f106a5503 163 sD.accValZ = acc.getAccZ(); //accZ[-1..1]->rLED
Lokkus 0:147f106a5503 164
Lokkus 0:147f106a5503 165 sD.slider = slider.readPercentage() * 100;
Lokkus 0:147f106a5503 166 sD.light = light;
Lokkus 0:147f106a5503 167 sD.magValX = mag.readVal(MAG_OUT_X_MSB);
Lokkus 0:147f106a5503 168 sD.magValY = mag.readVal(MAG_OUT_Y_MSB);
Lokkus 0:147f106a5503 169 sD.magValZ = mag.readVal(MAG_OUT_Z_MSB);
Lokkus 0:147f106a5503 170 sD.magHeading = mag.getHeading(); //calculate heading
Lokkus 0:147f106a5503 171 // MAIN/Loop/Processing and Actions -------------------//
Lokkus 0:147f106a5503 172 //sensor -> terminal
Lokkus 0:147f106a5503 173 if (fp) { gLED = !gLED; //blinkig
Lokkus 0:147f106a5503 174 pf.printf("%.2f\t", sD.magHeading); //->terminal
Lokkus 0:147f106a5503 175 fprintf(fp,"%.2f\t ", sD.magHeading); //->usb_file
Lokkus 0:147f106a5503 176
Lokkus 0:147f106a5503 177 pf.printf("% 1.2f\r\n", sD.accValZ); //->terminal
Lokkus 0:147f106a5503 178 fprintf(fp,"% 1.2f\r\n", sD.accValZ); //->usb_file
Lokkus 0:147f106a5503 179 } else gLED = LED_OFF;
Lokkus 0:147f106a5503 180
Lokkus 0:147f106a5503 181 if(!fp && sw1==PRESS_ON) fp=fopen("/usb/usb_lab3.txt", "a");
Lokkus 0:147f106a5503 182 else
Lokkus 0:147f106a5503 183 if(fp && sw1==PRESS_OFF) {fclose(fp); fp=NULL; gLED=LED_OFF;}
Lokkus 0:147f106a5503 184
Lokkus 0:147f106a5503 185 rLED = abs(sD.accValZ);
Lokkus 0:147f106a5503 186
Lokkus 0:147f106a5503 187 slcd.CharPosition=0; //prevent slcd rolling
Lokkus 0:147f106a5503 188 slcd.printf("% 3.0f", sD.magHeading);
Lokkus 0:147f106a5503 189 //slcd.printf("% 3.0f", sD.accValZ);
Lokkus 0:147f106a5503 190
Lokkus 0:147f106a5503 191
Lokkus 0:147f106a5503 192 //acc: z-axis 1g min-blinking//acc: z-axis 1g min-blinking
Lokkus 0:147f106a5503 193 rLED = abs(sD.accValZ);
Lokkus 0:147f106a5503 194
Lokkus 0:147f106a5503 195 wait(0.05); //wait 50ms
Lokkus 0:147f106a5503 196 }
Lokkus 0:147f106a5503 197
Lokkus 0:147f106a5503 198 }
Lokkus 0:147f106a5503 199
Lokkus 0:147f106a5503 200
Lokkus 0:147f106a5503 201
Lokkus 0:147f106a5503 202
Lokkus 0:147f106a5503 203
Lokkus 0:147f106a5503 204 //_____________________________________________________________//
Lokkus 0:147f106a5503 205 //======== FUNC() =============================================//
Lokkus 0:147f106a5503 206 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯//
Lokkus 0:147f106a5503 207
Lokkus 0:147f106a5503 208 //Lab2add
Lokkus 0:147f106a5503 209 void SLCD_blinking_msg_wait(char *slcd_msg1, char *slcd_msg2)
Lokkus 0:147f106a5503 210 {
Lokkus 0:147f106a5503 211 char wait4sw1=0; //~500ms blinking
Lokkus 0:147f106a5503 212
Lokkus 0:147f106a5503 213 //wait for Press SW1 - to start mag calibration
Lokkus 0:147f106a5503 214 while(sw1 == PRESS_ON); //wait for release
Lokkus 0:147f106a5503 215 while(sw1 == PRESS_OFF) { //wait for press
Lokkus 0:147f106a5503 216 if (++wait4sw1 < 150) //300ms
Lokkus 0:147f106a5503 217 slcd.printf(slcd_msg1);
Lokkus 0:147f106a5503 218 else //200ms
Lokkus 0:147f106a5503 219 slcd.printf(slcd_msg2);
Lokkus 0:147f106a5503 220 wait(0.002);
Lokkus 0:147f106a5503 221 }
Lokkus 0:147f106a5503 222 while(sw1 == PRESS_ON); //wait for release
Lokkus 0:147f106a5503 223 }
Lokkus 0:147f106a5503 224 //Lab3add
Lokkus 0:147f106a5503 225 int MagCalibrationXY(void)
Lokkus 0:147f106a5503 226 {
Lokkus 0:147f106a5503 227 int newX, tempXmax, tempXmin;
Lokkus 0:147f106a5503 228 int newY, tempYmax, tempYmin;
Lokkus 0:147f106a5503 229 int newZ, tempZmax, tempZmin;
Lokkus 0:147f106a5503 230 int delta_avg=0, delta_avg_min=0, delta_avg_max=0, delta_calib_limit=800;
Lokkus 0:147f106a5503 231
Lokkus 0:147f106a5503 232 // Read initial values of magnetomoter
Lokkus 0:147f106a5503 233 //read it here to create a slight delay for calPin to settle!!!
Lokkus 0:147f106a5503 234 tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB);
Lokkus 0:147f106a5503 235 tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB);
Lokkus 0:147f106a5503 236 tempZmax = tempZmin = mag.readVal(MAG_OUT_Z_MSB);
Lokkus 0:147f106a5503 237
Lokkus 0:147f106a5503 238 // Update min and max values until calPin asserted again
Lokkus 0:147f106a5503 239 while(sw1) {//wait for Press == manual calib stop
Lokkus 0:147f106a5503 240 newX = mag.readVal(MAG_OUT_X_MSB);
Lokkus 0:147f106a5503 241 newY = mag.readVal(MAG_OUT_Y_MSB);
Lokkus 0:147f106a5503 242 newZ = mag.readVal(MAG_OUT_Z_MSB);
Lokkus 0:147f106a5503 243
Lokkus 0:147f106a5503 244 if (newX > tempXmax) tempXmax = newX;
Lokkus 0:147f106a5503 245 if (newX < tempXmin) tempXmin = newX; newX = tempXmax - tempXmin;
Lokkus 0:147f106a5503 246 if (newY > tempYmax) tempYmax = newY;
Lokkus 0:147f106a5503 247 if (newY < tempYmin) tempYmin = newY; newY = tempYmax - tempYmin;
Lokkus 0:147f106a5503 248 if (newZ > tempZmax) tempZmax = newZ;
Lokkus 0:147f106a5503 249 if (newZ < tempZmin) tempZmin = newZ; newZ = tempZmax - tempZmin;
Lokkus 0:147f106a5503 250
Lokkus 0:147f106a5503 251 delta_avg = (newX + newY + newZ);
Lokkus 0:147f106a5503 252
Lokkus 0:147f106a5503 253 //delta is too high? -> error, try new calib!!!
Lokkus 0:147f106a5503 254 if (delta_avg > 5 * delta_calib_limit) {delta_avg = 0; break; }
Lokkus 0:147f106a5503 255
Lokkus 0:147f106a5503 256 //div3 with error +0.8 pct
Lokkus 0:147f106a5503 257 delta_avg = (21*(newX + newY + newZ))>>6;
Lokkus 0:147f106a5503 258
Lokkus 0:147f106a5503 259 //calib ok for delat ~800-1200 (~80-120uT)
Lokkus 0:147f106a5503 260 if (delta_avg > delta_calib_limit){
Lokkus 0:147f106a5503 261 delta_avg_min = delta_avg - (delta_avg>>2);
Lokkus 0:147f106a5503 262 delta_avg_max = delta_avg + (delta_avg>>1);
Lokkus 0:147f106a5503 263 if (delta_avg_min < newX && delta_avg_max > newX
Lokkus 0:147f106a5503 264 && delta_avg_min < newY && delta_avg_max > newY
Lokkus 0:147f106a5503 265 && delta_avg_min < newZ && delta_avg_max > newZ) break;
Lokkus 0:147f106a5503 266 }
Lokkus 0:147f106a5503 267
Lokkus 0:147f106a5503 268 //show calib progress 0->100%
Lokkus 0:147f106a5503 269 slcd.printf("C%3.0f", (float)delta_avg/delta_calib_limit*100);
Lokkus 0:147f106a5503 270 }
Lokkus 0:147f106a5503 271
Lokkus 0:147f106a5503 272 if (sw1 == PRESS_ON || delta_avg ) {
Lokkus 0:147f106a5503 273 mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax );
Lokkus 0:147f106a5503 274 if (sw1 == PRESS_ON) return -1; //==-1 ..user skip
Lokkus 0:147f106a5503 275 return delta_avg; //>0 .. done, ok calib
Lokkus 0:147f106a5503 276 }
Lokkus 0:147f106a5503 277 return 0; //==0 .. error, no calib
Lokkus 0:147f106a5503 278 }