2017年度の製作を開始します。

Dependencies:   BufferedSoftSerial2 SDFileSystem-RTOS mbed mbed-rtos INA226_ver1

Fork of keiki2016ver5 by albatross

Files at this revision

API Documentation at this revision

Comitter:
tsumagari
Date:
Wed Jan 25 12:24:10 2017 +0000
Parent:
25:f48d651cdab9
Child:
27:d2955f29a3aa
Child:
29:2da9b8d03c0b
Child:
43:0d7d2e703523
Commit message:
??????????????

Changed in this revision

BufferedSoftSerial.lib Show annotated file Show diff for this revision Revisions of this file
Cadence.h Show annotated file Show diff for this revision Revisions of this file
MPU6050.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/BufferedSoftSerial.lib	Sat Jan 07 06:45:20 2017 +0000
+++ b/BufferedSoftSerial.lib	Wed Jan 25 12:24:10 2017 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/users/Sissors/code/BufferedSoftSerial/#671a6724ce79
+https://developer.mbed.org/users/tsumagari/code/BufferedSoftSerial/#050e2b137e78
--- a/Cadence.h	Sat Jan 07 06:45:20 2017 +0000
+++ b/Cadence.h	Wed Jan 25 12:24:10 2017 +0000
@@ -25,6 +25,7 @@
         voltage=0;
     }
     void readData(){ //Ticker で定期的に呼び出して値を更新
+      if(readable()){
         data_count = 0;
         data_num = 0;
         cadence = 0;
@@ -34,9 +35,12 @@
                 data_count++;
             }
         }while(data[data_count-1] != '\n');
-        
         strData = data;
-        if(strData.length() > DATAS_NUM-4 ){
+        if( int strlength = strData.length() > DATAS_NUM-4 ){
+//            for(int i = 0; i<4; i++){
+//                strC += data[data_count-6+i];
+//                strV += data[data_count-43+i];
+//            }
             switch (strData.length()){
                 case DATAS_NUM-3 :
                     strData.erase(0,2);
@@ -54,9 +58,10 @@
             strC = strData.substr(64,4);
             sscanf(strV.c_str(),"%lf",&voltage);
             sscanf(strC.c_str(),"%lf",&cadence);
-            //cadence /= 6.0;
-//            voltage *= 0.001;
+            cadence /= 6.0;
+            voltage *= 0.001;
         }
+      }
     }
 };
 #endif
\ No newline at end of file
--- a/MPU6050.h	Sat Jan 07 06:45:20 2017 +0000
+++ b/MPU6050.h	Wed Jan 25 12:24:10 2017 +0000
@@ -133,9 +133,6 @@
 #define MPU6050_ADDRESS 0x68<<1  // Device address when ADO = 0
 #endif
 
-//自分で定義したマクロ
-#define MPU_DELT_MIN 250
-
 // Set initial input parameters
 enum Ascale {
   AFS_2G = 0,
@@ -154,8 +151,6 @@
 // Specify sensor full scale
 int Gscale = GFS_250DPS;
 int Ascale = AFS_2G;
-float sum = 0;
-uint32_t sumCount = 0;
 
 //Set up I2C, (SDA,SCL)
 I2C i2c(p28,p27);
@@ -229,65 +224,6 @@
     }
 } 
  
