code to drive the motors to the right position

Dependencies:   HIDScope QEI mbed

Fork of BMT-K9_potmeter_fade by First Last

Revision:
6:d0f5da9962f5
Parent:
5:edac3771ede4
--- a/main.cpp	Thu Sep 24 09:51:21 2015 +0000
+++ b/main.cpp	Fri Sep 25 15:04:00 2015 +0000
@@ -1,64 +1,54 @@
-#include "mbed.h"
-#include "HIDScope.h"
-#include "QEI.h"
-// test if colaboration is working
-// myled is an object of class PwmOut. It uses the LED_RED pin
-// in human speech: myled is an output that can be controlled with PWM. LED_RED is the pin which is connected to the output
-PwmOut myled2(D5);
-PwmOut myled1(D6);
-
-DigitalOut motor1direction(D7);
-// pot is an object of class AnalogIn. It uses the PTB0 pin
-// in human speech: pot is an analog input. You can read the voltage on pin PTB0
-AnalogIn pot1(A0);
-AnalogIn pot2(A1);
-
-//HIDScope scope(1);
-Serial pc(USBTX, USBRX);
-QEI wheel (D12, D13, NC, 624);
-float lastpotread = 0;
-int countsPerRound = 32*131;
-float gototick;
-int currentpulses;
-int errorsignal;
-float Kf=0.2;
-//start 'main' function. Should be done once in every C(++) program
-int main()
-{
-    //setup some stuff
-    //period of PWM signal is 10kHz. Every 100 microsecond a new PWM period is started
-    myled1.period_ms(0.1);
-    myled2.period_ms(0.1);
-    myled1=0.5;
-    //motor1=1;
-    //while 1 is unequal to zero. For humans: loop forever
-    while(1) {
-        currentpulses=wheel.getPulses();
-        gototick = pot1.read()*countsPerRound;
-        errorsignal=gototick-currentpulses;
-        if (lastpotread != pot1.read()){
-            lastpotread=pot1.read();
-            pc.printf("potvalue: %f, position: %d, control speed: %f \n\r",gototick,currentpulses,errorsignal*Kf);
-        }
-        
-        if (errorsignal > 0)
-        {
-            motor1direction=0; 
-            myled1=errorsignal*Kf;
-            
-        }
-        else
-        {
-            motor1direction=1;
-            myled1=-errorsignal*Kf;
-        }
-        
-        
-        //myled1.write(pot1.read());
-        //myled2.write(pot2.read());
-        //wait some time to give the LED output a few PWM cycles. Otherwise a new value is written before the previously set PWM period (of 100microseconds) is finished
-        //This loop executes at roughly 100Hz (1/0.01s)
-        wait(0.01);
-    }
-}
-
+// main
+#include "mbed.h"
+#include <stdio.h>
+#include <math.h>
+#include "QEI.h"
+#include "Point.cpp"
+
+Serial pc(USBTX, USBRX);
+AnalogIn pot1(A0); // sets requested Vx
+AnalogIn pot2(A1); // sets requested Vy
+QEI encMotor1 (D12, D13, NC, 624);
+QEI encMotor2 (D10, D11, NC, 624);
+float round=4200;
+float angle1;
+float angle2;
+Point pCurrent;
+Point pTo;
+float toX;
+float toY;
+float deltaAngle1;
+float deltaAngle2;
+float v1;
+float v2;
+float timestep=1;
+int main()
+{
+    while(true){
+        // first get the current position from the motor encoders
+        angle1=encMotor1.getPulses()/round*360;
+        angle2=encMotor2.getPulses()/round*360;
+        pCurrent.fromRotational(angle1,angle2);
+        
+        
+        // calculate the position to go to according the the current position + the distance that should be covered in this timestep
+        toX=pCurrent.posX+pot1.read()*timestep;
+        toY=pCurrent.posY+pot2.read()*timestep;
+        
+        pTo.fromCarthesian(toX, toY);
+        
+        // calculate how much the angles should change in this timestep
+        deltaAngle1=pTo.rotA-pCurrent.rotA;
+        deltaAngle2=pTo.rotB-pCurrent.rotB;
+        
+        // calculate the neccesairy velocities to make these angles happen.
+        v1=deltaAngle1/timestep;
+        v2=deltaAngle2/timestep;
+        
+        // output to the user
+        pc.printf("now: angle1: %f, angle2: %f, x: %f, y: %f \n\r",pCurrent.rotA,pCurrent.rotB,pCurrent.posX,pCurrent.posY);
+        pc.printf("to:  angle1: %f, angle2: %f, x: %f, y: %f \n\r",pTo.rotA,pTo.rotB,pTo.posX,pTo.posY);
+        pc.printf("v1: %f, v2: %f \n\r",v1,v2);
+        wait(timestep);
+    }
+}