control the x position of the elbows with buttons

Dependencies:   HIDScope QEI mbed

Files at this revision

API Documentation at this revision

Comitter:
Gerth
Date:
Wed Sep 30 15:14:28 2015 +0000
Commit message:
working, now directly changes the desired angle with the buttons.; next step is to adjust te desired position and calculate the angle;

Changed in this revision

HIDScope.lib Show annotated file Show diff for this revision Revisions of this file
QEI.lib 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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HIDScope.lib	Wed Sep 30 15:14:28 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/tomlankhorst/code/HIDScope/#5020a2c0934b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QEI.lib	Wed Sep 30 15:14:28 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/aberk/code/QEI/#5c2ad81551aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Sep 30 15:14:28 2015 +0000
@@ -0,0 +1,141 @@
+#include "mbed.h"
+#include "QEI.h"
+#include "HIDScope.h"
+
+//////////////////////////////////////CONSTANTS, I/O, FREQUENCIES AND TICKERS//////////////////////////////////////
+//info uit
+HIDScope scope(3);
+
+//encoders
+QEI encoder1 (D12,D13,NC,32); // first b then a for clockwise +
+
+//ingangen
+DigitalIn butR(D2);
+DigitalIn butL(D3);
+
+//uitgangen
+DigitalOut motor1_direction(D7);// draairichting motor 1 (1 is CW encoder als je daar op kijkt en CW shaft als je daar op kijkt)
+PwmOut motor1_speed_control(D6);//aanstuursnelheid motor 1
+//PwmOut motor2_speed_control(D5);
+//DigitalOut motor2_direction(D4);
+const int CW=1; //clockwise
+const int CCW=0; //counterclockwise
+
+//frequencies
+const double hidscope_frequency=100;//frequentie waarop data naar HIDScope wordt gestuurd
+const double pi_control_frequency=25;//frequentie waarop er een control actie wordt uitgevoerd. kan hoger, voorzichtig bij ruis!
+const double read_but_frequency=25;
+
+//tickers
+Ticker hidscope_ticker;
+Ticker pi_control_ticker;
+Ticker read_but_ticker;
+
+//constants
+const int cpr=32*131;
+const float PI=3.1415;
+const float counttorad=((2*PI)/cpr);
+const float counttodeg=(360/cpr);
+const float mmpersecbut=(10/(read_but_frequency));
+const float radpersecbut=(PI/read_but_frequency);
+const float armlength=400;//length "upper arm" in mm
+
+///////////////////////////////////////////////////CONTROLLER CONSTANTS////////////////////////////////
+
+//DEZE WAARDES ZIJN ZOMAAR RANDOM WAARDES!!!!
+float pi_kp=0.5;
+float pi_ki=0.01;
+float Ts=1.0/pi_control_frequency;
+double motor1_error_int=0;
+double desiredangle=0;
+double desiredposition=0;
+////////////////////////////////////////////GO FLAGS AND ACTIVATION FUNCTIONS//////////////////////////////////
+//go flags
+volatile bool scopedata_go=false, pi_control_go=false,read_but_go=false;
+
+//acvitator functions
+
+void scopedata_activate()
+{
+    scopedata_go=true;
+}
+void pi_control_activate()
+{
+    pi_control_go=true;
+}
+void read_but_activate(){read_but_go=true;}
+///////////////////////////////////////////////////////FUNCTIONS//////////////////////////////////////////////////////////////////////////
+
+//scopedata
+void scopedata()
+{
+    scope.set(0,desiredangle);//gewenste hoek van arm
+    scope.set(1,counttodeg*encoder1.getPulses());//hoek in rad van outputshaft
+    scope.set(2,motor1_speed_control.read());//pwm signaal naar motor toe
+    scope.send();
+}
+//////////////////////////////////////////////////////////CONTROLLER///////////////////////////////////////
+
+// Reusable PI controller
+double pi_control( double e, double& motor1_error_int)
+{
+    motor1_error_int = motor1_error_int + Ts * e; // e_int is changed globally because it’s ’by reference’ (&)
+    return pi_kp*e+pi_ki*motor1_error_int;
+}
+
+//////////////////////////////////////////////////MAIN///////////////////////////////////
+int main()
+{
+    //set initial shizzle
+    motor1_speed_control.write(0);
+
+    //tickers
+    hidscope_ticker.attach(&scopedata_activate,1.0/hidscope_frequency);
+    pi_control_ticker.attach(&pi_control_activate,1.0/pi_control_frequency);
+    read_but_ticker.attach(&read_but_activate,1.0/read_but_frequency);
+
+    while(1) {
+        //control motor 1 with a pi controller
+
+        if (read_but_go==true) {
+            float buttonR=butR.read(), buttonL=butL.read();
+            if (buttonR==0 && buttonL ==1) {
+                desiredposition += (radpersecbut);
+                read_but_go=false;
+            }
+            if (buttonR==1 && buttonL==0) {
+                desiredposition -= (radpersecbut);
+                read_but_go=false;
+            } else {
+                desiredposition=desiredposition;
+            }
+            desiredangle=desiredposition;
+            read_but_go=false;
+        }
+        
+        if (pi_control_go==true) {
+            double error=desiredangle-(counttorad*encoder1.getPulses());
+            double signal_motor1=pi_control(error,motor1_error_int);//send error to p controller
+            if (signal_motor1>=0) {//determine CW or CCW rotation
+                motor1_direction.write(CW);
+            } else {
+                motor1_direction.write(CCW);
+            }
+
+            if (fabs(signal_motor1)>=1) { //check if signal is <1
+                signal_motor1=1;//if signal >1 make it 1 to not damage motor
+            } else {
+                signal_motor1=fabs(signal_motor1);// if signal<1 use signal
+            }
+
+            motor1_speed_control.write(fabs(signal_motor1));//write signal to motor
+            pi_control_go=false;
+        }
+        //call scopedata
+        if (scopedata_go==true) {
+            scopedata();
+            scopedata_go=false;
+        }
+    }
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Sep 30 15:14:28 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/4f6c30876dfa
\ No newline at end of file