- void MPUInit(Timer t){
-      i2c.frequency(400000);  // use fast (400 kHz) I2C
-    t.start();
-    uint8_t whoami = 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
-        wait(1);
-        MPU6050SelfTest(SelfTest); // Start by performing self test and reporting values
-        wait(1);
-        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) {
-            resetMPU6050(); // Reset registers to default in preparation for device calibration
-            calibrateMPU6050(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers
-            initMPU6050(); //pc.printf("MPU6050 initialized for active data mode....\n\r"); // Initialize device for active mode read of acclerometer, gyroscope, and temperature
-            wait(2);
-        } else {
-        }
-    } else {
-        //pc.printf("out\n\r"); // Loop forever if communication doesn't happen
-    }   
-     }
-     
-     void mpuProcessing(Timer t){
-    if(readByte(MPU6050_ADDRESS, INT_STATUS) & 0x01) {  // check if data ready interrupt
-        readAccelData(accelCount);  // Read the x/y/z adc values
-        getAres();
-        ax = (float)accelCount[0]*aRes - accelBias[0];  // get actual g value, this depends on scale being set
-        ay = (float)accelCount[1]*aRes - accelBias[1];
-        az = (float)accelCount[2]*aRes - accelBias[2];
-        readGyroData(gyroCount);  // Read the x/y/z adc values
-        getGres();
-        gx = (float)gyroCount[0]*gRes; // - gyroBias[0];  // get actual gyro value, this depends on scale being set
-        gy = (float)gyroCount[1]*gRes; // - gyroBias[1];
-        gz = (float)gyroCount[2]*gRes; // - gyroBias[2];
-        tempCount = readTempData();  // Read the x/y/z adc values
-        temperature = (tempCount) / 340. + 36.53; // Temperature in degrees Centigrade
-    }
-    Now = t.read_us();
-    deltat = (float)((Now - lastUpdate)/1000000.0f) ; // set integration time by time elapsed since last filter update
-    lastUpdate = Now;
-    sum += deltat;
-    sumCount++;
-    if(lastUpdate - firstUpdate > 10000000.0f) {
-        beta = 0.04;  // decrease filter gain after stabilized
-        zeta = 0.015; // increasey bias drift gain after stabilized
-    }
-    MadgwickQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f);
-    delt_t = t.read_ms() - count;
-    if (delt_t > MPU_DELT_MIN) {
-        yaw   = atan2(2.0f * (q[1] * q[2] + q[0] * q[3]), q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3]);
-        pitch = -asin(2.0f * (q[1] * q[3] - q[0] * q[2]));
-        roll  = atan2(2.0f * (q[0] * q[1] + q[2] * q[3]), q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3]);
-        pitch *= 180.0f / PI;
-        yaw   *= 180.0f / PI;
-        roll  *= 180.0f / PI;
-        myled= !myled;
-        count = t.read_ms();
-        sum = 0;
-        sumCount = 0;
-    }
-}
 
 void getGres() {
   switch (Gscale)
--- a/main.cpp	Sat Jan 07 06:45:20 2017 +0000
+++ b/main.cpp	Wed Jan 25 12:24:10 2017 +0000
@@ -10,44 +10,72 @@
 
 #define KX_VALUE_MIN 0.4
 #define KX_VALUE_MAX 0.8
-#define SOUDA_DATAS_NUM 12
-#define WRITE_DATAS_NUM 20
-#define MPU_LOOP_TIME 0.01
+#define SOUDA_DATAS_NUM 18
+#define YOKUTAN_DATAS_NUM 14
+#define WRITE_DATAS_NUM 18
 #define AIR_LOOP_TIME 0.01
 #define WRITE_DATAS_LOOP_TIME 1
 #define ROLL_R_MAX_DEG 2
 #define ROLL_L_MAX_DEG 2
-#define SD_WRITE_NUM 10
+#define SD_WRITE_NUM 20
 #define INIT_SERVO_PERIOD_MS 20
 
+#define MPU_LOOP_TIME 0.01
+#define MPU_DELT_MIN 250
+
+Mutex ssMutex;
+
+//-----------------------------------(resetInterrupt def)
+extern "C" void mbed_reset();
+InterruptIn resetPin(p26);
+Timer resetTimeCount;
+void resetInterrupt(){
+    while(resetPin){
+        resetTimeCount.start();
+        if(resetTimeCount.read()>3) mbed_reset();
+    }
+    resetTimeCount.reset();
+}
+//-------------------------------------------------------
+
+
 Cadence cadence(p13,p14);
-//Ticker cadenceTicker;
 
 RawSerial pc(USBTX,USBRX);
-RawSerial Android(p13,p14);
-BufferedSoftSerial twe(p9,p10);
+//RawSerial Android(p13,p14);
+BufferedSoftSerial twe(p11,p12);
+RawSerial Android(p9,p10);
 BufferedSoftSerial soudaSerial(p17,p18);
 //Ticker writeDatasTicker;
 Timer writeTimer;
 
-InterruptIn FusokukeiPin(p21);
+InterruptIn FusokukeiPin(p22);
 Ticker FusokukeiTicker;
 Fusokukei air;
 volatile int air_kaitensu= 0;
 
+float sum = 0;
+uint32_t sumCount = 0;
 MPU6050 mpu6050;
 Timer t;
-Ticker mpu6050Ticker;
+//
+//AnalogIn kx_X(p17);
+//AnalogIn kx_Y(p16);
+//AnalogIn kx_Z(p15);
+//float KX_X,KX_Y,KX_Z;
 
-AnalogIn kx_X(p17);
-AnalogIn kx_Y(p16);
-AnalogIn kx_Z(p15);
-float KX_X,KX_Y,KX_Z;
+
+//Timer sonarTimer;
+//InterruptIn sonarPin(p22);
+AnalogIn sonarPin(p15);
+//double sonarDistTime=0;
+double sonarV = 0.0, sonarDist = 0.0;
 
 DigitalOut RollAlarmR(p20);
 DigitalOut RollAlarmL(p19);
-DigitalOut led(LED1);
+//DigitalOut led(LED1);
 DigitalOut led2(LED2);
+DigitalOut led3(LED3);
 DigitalOut led4(LED4);
 
 SDFileSystem sd(p5, p6, p7, p8, "sd");
@@ -66,14 +94,20 @@
 void init();
 void FusokukeiInit();
 void SdInit();
+void MpuInit();
+//void SonarInit();
+void mpuProcessing();
+void DataReceiveFromSouda();
 void SDprintf(void const *argument);
-void DataReceiveFromSouda();
 void WriteDatas();
-float calcAttackAngle();
-float calcKXdeg(float x);
+//float calcAttackAngle();
+//float calcKXdeg(float x);
 
 void cadenceDataReceive(){
-//    cadence.readData();
+    while(1){
+        cadence.readData();
+        Thread::wait(0.01);
+    }
 }
 
 void air_countUp(){
@@ -85,15 +119,31 @@
     air_kaitensu = 0;
 }
 
+//void sonarInterruptStart(){
+//    sonarTimer.start();
+//    led3 = 1;
+//}
+//void sonarInterruptStop(){
+//    sonarTimer.stop();
+//    led3 = 0;
+//    sonarDistTime = sonarTimer.read_us();
+//    sonarTimer.reset();
+//}
+
 void init(){
-    twe.baud(19200);
+//--------------------------------------(resetInterrupt init)
+    resetPin.rise(resetInterrupt);
+    resetPin.mode(PullDown);
+//-----------------------------------------------------------
+    twe.baud(115200);
     Android.baud(9600);
     soudaSerial.baud(9600);
     kisokuServo.period_ms(INIT_SERVO_PERIOD_MS);
     geikakuServo.period_ms(INIT_SERVO_PERIOD_MS);
     FusokukeiInit();
-    mpu6050.MPUInit(t); 
-//    SdInit();//thread 内で
+//    MpuInit(); //mpuProcessing内で
+//    SonarInit();
+//    SdInit();//SDprintf 内で
 }
 
 void FusokukeiInit(){
@@ -115,14 +165,99 @@
     fclose(fp);
 //    Thread sd_thread(&SDprintf);
 }
+void MpuInit(){
+    i2c.frequency(400000);  // use fast (400 kHz) I2C
+    t.start();
+    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
+        Thread::wait(1);
+        mpu6050.MPU6050SelfTest(SelfTest); // Start by performing self test and reporting values
+        Thread::wait(1);
+        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) {
+            mpu6050.resetMPU6050(); // Reset registers to default in preparation for device calibration
+            mpu6050.calibrateMPU6050(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers
+            mpu6050.initMPU6050(); //pc.printf("MPU6050 initialized for active data mode....\n\r"); // Initialize device for active mode read of acclerometer, gyroscope, and temperature
+            Thread::wait(2);
+        } else {
+        }
+    } else {
+        pc.printf("MPU6050 not ready...\n\r");
+        //pc.printf("out\n\r"); // Loop forever if communication doesn't happen
+    }   
+}
 
