-
Dependencies: mbed MPU6050 mbed-rtos SpiFlash25 HMC5883L BMP085 flash-fs ledControl2
main.cpp
- Committer:
- aguscahya
- Date:
- 2021-04-22
- Revision:
- 2:e023e162e559
- Parent:
- 1:42e428d934fe
File content as of revision 2:e023e162e559:
#include "mbed.h" #include "rtos.h" #include "stdio.h" #include "MPU6050.h" #include "HMC5883L.h" #include "BMP085.h" #include "ledControl.h" #include "mbed.h" #include "SpiFlash25.h" #include "spiffs.h" #include <string> I2C i2c(D14,D15); // setup i2c (SDA,SCL) BMP085 alt_sensor(i2c); //Serial pc(USBTX,USBRX); Serial pc(PB_10, PB_11); //Serial pc(PC_10, PC_11); MPU6050 mpu6050; // class: MPU6050, object: mpu6050 HMC5883L hmc5883l; Timer t; Thread *t1, *t2, *t3, *t4, *t5, *t6; Ticker toggler1; Ticker filter; AnalogIn Battery(PA_0); void toggle_led1(); void toggle_led2(); void compFilter(); char responatt; float pitchAngle = 0; float rollAngle = 0; double Heading; float pitchAcc, rollAcc, pitch, roll; float magData[3],mx,my,mz,alti; int temperatur,press; int waktu = 0; int packet= 0; bool start; float a, Vcc, R1=10000, R2=1500; // this value represents the number of files you can have open at the same time // adjust it according to your requirements void thread1(void const *args) { mpu6050.whoAmI(); // Communication test: WHO_AM_I register reading wait(1); mpu6050.calibrate(accelBias,gyroBias); // Calibrate MPU6050 and load biases into bias registers pc.printf("Calibration is completed. \r\n"); mpu6050.init(); // Initialize the sensor wait(1); pc.printf("MPU6050 is initialized for operation.. \r\n\r\n"); mpu6050.getAres(); while(true) { // thread loop mpu6050.readAccelData(accelData); mpu6050.getAres(); ax = accelData[0]*aRes - accelBias[0]; ay = accelData[1]*aRes - accelBias[1]; az = accelData[2]*aRes - accelBias[2]; mpu6050.readGyroData(gyroData); mpu6050.getGres(); gx = gyroData[0]*gRes; // - gyroBias[0]; // Results are better without extracting gyroBias[i] gy = gyroData[1]*gRes; // - gyroBias[1]; gz = gyroData[2]*gRes; // - gyroBias[2]; //float pitchAcc, rollAcc, pitch, roll; /* Integrate the gyro data(deg/s) over time to get angle */ pitch += gx * dt; // Angle around the X-axis roll -= gy * dt; // Angle around the Y-axis /* Turning around the X-axis results in a vector on the Y-axis whereas turning around the Y-axis results in a vector on the X-axis. */ pitchAcc = atan2f(accelData[1], accelData[2])*180/PI; rollAcc = atan2f(accelData[0], accelData[2])*180/PI; /* Apply Complementary Filter */ pitch = pitch * 0.98 + pitchAcc * 0.02; roll = roll * 0.98 + rollAcc * 0.02; /*if(pitchAcc > 0){ pc.printf("pitch up, ");} else { pc.printf("pitch down, ");} if(rollAcc > 0){ pc.printf("roll kanan, ");} else {pc.printf("roll kiri, ");}*/ //pc.printf("roll=%.3f pitch=%.3f \r\n",rollAcc,pitchAcc); //pc.printf("| mag Data | mx=%.3f | my=%.3f | mz=%.3f \r\n",mx,my,mz); /*pc.printf(" _______________\r\n"); pc.printf("| Heading: %.1f \r\n", Heading); pc.printf("|_______________\r\n\r\n"); pc.printf("Temperature: %d\r\n", alt_sensor.get_temperature()); pc.printf("Pressure: %d\r\n", alt_sensor.get_pressure()); pc.printf("Altitude: %f\r\n", alt_sensor.get_altitude_m()); */ //pc.printf("%.1f , %.1f, %.1f, %.3f, %.3f, %.3f, %d, %d, %f \n",rollAcc,pitchAcc,Heading,mx,my,mz,alt_sensor.get_temperature()-2,alt_sensor.get_pressure(),alt_sensor.get_altitude_m()); //wait(1); } } void thread2(void const *args) { hmc5883l.init(); wait(2); while(true) { // thread loop Heading = hmc5883l.getHeading(); //float magData[3],mx,my,mz; hmc5883l.readMagData(magData); mx = magData[0]; my = magData[1]; mz = magData[2]; //wait(1); } } void thread3(void const *args) { alt_sensor.init(); wait(2); while(true) { // thread loop temperatur = alt_sensor.get_temperature()-4; press = alt_sensor.get_pressure(); alti = alt_sensor.get_altitude_m(); //wait(1); } } void thread4(void const *args) { //t.start(); while(true) { // thread loop pc.printf("%.1f, %.1f, %.1f, %.1f, %.3f, %.3f, %.3f, %d, %d, %.1f \n" ,Vcc,rollAcc,pitchAcc,Heading,mx,my,mz,temperatur,press,alti); //pc.printf("6800,%d,%d,0,%d,%d,5 V,0,0,0,%.1f,%.1f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f\n",waktu++,packet++,alt_sensor.get_pressure(),temperatur,alt_sensor.get_altitude_m(),Heading,mx,my,mz,gx,gy,gz); //wait(1); } } void thread5(void const *args) { //t.start(); while(true) { // thread loop a=Battery.read(); Vcc = (a*3.3*(R1+R2)/R2)-1.75; //wait(1); } } /*id thread6(void const *args) { //t.start(); while(true) { // thread loop if(pitchAcc > 0 && rollAcc > 0){ responatt = 'pitch naik, roll kanan'; } else if( pitchAcc < 0 && rollAcc < 0){ responatt = 'pitch turun, roll kiri'; } else if( pitchAcc < 0 && rollAcc > 0){ responatt = 'pitch turun, roll kanan'; } else if( pitchAcc > 0 && rollAcc < 0){ responatt = 'pitch naik, roll kiri'; } else if( pitchAcc == 0 && rollAcc == 0){ responatt = 'steady'; } } }*/ int main() { pc.baud(57600); // baud rate: 9600 t1 = new Thread(thread1); t2 = new Thread(thread2); t3 = new Thread(thread3); t5 = new Thread(thread5); //t6 = new Thread(thread6); wait(2); t4 = new Thread(thread4); t.start(); while(1){ if(t.read()>20) { t.stop(); t.reset(); pc.printf("OBDH SCHEDULE RESTART (Watchdog Timer)\n"); t4->terminate(); delete t4; pc.printf("restarted\n"); wait(5); t4=new Thread(thread4); t.start(); } } } void toggle_led1() {ledToggle(1);} void toggle_led2() {ledToggle(2);}