this program is designed for the CHITISAT's OBC, and is a prototype for the flight plan vs altitude
Dependencies: ADS1015 BMP280 SDFileSystem SENSOR mbed
Diff: main.cpp
- Revision:
- 4:c2bdc2bced76
- Parent:
- 3:fef99c7c92b5
- Child:
- 5:05fd6249c21b
diff -r fef99c7c92b5 -r c2bdc2bced76 main.cpp --- a/main.cpp Thu Jun 14 14:22:30 2018 +0000 +++ b/main.cpp Tue Jun 26 20:04:47 2018 +0000 @@ -10,14 +10,13 @@ #include "SENSOR.h" //***** declaracion de puertos SDFileSystem sd(PA_12, PA_6, PA_1, PB_0 , "sd");// puerto SPI para el Storage -//LocalFileSystem sd("local");// puerto SPI para el Storage Serial sc(PB_6, PB_7,9600); //puerto para el sistema de comunicacioness //I2C i2c(PB_4,PA_7); // puerto i2c BMP280 bmp(i2c,0xEC); //Default address = 0x76 Adafruit_ADS1115 ads(&i2c); // adc de 16 bits Serial obc(USBTX,USBRX); // puerto virtual del obc SENSOR uv(PB_4,PA_7); //sensor de rayos ultra violeta -//HMC5883L mag(PB_4,PA_7); // magnetometro +SENSOR mag(PB_4,PA_7); // magnetometro AnalogIn temp2(PA_5); //sensor de temperatura externa AnalogIn voltaje(PA_4); //sensor analogico de voltaje AnalogIn corriente(PA_3); // sensor analogico de corriente @@ -99,10 +98,10 @@ wait(2); Vcondicional=0; //iniciando camara - camera=0; + camera=1; led=1; wait(2); - camera=1; + camera=0; led=0; wait(1); obc.printf("iniciando camara\n\r"); @@ -138,8 +137,10 @@ //int altura=10; //***************** //float x=0.5; - float hmin=1; - while(h<0.9){ + float hmin=0.5; + float hsil; + hsil=hmin-0.1; + while(h<hsil){ obc.printf("subiendo en silencio radial altura=%f\n\r",h); h=get_altura(); led=!led; @@ -243,13 +244,9 @@ void take_tl(void){ int i; - IMU[0]=imu[0]=1;// mag.getMx(); - IMU[1]=imu[1]=2;// mag.getMy(); - IMU[2]=imu[2]=3;// mag.getMz(); - /* - uint8_t whoami = mpu6050.readByte(MPU6050_ADDRESS, WHO_AM_I_MPU6050); // Read WHO_AM_I register for MPU-6050\ - if (whoami == 0x68) // WHO_AM_I should always be 0x68 - {*/ + IMU[0]=imu[0]= mag.getMx(); + IMU[1]=imu[1]= mag.getMy(); + IMU[2]=imu[2]= mag.getMz(); mpu6050.MPU6050SelfTest(SelfTest); // Start by performing self test and reporting values if(SelfTest[0] < 1.0f && SelfTest[1] < 1.0f && SelfTest[2] < 1.0f && SelfTest[3] < 1.0f && SelfTest[4] < 1.0f && SelfTest[5] < 1.0f) { @@ -257,7 +254,6 @@ mpu6050.calibrateMPU6050(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers mpu6050.initMPU6050(); } - //} if(mpu6050.readByte(MPU6050_ADDRESS, INT_STATUS) & 0x01) { // check if data ready interrupt mpu6050.readAccelData(accelCount); // Read the x/y/z adc values mpu6050.getAres(); @@ -284,14 +280,18 @@ } press=bmp.getPressure(); //temperatura tomada del imu - temp[0]=temperature*1000; //temperatura en milivoltios ajuatado a 12 bits. - float tempe1=temp2.read(); //obteniendo la temperatura en voltaje - temp[1]= temp2.read_u16();temp[1]=(temp[1]>>4);//temperatura en milivoltios ajuatado a 12 bits. - sensor_adc[0]=temp3.read_u16();sen_adc[0]=(sensor_adc[0]>>4); - sensor_adc[1]=corriente.read_u16();sen_adc[1]=(sensor_adc[1]>>4); - sensor_adc[2]=voltaje.read_u16();sen_adc[2]=(sensor_adc[2]>>4); + int tempera=temperature*100; + int offsetadc=60; //CORRECCION DE LOS DATOS TOMADOS DEL ADC, EL ERROR ES PRODUCIDO POR VREF. + //tempera=ceil(tempera); + temp[0]=tempera; //temperatura en milivoltios ajuatado a 12 bits. + //float tempe1=temp2.read(); //obteniendo la temperatura en voltaje + temp[1]= temp2.read_u16();temp[1]=(temp[1]>>4)+offsetadc;//temperatura en milivoltios ajuatado a 12 bits. + sensor_adc[0]=temp3.read_u16();sen_adc[0]=(sensor_adc[0]>>4)+offsetadc; + sensor_adc[1]=corriente.read_u16();sen_adc[1]=(sensor_adc[1]>>4)+offsetadc; + sensor_adc[2]=voltaje.read_u16();sen_adc[2]=(sensor_adc[2]>>4)+offsetadc; suv=uv.getUV(); //sensor_adc[3]=temp2.read();//uv.read();sen_adc[3]=sensor_adc[3]/0.0008789062; + obc.printf("tomando telemetria\n"); } @@ -304,6 +304,7 @@ senfis[0]=h1; senfis[1]=h2; senfis[2]=tiempo; + obc.printf("tiempo=%d",senfis[2]); /* ads.setGain(GAIN_TWOTHIRDS); for(int i=0;i<=3;i++){ @@ -321,8 +322,8 @@ BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado NVIC_SystemReset(); } - fprintf(fp,"%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sensor_adc[0],sensor_adc[1],sensor_adc[2],suv,h); - obc.printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sensor_adc[0],sensor_adc[1],sensor_adc[2],suv,h); + fprintf(fp,"%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sen_adc[0],sen_adc[1],sen_adc[2],suv,h); + obc.printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sen_adc[0],sen_adc[1],sen_adc[2],suv,h); fclose(fp); obc.printf("guardando telemetria\n"); } @@ -339,9 +340,14 @@ obc.printf("guardando mision\n"); } void build_tr1(void){ //construir trama de datos 1 - bar=ceil(P*100); //tomando los 20 bits sin procesar del barometro - uint16_t y,z,y4,y3,y2,z4,ah,al; + int barometro; + barometro=ceil(P*100); //tomando los 20 bits sin procesar del barometro + bar=barometro; + obc.printf("p=%f barometro= %d bar= %d temp0= %d \n\r",P,barometro,bar,temp[0]); + wait(1); + uint16_t y,z,y2,z4,ah,al; uint32_t par[3];// para los tres pares de datos de 32 bits + uint32_t y4,y3; uint32_t AH,AL; y=4080; z=15; @@ -351,6 +357,8 @@ z4=0x000000ff; //completando a paquetes de 32 bits par[0]=(bar<<12)|temp[0]; + obc.printf("par 0=%d",par[0]); + wait(1); ah=sen_adc[1]&y; al=sen_adc[1]&z; ah=(ah>>4); @@ -386,8 +394,8 @@ } void build_tr2(void){// construir trama de datos 2 bar=ceil(P*100); //tomando los 20 bits sin procesar del barometro - uint16_t y,z,y4,y3,y2,z4,ah,al; - uint32_t par;// para los tres pares de datos de 32 bits + uint16_t y,z,y2,z4,ah,al; + uint32_t par,y4,y3;// para los tres pares de datos de 32 bits uint32_t AH,AL; y=4080; z=15; @@ -422,7 +430,6 @@ trama[i*2+23]=AH; trama[i*2+24]=AL; } - trama[0]=data2; //cabecera de la trama de datos 2 //publicando la trama de datos 2 en el puerto virtual for(int i=0;i<=30;i++){ @@ -432,38 +439,6 @@ } void send_tr(void){ - /* - sc.putc(trama[1]); - sc.putc(trama[2]); - sc.putc(trama[3]); - sc.putc(trama[4]); - sc.putc(trama[5]); - sc.putc(trama[6]); - sc.putc(trama[7]); - sc.putc(trama[8]); - sc.putc(trama[9]); - sc.putc(trama[10]); - sc.putc(trama[11]); - sc.putc(trama[12]); - sc.putc(trama[13]); - sc.putc(trama[14]); - sc.putc(trama[15]); - sc.putc(trama[16]); - sc.putc(trama[17]); - sc.putc(trama[18]); - sc.putc(trama[19]); - sc.putc(trama[20]); - sc.putc(trama[21]); - sc.putc(trama[22]); - sc.putc(trama[23]); - sc.putc(trama[24]); - sc.putc(trama[25]); - sc.putc(trama[26]); - sc.putc(trama[27]); - sc.putc(trama[28]); - sc.putc(trama[29]); - sc.putc(trama[30]); - */ for(int i=0;i<=30;i++){ sc.putc(trama[i]); } @@ -479,7 +454,7 @@ //************************************************************ //TOMAR LOS 100 DATOS CADA .05 SEGUNDOS, PARA DETERMINAR LA PRESION INICIAL for (int i=0;i<100;i++) - { + { BMPTemp=bmp.getTemperature(); // generando t_fine PARA LA TEMPERATURA DE ESCALAMIENTP Pp[i]= bmp.getPressure(); // pi es la condicion inical para la presion Ps=Ps+Pp[i]; @@ -489,19 +464,15 @@ } //LA MEDIA DE TODOS LOS DATOS NOS DA LA PRESION REAL Pi=Ps/100; //presion real - //************************************************************ - } else { // leer las condiciones iniciales del archivo ci,txt FILE *fp=fopen("/sd/condiciones/ci.txt","r"); - // obc.printf("%d..................",fp); - fscanf(fp,"%d %f %f",&BR,&BMPTemp,&Pi); + fscanf(fp,"%d %f %f",&BR,&BMPTemp,&Pi); fclose(fp); //fin de la lectura de datos } - //return (BMPTemp, pi); return 1; } @@ -547,7 +518,7 @@ dif=floor(dif); //REDONDEANDO AL MENOR if (altura1 >= 0){ //VER SI ES NEGATIVO O POSITIVO if(dif>=5){ - h=altura0+.5; //SI ES POSITIVO Y MAYOR A 5 LA PARTE DECIMAL, ANIADE .5 AL LA PARTE ENTERA + h=altura0+0.5; //SI ES POSITIVO Y MAYOR A 5 LA PARTE DECIMAL, ANIADE .5 AL LA PARTE ENTERA } else{ h=altura0; //SI ES MENOR A 5 LA PARTE DECIMAL Y POSITIVO, SOLO TOMA LA PARTE ENTERA @@ -584,28 +555,26 @@ fscanf(dp,"%d",&ND); fclose(dp); ND=ND+1; - // creando la carpeta y guardando los datos iniciales en la carpeta de datos de prueba + // creando la carpeta y guardando los datos iniciales en la carpeta de datos de prueba FILE *dp1=fopen("/sd/carpetas/numero.txt","w"); if(dp1==NULL){printf("no se pudo acceder al sd 3..."); BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado NVIC_SystemReset();} fprintf(dp1,"%d",ND); fclose(dp1); - //GRBANDO LAS CONDICIONES INICIALES EN EL DOCUMENTO CI + //GRaBANDO LAS CONDICIONES INICIALES EN EL DOCUMENTO CI FILE *fp=fopen("/sd/condiciones/ci.txt","w"); if(fp==NULL){printf("no s epudo acceder al sd 4..."); BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado NVIC_SystemReset();} fprintf(fp,"%d %f %f \r\n", BR,BMPTemp,Pi); fclose(fp); - // creando la carpeta y guardando los datos iniciales en la carpeta condiciones iniciales dato[25]=ND+48; printf(dato,".txt"); printf("\n"); FILE *fobc=fopen(dato,"a"); for (i=0;i<100;i++) { - //FILE *fobc=fopen("/sd/condiciones/iniciales.txt","a"); fprintf(fobc,"%.2f \r\n",Pp[i]); wait(0.01); } @@ -615,12 +584,14 @@ file[16]=ND+48; //ajuste a ascii printf(file,".txt"); printf("\n"); FILE *pp=fopen(file,"w"); - if(pp==NULL){printf("no s epudo acceder al sd..5"); - BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado - NVIC_SystemReset();} + if(pp==NULL) + { + printf("no s epudo acceder al sd..5"); + BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado + NVIC_SystemReset(); + } fprintf(pp,"%f %f %f inicio\r\n",t.read(),BMPTemp,Pi); fclose(pp); - led=1; wait(1); } @@ -650,8 +621,7 @@ { FILE *pp=fopen(file,"a"); if (pp == NULL) {printf("no se inicion 5...");} - fprintf(pp,"%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\r\n",t.read(),imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sensor_adc[0],sensor_adc[1],sensor_adc[2],suv,h); - //fprintf(pp,"%f %f %f %f %f\r\n",t.read(),BMPTemp,P,h,altura1); //guarda en el sd + fprintf(pp,"%d %d %d %d %d %d %d %d %d %f %f %d %d %d %d %d %d %d\r\n",t.read(),imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sen_adc[0],sen_adc[1],sen_adc[2],suv,h); fclose(pp); return (2); } @@ -660,7 +630,6 @@ FILE *pp=fopen(file,"a"); if (pp == NULL) {printf("no se inicion 5...");} fprintf(pp,"%f %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \r\n",t.read(),trama[0],trama[1],trama[2],trama[3],trama[4],trama[5],trama[6],trama[7],trama[8], trama[9],trama[10],trama[11],trama[12],trama[13],trama[14],trama[15],trama[16],trama[17],trama[18], trama[19],trama[20],trama[21],trama[22],trama[23],trama[24],trama[25],trama[26],trama[27],trama[28], trama[29], trama[30]); - //fprintf(pp,"%f %f %f %f %f\r\n",t.read(),BMPTemp,P,h,altura1); //guarda en el sd fclose(pp); return (2); }