-void DataReceiveFromSouda(){
-    led2 = !led2;
-    for(int i = 0; i < SOUDA_DATAS_NUM; i++){
-        if(soudaSerial.readable()) {
-            soudaDatas[i] = (char)soudaSerial.getc();
-            if(soudaDatas[i]==';') i=-1;
-        }else i--;
+//void SonarInit(){
+//    sonarPin.rise(&sonarInterruptStart);
+//    sonarPin.fall(&sonarInterruptStop);
+//}
+void sonarCalc(void const *argument){
+//    return sonarDistTime*0.018624 - 13.511;
+    while(1){
+        sonarV = 0;
+        for(int i =0; i<20; i++){
+            sonarV += sonarPin.read();
+            Thread::wait(0.01);
+        }
+        sonarDist = (sonarV/20)*2062.5;
+        Thread::wait(0.01);
+    }
+}
+
+void mpuProcessing(void const *argument){
+    MpuInit();
+    while(1){
+        Thread::wait(0.1);
+        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();
+            ax = (float)accelCount[0]*aRes - accelBias[0];  // get actual g value, this depends on scale being set
+            ay = (float)accelCount[1]*aRes - accelBias[1];
+            az = (float)accelCount[2]*aRes - accelBias[2];
+            mpu6050.readGyroData(gyroCount);  // Read the x/y/z adc values
+            mpu6050.getGres();
+            gx = (float)gyroCount[0]*gRes; // - gyroBias[0];  // get actual gyro value, this depends on scale being set
+            gy = (float)gyroCount[1]*gRes; // - gyroBias[1];
+            gz = (float)gyroCount[2]*gRes; // - gyroBias[2];
+            tempCount = mpu6050.readTempData();  // Read the x/y/z adc values
+            temperature = (tempCount) / 340. + 36.53; // Temperature in degrees Centigrade
+        }
+        Now = t.read_us();
+        deltat = (float)((Now - lastUpdate)/1000000.0f) ; // set integration time by time elapsed since last filter update
+        lastUpdate = Now;
+        sum += deltat;
+        sumCount++;
+        if(lastUpdate - firstUpdate > 10000000.0f) {
+            beta = 0.04;  // decrease filter gain after stabilized
+            zeta = 0.015; // increasey bias drift gain after stabilized
+        }
+        mpu6050.MadgwickQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f);
+        delt_t = t.read_ms() - count;
+        if (delt_t > MPU_DELT_MIN) {
+            yaw   = atan2(2.0f * (q[1] * q[2] + q[0] * q[3]), q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3]);
+            pitch = -asin(2.0f * (q[1] * q[3] - q[0] * q[2]));
+            roll  = atan2(2.0f * (q[0] * q[1] + q[2] * q[3]), q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3]);
+            pitch *= 180.0f / PI;
+            yaw   *= 180.0f / PI;
+            roll  *= 180.0f / PI;
+            myled= !myled;
+            count = t.read_ms();
+            sum = 0;
+            sumCount = 0;
+        }
+    }
+}
+
+void DataReceiveFromSouda(void const *argument){
+    while(1){
+        led2 = !led2;
+        for(int i = 0; i < SOUDA_DATAS_NUM; i++){
+            if(soudaSerial.readable()) {
+//                ssMutex.lock();
+                soudaDatas[i] = (char)soudaSerial.getc();
+//                ssMutex.unlock();
+                if(soudaDatas[i]==';') i=-1;
+            }else i--;
+        }
     }
 }
 
