My modifications/additions to the code

Dependencies:   ADXL345 ADXL345_I2C IMUfilter ITG3200 Servo fishgait mbed-rtos mbed pixy_cam

Fork of robotic_fish_ver_4_8 by jetfishteam

Files at this revision

API Documentation at this revision

Comitter:
sandwich
Date:
Fri Jun 06 19:48:01 2014 +0000
Parent:
23:ef1be367726e
Child:
25:4f2f441eceec
Commit message:
works again; pixy and controller are on different tickers; thread polls duty cycle and writes it

Changed in this revision

MainController.cpp Show annotated file Show diff for this revision Revisions of this file
MainController.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
pixy_cam.lib Show annotated file Show diff for this revision Revisions of this file
--- a/MainController.cpp	Thu Jun 05 17:32:51 2014 +0000
+++ b/MainController.cpp	Fri Jun 06 19:48:01 2014 +0000
@@ -2,7 +2,7 @@
 
 MainController::MainController()
     :ch1(p18,0.047,0.081), // yaw
-     ch2(p17,0.047,0.081), // pitch
+     ch2(p17,0.047,0.09), // pitch
      ch3(p15,0.047,0.081), // amplitude
      ch4(p30,0.047,0.081), // adj
      ch6(p16,0.047,0.081), // frequency
@@ -10,10 +10,11 @@
      syren(p9,p10), //syren is 38400bps serial
      //ap(p25, p26)//,
      leftservo(p21),
-     rightservo(p23),
+     rightservo(p24),
      pcam(p11,p12,p13,10),
-     controlThread(&MainController::controlThreadStarter, this, osPriorityRealtime, 1024),
-     trackerThread(&MainController::trackerThreadStarter, this, osPriorityHigh, 1024)
+     //controlThread(&MainController::controlThreadStarter, this, osPriorityNormal, 1024),
+     dutyThread(&MainController::dutyThreadStarter, this, osPriorityNormal, 1024)
+     //controlTimer(&MainController::control, osTimerPeriodic, (void*) 0)
 {
     wait_ms(50);
     amp = 0.0;
@@ -36,6 +37,7 @@
     pitAvg = 0.0;
     alPi = 0.2/(0.2+0.001);//tf/(tf+Ts);
     syren.baud(38400);
+    dutyCycle=127;
     //pcam=new pixySPI(p11,p12,p13,10);
 
     //leftservo.calibrate(0.0008, 45);
@@ -48,141 +50,156 @@
     //delete pcam;
 }
 
-void MainController::controlThreadStarter(void const *p)
+
+void MainController::dutyThreadStarter(void const* p)
 {
     MainController *instance = (MainController*)p;
-    instance->control();
+    instance->updateDutyCycle();
 }
 
+/*
 void MainController::trackerThreadStarter(void const *p)
 {
     MainController *instance = (MainController*)p;
     instance->trackTarget();
 }
+*/
 