@@ -130,7 +265,7 @@
     SdInit();
     while(1){
         if(write_datas_index == SD_WRITE_NUM-1){
-            led4 = !led4;
+//            led4 = !led4;
             fp = fopen("/sd/mydir/sdtest.csv", "a");
             if(fp == NULL) {
                 error("Could not open file for write\n");
@@ -144,37 +279,45 @@
             fclose(fp);
             write_datas_index=0;
         }
-        Thread::wait(10);
+        Thread::wait(0.01);
     }
 }
 
 void WriteDatas(){
     int i;
-    for(i = 0; i < SOUDA_DATAS_NUM; i++){
-        //writeDatas[write_datas_index][i] = 0.0;    
-        writeDatas[write_datas_index][i] = (float)soudaDatas[i];
+    for(i = 0; i < 6; i++){ //翼端のmpu
+        if(!(i%2)){
+            writeDatas[write_datas_index][i] = (int)( (soudaDatas[i*2]<<8) + soudaDatas[(i+1)*2] );
+        }else{
+            writeDatas[write_datas_index][i] = (int)( (soudaDatas[i*2-1]<<8) + soudaDatas[i*2+1] );
+        }
+//        writeDatas[write_datas_index][i] = i;
     }
-//    writeDatas[write_datas_index][i++] = cadence.cadence;
-    writeDatas[write_datas_index][i++] = calcKXdeg(kx_X.read());
-    writeDatas[write_datas_index][i++] = calcKXdeg(kx_Y.read());
-    writeDatas[write_datas_index][i++] = calcKXdeg(kx_Z.read());
+    for(i = 6; i < 12; i++){//翼端のV,操舵
+        //writeDatas[write_datas_index][i] = 0.0;    
+        writeDatas[write_datas_index][i] = (float)soudaDatas[i+6];
+    }
+    writeDatas[write_datas_index][i++] = cadence.cadence;
+    writeDatas[write_datas_index][i++] = sonarDist;
     writeDatas[write_datas_index][i++] = pitch;
     writeDatas[write_datas_index][i++] = roll;
     writeDatas[write_datas_index][i++] = yaw;
     writeDatas[write_datas_index][i++] = airSpeed;
     //writeDatas[write_datas_index][i++] = writeTimer.read();
-    //for(i = 0; i < WRITE_DATAS_NUM; i++){
-//        pc.printf("%f   ", writeDatas[write_datas_index][i]);
+    for(i = 0; i < WRITE_DATAS_NUM; i++){
+        pc.printf("%f   ", writeDatas[write_datas_index][i]);
 //        twe.printf("%f,", writeDatas[write_datas_index][i]);
-//    }
-//    pc.printf("\n\r");
+    }
+    pc.printf("\n\r");
 //    twe.printf("\n\r");
     if(write_datas_index < SD_WRITE_NUM-1){
         write_datas_index++;
     } 
     for(int i = 0; i < SOUDA_DATAS_NUM; i++){
-        pc.printf("%i   ",soudaDatas[i]);
+//        pc.printf("%i   ",soudaDatas[i]);
+        ssMutex.lock();
         twe.printf("%i,",soudaDatas[i]);
+        ssMutex.unlock();
     }
 //    twe.printf("%f\n\r",cadence.cadence);
 //    pc.printf("%f\n\r",cadence.cadence);
@@ -183,12 +326,14 @@
 if(Android.writeable()){
     Android.printf("%f,%f,%f",airSpeed,roll,0);
 }
+    ssMutex.lock();
     twe.printf("%f,%f,%f,",pitch,roll,yaw);
-    twe.printf("%f,%f,%f,",calcKXdeg(kx_X.read()),calcKXdeg(KX_Y),calcKXdeg(KX_Z));   
+//    twe.printf("%f,%f,%f,",calcKXdeg(kx_X.read()),calcKXdeg(KX_Y),calcKXdeg(KX_Z));   
     twe.printf("%f,\r\n",airSpeed); 
-    pc.printf("%f,%f,%f\n\r",pitch,roll,yaw);
+    ssMutex.unlock();
+//    pc.printf("%f,%f,%f\n\r",pitch,roll,yaw);
     //pc.printf("%f,%f,%f\n\r",calcKXdeg(kx_X.read()),calcKXdeg(KX_Y),calcKXdeg(KX_Z));   
-    pc.printf("%f\n\r",airSpeed);
+//    pc.printf("%f\n\r",airSpeed);
     //SDprintf();
     pc.printf("%d\n\r",write_datas_index);
 }
@@ -196,14 +341,14 @@
 void WriteDatasF(){
     pc.printf("airSpeed:%f\n\r",airSpeed);
 }
+//
+//float calcKXdeg(float x){
+//    return -310.54*x+156.65;
+//}
 
-float calcKXdeg(float x){
-    return -310.54*x+156.65;
-}
-
-float calcAttackAngle(){
-    return pitch-calcKXdeg(kx_Z.read());
-}
+//float calcAttackAngle(){
+//    return pitch-calcKXdeg(kx_Z.read());
+//}
 
 void RollAlarm(){ 
     if((roll < 0) && (roll > ROLL_L_MAX_DEG-180)){
@@ -220,26 +365,21 @@
     }
 }
 
-void WriteServo(){
-    kisokuServo.pulsewidth(calcPulse(9*airSpeed));
-    if(pitch<0){
-        geikakuServo.pulsewidth(calcPulse(0));
-    }
-    else{
-        geikakuServo.pulsewidth(calcPulse(abs(pitch*90/13.0)));
-    }
-}
+
 
 int main(){
     Thread sd_thread(&SDprintf);//必ずmain内で
+    Thread sonar_thread(&sonarCalc);
+    Thread mpu_thread(&mpuProcessing);
+    Thread soudaSerial_thread(&DataReceiveFromSouda);
+    Thread cadence_thread(&cadenceDataReceive);
     init();
     while(1){
         pc.printf("test\n\r");
-        mpu6050.mpuProcessing(t);
+//        mpuProcessing();
         RollAlarm();
-        DataReceiveFromSouda();
+//        DataReceiveFromSouda();
 //        cadence.readData();
         WriteDatas();
-        WriteServo();
     }
 }
\ No newline at end of file
--- a/mbed.bld	Sat Jan 07 06:45:20 2017 +0000
+++ b/mbed.bld	Wed Jan 25 12:24:10 2017 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/99b5ccf27215
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/ad3be0349dc5
\ No newline at end of file