+void MainController::updateDutyCycle()
+{
+    dutyThread.signal_wait(START_THREAD);
+    while (1) {
+        dutyMutex.lock();
+        syren.putc(int(dutyCycle));
+        dutyMutex.unlock();
+    }
+}
 void MainController::control()
 {
-    controlThread.signal_wait(START_THREAD);
-    while (1) {
-        trackMutex.lock();
-        curTime = timer1.read();
-        //Block bestObject=pcam.getBlocks()[0]; //our best bet is the first block because it has the biggest area
+    //controlThread.signal_wait(START_THREAD);
+    //while (1) {
+    //trackMutex.lock();
+    curTime = timer1.read();
+    //Block bestObject=pcam.getBlocks()[0]; //our best bet is the first block because it has the biggest area
+    bool autonomous=getOpMode();
 
-        // check every half cycle
-        if(curTime > 1/(2*frqCmd) ) {
-            // read new yaw value every half cycle
-            if (ch5.dutycyclescaledup()<=0.5) {
-                yaw = this->calculateYaw(); // a value from -1 to 1
-                if(yaw < 0.1 && yaw > -0.1)
-                    yaw =0.0;
+    // check every half cycle
+    if(curTime > 1/(2*frqCmd) ) {
+        // read new yaw value every half cycle
+        if (autonomous==false) {
+            yaw = this->calculateYaw(); // a value from -1 to 1
+            if(yaw < 0.1 && yaw > -0.1)
+                yaw =0.0;
+        } else {
+            //do proportional control on fish yaw
+            float gain=(1/(1+ampCmd))*frqCmd*(1/float(CENTER_X));
+            //trackMutex.lock();
+            float error=pcam.getBestX()-CENTER_X; //calculate yaw difference
+            //trackMutex.unlock();
+            yaw=error*gain+0.5f;
+            //printf("x: %d, ", pcam.getBestX());
+        }
+
+
+        // Read volume and frequency only every full cycle
+        if( fullCycle ) {
+            //read other new inputs
+            amp = this->calculateAmplitude(); // a value from 0 to 1
+            frq = this->calculateFrequency(); // a value from frqmin to frqmax
+
+            if(yaw < 0.0) {
+                ampCmd = (1.0+ yawAdjVal * yaw)*amp;
             } else {
-                //do proportional control on fish yaw
-                float gain=(1/(1+ampCmd))*frqCmd*(1/float(CENTER_X));
-                float error=pcam.getBestX()-CENTER_X; //calculate yaw difference
-                yaw=error*gain+0.5f;
-                //printf("x: %d, ", pcam.getBestX());
+                ampCmd = amp;
             }
 
-
-            // Read volume and frequency only every full cycle
-            if( fullCycle ) {
-                //read other new inputs
-                amp = this->calculateAmplitude(); // a value from 0 to 1
-                frq = this->calculateFrequency(); // a value from frqmin to frqmax
+            fullCycle = false;
 
-                if(yaw < 0.0) {
-                    ampCmd = (1.0+ yawAdjVal * yaw)*amp;
-                } else {
-                    ampCmd = amp;
-                }
-
-                fullCycle = false;
-
-            } else {
-                // reverse for the downward slope
-                amp = -amp;
+        } else {
+            // reverse for the downward slope
+            amp = -amp;
 
 
 
-                if(yaw > 0.0) {
-                    ampCmd = (1.0- yawAdjVal *yaw)*amp;
-                } else {
-                    ampCmd = amp;
-                }
-
-                // use amp and frq from last cycle in order to make sure it is equalized
-                fullCycle = true;
+            if(yaw > 0.0) {
+                ampCmd = (1.0- yawAdjVal *yaw)*amp;
+            } else {
+                ampCmd = amp;
             }
 
-            // update the frequency that actually needs to be commanded
-            frqCmd = frq;
+            // use amp and frq from last cycle in order to make sure it is equalized
+            fullCycle = true;
+        }
 
-            // read new yaw value every half cycle
-            adj = this->calculateAdj(); // a value from 0 to 1
+        // update the frequency that actually needs to be commanded
+        frqCmd = frq;
+
+        // read new yaw value every half cycle
+        adj = this->calculateAdj(); // a value from 0 to 1
 
 
-            // adj value used to define the trapezoid shape
-            raiser = ( 5 * 0.7 + 1.0); // varied from 1 to 5 for now hard coded
+        // adj value used to define the trapezoid shape
+        raiser = ( 5 * 0.7 + 1.0); // varied from 1 to 5 for now hard coded
 
-            //reset timer
-            timer1.reset();
-            curTime = 0.0;
-        }
+        //reset timer
+        timer1.reset();
+        curTime = 0.0;
+    }
 
 
-        //Set Servo Values
-        if (ch5.dutycyclescaledup()<=0.5)
-            pitch = this->calculatePitch();
-        else {
-            //do a proportional control on the error since servos already give you position control
-            float gain=(1/(1+abs(ampCmd)))*(1/frqCmd)*(1/float(CENTER_Y))*adj; //try this out for now
-            //float gain=(1/float(CENTER_Y))*adj;
-            float error=pcam.getBestY()-CENTER_Y;
-            pitch=error*gain+0.5;
-            //printf("error: %f\n", error);
-            //printf("y: %d\n", pcam.getBestY());
-            //printf("pitch: %f\n", pitch);
-        }
+    //Set Servo Values
+    if (autonomous==false)
+        pitch = this->calculatePitch();
+    else {
+        //do a proportional control on the error since servos already give you position control
+        float gain=(1/(1+abs(ampCmd)))*(1/frqCmd)*(1/float(CENTER_Y))*adj; //try this out for now
+        //float gain=(1/float(CENTER_Y))*adj;
+        float error=pcam.getBestY()-CENTER_Y;
+        pitch=error*gain+0.5;
+        //printf("error: %f\n", error);
+        //printf("y: %d\n", pcam.getBestY());
+        //printf("pitch: %f\n", pitch);
+    }
 
-        //Adjusting the trim of the pitch angles
-        leftservo = pitch+0.03;
-        if (leftservo > 1.0) {
-            leftservo = 1.0;
-        }
-        rightservo = 1.0 - pitch;
-        if (rightservo < 0.03) {
-            rightservo = 0.03;
-        }
+    //Adjusting the trim of the pitch angles
+    leftservo = pitch+0.03;
+    if (leftservo > 1.0) {
+        leftservo = 1.0;
+    }
+    rightservo = 1.0 - pitch;
+    if (rightservo < 0.03) {
+        rightservo = 0.03;
+    }
 
 
-        dutyCycle = ampCmd * saturate(raiser * sin( 2.0 * MATH_PI * frqCmd * curTime )); // add factor 4.0 to get a cut off sinus
-        //printf("dc: %f\n", dutyCycle);
+    dutyMutex.lock();
+    dutyCycle = ampCmd * saturate(raiser * sin( 2.0 * MATH_PI * frqCmd * curTime )); // add factor 4.0 to get a cut off sinus
+    //printf("dc: %f\n", dutyCycle);
+
+    //now scale duty cycle from -1 to 1 -> 0 to 255
+
 
-        //now scale duty cycle from -1 to 1 -> 0 to 255
-        dutyCycle=(255/2)*dutyCycle+127;
-        if (dutyCycle<0)
-            dutyCycle=0.0;
-        else if (dutyCycle>255)
-            dutyCycle=255.0;
+    dutyCycle=(255/2)*dutyCycle+127;
+    if (dutyCycle<0)
+        dutyCycle=0.0;
+    else if (dutyCycle>255)
+        dutyCycle=255.0;
+    dutyMutex.unlock();
 
-        //mcon.setpolarspeed(dutyCycle);
-        //dutyCycle=100;
-        syren.putc(int(dutyCycle));
-        //syren.putc(int(0));
-        trackMutex.unlock();
-        Thread::wait(1);
-    }
+    //mcon.pulsewidth_ms(dutyCycle);
+    //dutyCycle=100;
+    //syren.putc(int(dutyCycle));
+    //syren.putc(int(0));
+    //trackMutex.unlock();
+    //Thread::wait(1);
+    //wait_ms(1);
+    // }
 }
 
 void MainController::trackTarget()
 {
-    trackerThread.signal_wait(START_THREAD);
-    while (1) {
-        //trackMutex.lock();
-        //printf("tracking\n");
+    if (getOpMode()==true)
         pcam.capture();
-        //trackMutex.unlock();
-    }
 }
 
 float MainController::calculateFrequency()
@@ -215,16 +232,26 @@
 {
     timer1.start();
 
-    printf("start thread\n");
-    controlThread.signal_set(START_THREAD);
-    trackerThread.signal_set(START_THREAD);
-    //ticker1.attach(this, &MainController::control,0.001);
+    printf("start ticker\n");
+    ticker1.attach(this, &MainController::control,0.001);
+    dutyThread.signal_set(START_THREAD);
+    //trackerThread.signal_set(START_THREAD);
+    //controlTimer.start(2);
     //control=Thread(&MainController::control);
-    //tracker.attach(this, &MainController::trackTarget, 2.00); //update target position every second
+     tracker.attach(this, &MainController::trackTarget, 0.1); //update target position
     //Autopilot guardian
     //ap.calibrate();
     //ap.set2D();
     //ap.setoff();
+    //RtosTimer controlTimer((void*)(&control), osTimerPeriodic, (void *)0);
+    //controlTimer.start(5);
+    //while(true) {
+    //printf("control: %d, frq: %.3f, vol: %.2f, amp: %.3f, yaw: %.2f, dut: %.2f, pit: %.2f, adj: %.2f, t: %.2f\n",
+    //          mainCtrl.getOpMode(), mainCtrl.getFrequency(), mainCtrl.getVolume(), mainCtrl.getAmplitude(), mainCtrl.getYaw(), mainCtrl.getDutyCycle(), mainCtrl.getPitch(), mainCtrl.getAdj(), t.read());
+
+    //Thread::wait(100);
+    //wait_ms(100);
+
 
 }
 
--- a/MainController.h	Thu Jun 05 17:32:51 2014 +0000
+++ b/MainController.h	Fri Jun 06 19:48:01 2014 +0000
@@ -68,7 +68,6 @@
     PwmIn ch4;
     PwmIn ch6;
     PwmIn ch5;
-    //PololuMController mcon;
     Serial syren; //syren replaced the pololu controller
     //Guardian ap;
     Servo leftservo;
@@ -77,13 +76,15 @@
     pixySPI pcam;
     
     Timer timer1;
-    //Ticker ticker1;
-    //Ticker tracker;
-    Mutex trackMutex;
-    Thread controlThread;
-    static void controlThreadStarter(void const *p);
-    Thread trackerThread;
-    static void trackerThreadStarter(void const *p);
+    Ticker ticker1;
+    //RtosTimer controlTimer;
+    Ticker tracker;
+    Mutex dutyMutex;
+    Thread dutyThread;
+    static void dutyThreadStarter(void const* p);
+    void updateDutyCycle();
+    //Thread trackerThread;
+    //static void trackerThreadStarter(void const *p);
     float amp;
     float ampCmd;
     float frq;
--- a/main.cpp	Thu Jun 05 17:32:51 2014 +0000
+++ b/main.cpp	Fri Jun 06 19:48:01 2014 +0000
@@ -1,26 +1,31 @@
 #include "mbed.h"
+//#include "rtos.h"
 #include "Servo.h"
 //#include "rtos.h"
 //#include "PwmReader.h"
 //#include "PwmIn.h"
 #include "MainController.h"
 Serial pc(USBTX, USBRX);
+//Serial syren(p9,p10); //syren replaced the pololu controller
 Timer t;
 
 int main()
 {
+    //syren.baud(38400);
     t.start();
 
     MainController mainCtrl;
 
     mainCtrl.start();
 
-    //printf("started\n");
+    printf("started\n");
     while(true) {
         pc.printf("control: %d, frq: %.3f, vol: %.2f, amp: %.3f, yaw: %.2f, dut: %.2f, pit: %.2f, adj: %.2f, t: %.2f\n",
                   mainCtrl.getOpMode(), mainCtrl.getFrequency(), mainCtrl.getVolume(), mainCtrl.getAmplitude(), mainCtrl.getYaw(), mainCtrl.getDutyCycle(), mainCtrl.getPitch(), mainCtrl.getAdj(), t.read());
 
-        //wait_ms(100);
+        //syren.putc(int(mainCtrl.getDutyCycle()));
+        //Thread::wait(100);
+        wait_ms(100);
     }
     //t.stop();
     //mainCtrl.stop();
--- a/pixy_cam.lib	Thu Jun 05 17:32:51 2014 +0000
+++ b/pixy_cam.lib	Fri Jun 06 19:48:01 2014 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/teams/jetfishteam/code/pixy_cam/#4bf8d39fc5ce
+http://mbed.org/teams/jetfishteam/code/pixy_cam/#a915c5eff55a