Code

Dependencies:   mbed QEI MPU6050 TextLCD

Files at this revision

API Documentation at this revision

Comitter:
belsarekaiwalya
Date:
Wed Mar 11 10:02:43 2020 +0000
Parent:
4:b084af72f9a6
Commit message:
h

Changed in this revision

MPU6050.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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPU6050.lib	Wed Mar 11 10:02:43 2020 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/garfieldsg/code/MPU6050/#1e0baaf91e96
--- a/QEI.lib	Wed Mar 22 07:15:20 2017 +0000
+++ b/QEI.lib	Wed Mar 11 10:02:43 2020 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/aberk/code/QEI/#5c2ad81551aa
+http://mbed.org/users/electromotivated/code/QEI/#50aae578cb89
--- a/main.cpp	Wed Mar 22 07:15:20 2017 +0000
+++ b/main.cpp	Wed Mar 11 10:02:43 2020 +0000
@@ -1,27 +1,63 @@
 #include "mbed.h"
 #include "TextLCD.h"
+#include "QEI.h"
+
+#define ppr 1120
+#define diam 11.0
+#define circum (3.14*diam)
+#define width 23.0
+#define motRPM 150
+
 TextLCD lcd(PA_0,PA_1,PA_4,PB_0,PC_1,PC_0); // rs, e, d4-d7
+QEI leftEnc(PB_8,PB_9);
+QEI rightEnc(PA_6,PA_5);
+
 Serial serial(USBTX, USBRX);
-Serial bt(PC_6,PC_7);//tx,rx
-DigitalOut dirRa(PB_3);
-DigitalOut dirRb(PB_5);
+//Serial hmcRead(PC_10,PC_11);//tx rx
+Serial bt(PA_9,PA_10);//tx,rx
+Serial xbee1(PC_10,PC_11);
+
 DigitalOut dirLa(PB_4);
 DigitalOut dirLb(PB_10);
-PwmOut pwmL(PA_8);//left
-PwmOut pwmR(PA_9);//right 
+PwmOut pwmR(PA_8);//left
 
+DigitalOut dirRa(PB_5);
+DigitalOut dirRb(PB_3);
+PwmOut pwmL(PC_7);//right
+Ticker TISR;
+Ticker Print;
+
+DigitalOut rolA(PA_13);
+DigitalOut rolB(PA_14);
+PwmOut RolPwm(PA_15);//roller
+
+void rolStop();
 void InitSerial();
 void runMotor(char mot, bool dir, float pwm);
-void front(float xpwmL,float xpwmR);
-void back(float xpwm,float xpwmR);
-void left(float xpwm, float xpwmR);
-void right(float xpwm,float xpwmR);
-void clockWise(float xpwm,float xpwmR);
-void antiClock(float xpwm,float xpwmR);
+float updatePIDL();
+float updatePIDR();
+void keepEnCount(void);
+void printData(void);
+void execPIDL();
+void execPIDR();
+void hmcCorrect();
+float updatePID();double hoq;
+void allfunction();
+void runRol();
 void Brake();
-
+float err;
 int ch;
-
+char run_mode;
+bool zom = true;int jim=0,jim1=0;
+long Count1,Count2;
+long CountL,CountR,CountDiffL,CountDiffR,CountPrevL,CountPrevR;
+float correctPwmL,correctPwmR;
+double distL,distR,distAv,velL,velR;
+float xpwmL=0.8*1.1,xpwmR=0.8;
+float xpwmLc,xpwmRc,xpwmLR,outputPID;
+double KpL=0.1,KpR=0.125,KdL=0,KdR=0,Kp=0.3,Kd = 0;
+//int Mx,Mx1,err,lastError;
+//float outputPID,P,D;
 void InitSerial()
 {
     bt.baud(9600);
@@ -29,199 +65,397 @@
 }
 void SetPwmf_kHz(float freq)
 {
-    
-    pwmL.period_ms(freq); 
-    pwmR.period_ms(freq); 
-    
-}   
+
+    pwmL.period_ms(1/freq);
+    pwmR.period_ms(1/freq);
+    RolPwm.period_ms(1/freq);
+}
+/*void hmcCorrect()
+{
+  err = Mx1 - Mx;
+  P = err*KpL;
+  D = (err - lastError)*KdL;
+  outputPID = (P + D);                                   
+  lastError = err;
+  if(outputPID < 0)
+  {runMotor('L', 1, (xpwmL + outputPID));
+   runMotor('R', 1, (xpwmR - outputPID));}
+  else if(outputPID > 0)   
+   {runMotor('L', 1, (xpwmL + outputPID));
+    runMotor('R', 1, (xpwmR - outputPID));}
+  else 
+   {runMotor('L', 1, (xpwmL));
+    runMotor('R', 1, (xpwmR));}
+    }*/    
+void printData()
+{
+ //   lcd.cls();
+   // lcd.locate(1,0);
+    //lcd.printf("%f",outputPID );
+    //lcd.locate(1,1);
+    //lcd.printf("%f",velR);
+}
 int main()
 {
     InitSerial();
     SetPwmf_kHz(1);
+    TISR.attach(&keepEnCount, 0.01);
+    Print.attach(&printData, 0.05);
+    lcd.cls();
     Brake();
+    
     while(1) 
     {
-        if(bt.readable()) 
+        
+      //rolA=1;rolB=0;  
+/*        CountL = leftEnc.read();
+        CountR = rightEnc.read();
+        distL = (CountL/ppr)*circum;
+        distR = (CountR/ppr)*circum;
+        distAv = (0.5*(distL + distR));
+        xpwmLc = float(CountDiffL*60)/(ppr*motRPM);
+        xpwmRc = float(CountDiffR*60)/(ppr*motRPM);
+        xpwmLR = float((CountDiffL-CountDiffR)*60)/(ppr*motRPM);
+        velL   = (circum*motRPM*xpwmLc)/60;
+        velR   = (circum*motRPM*xpwmRc)/60;
+        correctPwmL = updatePIDL();
+        correctPwmR = updatePIDR();
+        outputPID = updatePID();      
+        if(outputPID < 0)
+  {runMotor('L', 1, (xpwmL - outputPID));
+   runMotor('R', 1, (xpwmR + outputPID));}
+  else if(outputPID > 0)   
+   {runMotor('L', 1, (xpwmL - outputPID));
+    runMotor('R', 1, (xpwmR + outputPID));}
+  else 
+   {runMotor('L', 1, (xpwmL));
+    runMotor('R', 1, (xpwmR));}
+   
+        //execPIDL();
+        //execPIDR();
+          
+        
+        */
+        CountL = leftEnc.read();
+        CountR = rightEnc.read();
+        distL = (CountL/ppr)*circum;
+        distR = (CountR/ppr)*circum;
+        distAv = (0.5*(distL + distR));
+        xpwmLc = float(CountDiffL*60)/(ppr*motRPM);
+        xpwmRc = float(CountDiffR*60)/(ppr*motRPM);
+        xpwmLR = float((CountDiffL-CountDiffR)*60)/(ppr*motRPM);
+        velL   = (circum*motRPM*xpwmLc)/60;
+        velR   = (circum*motRPM*xpwmRc)/60;
+        correctPwmL = updatePIDL();
+        correctPwmR = updatePIDR();
+        //RolPwm = 0.5;
+        
+        if(xbee1.readable())
         {
-         ch =  bt.getc();
-         lcd.cls();  
-         switch(ch)
+            run_mode = xbee1.getc();
+            //serial.printf("%c\n",run_mode);
+            switch(run_mode)
             {
-              case 'w'://Front
-                   runMotor('L', 1, 0.5);
-                   runMotor('R', 1, 0.5);
-                   serial.printf("Forward\n");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("Forward\n");
+                case 'd':
+                runMotor('L', 1, 0.7);
+                runMotor('R', 1, 0.65);
+                serial.printf("M Forward\n");    
+                break;//front
+                
+                case 'a':
+                runMotor('L', 1, 1);
+                runMotor('R', 0, 1);
+                serial.printf("M Right\n");
+                break;//right
+                
+                case 's':
+                runMotor('L', 0, 1);
+                runMotor('R', 0, 1);
+                serial.printf("M Back\n");
+                break;//back
+                
+                case 'w':
+                runMotor('L', 0, 1);
+                runMotor('R', 1, 1);
+                serial.printf("M Left\n");
+                break;//left
+                
+                case 'x':
+                runMotor('L', 0, 0);
+                runMotor('R', 1, 0); 
+                serial.printf("M Stop\n");   
+                break;//stop
+                }
+         }       
+        else if(bt.readable())
+         {
+            ch = bt.getc();
+            serial.printf("%c\n",ch);
+            
+            switch(ch) 
+            {
+
+                case 'w'://Front
+                    runMotor('L', 1, 0.7);
+                    runMotor('R', 1, 0.65);
+                    //serial.printf("A Forward\n");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("Forward\n");
+                    break;
+
+                case 'd'://Right
+                    runMotor('L', 1, 1);
+                    runMotor('R', 0, 1);
+                    //serial.printf("A Right\n");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("Right\n");
+                    break;
+                    
+                case 's'://Back
+                    runMotor('L', 0, 1);
+                    runMotor('R', 0, 1);
+                    //serial.printf("A Back\n");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("Back\n");
+                    break;
+
+                case 'a'://Left
+                    runMotor('L', 0, 1);
+                    runMotor('R', 1, 1);
+                    //serial.printf("A Left\n");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("Left\n");
+                    break;
+
+                case 'A'://Anticlock
+                    runMotor('L', 0, 0.45);
+                    runMotor('R', 1, 0.41);
+                    //serial.printf("A AntiClock\n");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("AntiClock\n");
+                    break;
+
+                case 'C'://Clock
+                    runMotor('L', 1, 0.45);
+                    runMotor('R', 0, 0.41);
+                    //serial.printf("A Clock\n");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("Clock\n");
+                    break;
+                    
+                case 'O'://Motor Stop
+                    Brake();
+                    //rolA = 0;
+                    //rolB = 0;
+                    //RolPwm = 0;
+                    if(jim1==0)
+                    {
+                      rolStop();
+                      jim1++;
+                    }
+                    jim1=0;
+                    //serial.printf("A Motor STOP\n");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("STOP\n");
+                    break;
+
+                case 'b':
+                    if(jim==0)
+                    {
+                     runRol();
+                     jim++;
+                    }
                    break;
-                  
-              case 'a'://Left
-                   runMotor('L', 1, 0);
-                   runMotor('R', 1, 0.5);
-                   serial.printf("Left\n");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("Left\n");
-                   break; 
-                  
-              case 's'://Back
-                   runMotor('L', 0, 0.5);
-                   runMotor('R', 0, 0.5);
-                   serial.printf("Back\n");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("Back\n");
-                   break; 
-                  
-              case 'd'://Right
-                   runMotor('L', 1, 0.5);
-                   runMotor('R', 1, 0);
-                   serial.printf("Right\n");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("Right\n");
-                   break;
-                  
-              case 'A'://Anticlock
-                   runMotor('L', 0, 0.5);
-                   runMotor('R', 1, 0.5);
-                   serial.printf("AntiClock\n");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("AntiClock\n");
-                   break; 
-                  
-              case 'C'://Clock
-                   runMotor('L', 1, 0.5);
-                   runMotor('R', 0, 0.5);
-                   serial.printf("Clock\n");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("Clock\n");
-                   break;
+                   
+                default:
+                    Brake();
+                    //serial.printf("Brake");
+                    lcd.cls();
+                    lcd.locate(1,0);
+                    lcd.printf("Brake");
+                    }
+                jim=0;jim1=0;
+            }
+    }
+}
+
+void runRol()
+{
+rolA = 1;
+rolB = 0;
+for (hoq = 0.0;hoq < 0.3; hoq = hoq + 0.01)
+{
+ RolPwm = hoq;
+ wait(0.05);    
+}
+}
+
+void rolStop()
+{
+rolA = 1;
+rolB = 0;
+for (hoq < 0.3;hoq > 0; hoq = hoq - 0.005)
+{
+ RolPwm = hoq;
+ wait(0.05);    
+}
+    
+}
+void allfunction()
+{
+        outputPID = updatePID();      
+        if(outputPID < 0)
+  {runMotor('L', 1, (xpwmL - outputPID));
+   runMotor('R', 1, (xpwmR + outputPID));}
+  else if(outputPID > 0)   
+   {runMotor('L', 1, (xpwmL - outputPID));
+    runMotor('R', 1, (xpwmR + outputPID));}
+  else 
+   {runMotor('L', 1, (xpwmL));
+    runMotor('R', 1, (xpwmR));}
+   
+        //execPIDL();
+        //execPIDR();
           
-              case 'O'://Stop
-                   Brake();
-                   serial.printf("STOP\n");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("STOP\n");
-                   break;
-        
-              default:
-                   Brake();
-                   serial.printf("Brake");
-                   lcd.cls();
-                   lcd.locate(1,0);
-                   lcd.printf("Brake");
-            }    
+        }
+float updatePID()
+{
+  float lastError,pidTerm,P,D;
+  err = CountDiffL - CountDiffR;
+  P = err*Kp;
+  D = (err - lastError)*Kd;
+  pidTerm = (P + D);                                   
+  lastError = err;
+  return pidTerm;  
+}
+float updatePIDL()
+{
+  float error,lastError,pidTerm,P,D;
+  error = xpwmL - xpwmLc;
+  P = error*KpL;
+  D = (error - lastError)*KdL;
+  pidTerm = (P + D);                                   
+  lastError = error;
+  return pidTerm;  
+}
+float updatePIDR()
+{
+  float error,lastError,pidTerm,P,D;
+  error = xpwmR - xpwmRc;
+  P = error*KpR;
+  D = (error - lastError)*KdR;
+  pidTerm = (P + D);                                   
+  lastError = error;
+  return pidTerm;  
+}
+void keepEnCount()
+{
+ Count1 = CountL;
+ CountDiffL = Count1 - CountPrevL;
+ CountPrevL = Count1 ;
+ 
+ Count2 = CountR;
+ CountDiffR = Count2 - CountPrevR;
+ CountPrevR = Count2 ;    
+}
+void execPIDL()
+{
+    if(correctPwmL < 0)
+        {runMotor('L', 1, (xpwmL + correctPwmL));}
+    else if(correctPwmL > 0)   
+        {runMotor('L', 1, (xpwmL + correctPwmL));}
+    else 
+        {runMotor('L', 1, (xpwmL));}
+}
+void execPIDR()
+{                 
+    if(correctPwmR < 0)
+        {runMotor('R', 1, (xpwmR + correctPwmR));}
+    else if(correctPwmR > 0)   
+        {runMotor('R', 1, (xpwmR + correctPwmR));}
+    else 
+        {runMotor('R', 1, (xpwmR));}     
+}        
+void runMotor(char mot, bool dir, float pwm)
+{
+    switch(mot) {
+        case 'L':
+            if(dir) {
+                dirLa = 1;
+                dirLb = 0;
+            } else {
+                dirLa = 0;
+                dirLb = 1;
+            }
+            pwmL= pwm;
+            //runSmoothL(pwm);
+            break;
+
+        case 'R':
+            if(dir) {
+                dirRa = 1;
+                dirRb = 0;
+            } else {
+                dirRa = 0;
+                dirRb = 1;
+            }
+            pwmR= pwm;
+            //runSmoothR(pwm);
+            break;
+
+        default:
+            Brake();
+    }
+}
+void linDist(unsigned int DistanceInCM)
+{
+    float ReqdShaftCount = 0;
+    unsigned long int ReqdShaftCountInt = 0;
+
+    ReqdShaftCount = DistanceInCM*31.0;
+    ReqdShaftCountInt = (unsigned long int) ReqdShaftCount;
+    CountL = 0;
+    CountR = 0;
+
+    while(1) {
+        wait(0.01);
+        if((CountL + CountR)*0.5 > ReqdShaftCountInt) {
+            break;
         }
     }
+    Brake();
 }
-void runMotor(char mot, bool dir, float pwm)
+void botRot(int Degrees)
 {
-    switch(mot)
-    {
-     case 'L':
-      if(dir)
-        {
-         dirLa = 1;
-         dirLb = 0;
-        }
-      else
-        {
-         dirLa = 0;
-         dirLb = 1;
-        }
-      pwmL= pwm;
-      break;
-     
-     case 'R':
-       if(dir)
-        {
-         dirRa = 1;
-         dirRb = 0;
-        }
-      else
-        {
-         dirRa = 0;
-         dirRb = 1;
+    float ReqdShaftCount = 0;
+    unsigned long int ReqdShaftCountInt = 0;
+
+    ReqdShaftCount = Degrees* 5.6;
+    ReqdShaftCountInt = (unsigned int) ReqdShaftCount;
+    CountL = 0;
+    CountR = 0;
+    while (true) {
+        wait(0.01);
+        if((CountL >= ReqdShaftCountInt) | (CountR >= ReqdShaftCountInt)) {
+            break;
         }
-      pwmR= pwm;
-      break;
-      
-      default: 
-      Brake(); 
-     }
-}    
-void front(float xpwmL,float xpwmR)
-{  
-    dirLa = 1;
-    dirLb = 0;
-    pwmL= xpwmL;
-    
-    dirRa = 1;
-    dirRb = 0;
-    pwmR= xpwmR; 
-}
-void back(float xpwmL,float xpwmR)
-{
-    dirLa = 0;
-    dirLb = 1;
-    pwmL= xpwmL;
-    
-    dirRa = 0;
-    dirRb = 1;
-    pwmR= xpwmR;
-}
-void left(float xpwmL,float xpwmR)
-{
-    dirLa = 0;
-    dirLb = 0;
-    pwmL= xpwmL;
-    
-    dirRa = 1;
-    dirRb = 0;
-    pwmR= xpwmR; 
-}
-void right(float xpwmL,float xpwmR)
-{
-    dirLa = 1;
-    dirLb = 0;
-    pwmL = xpwmL;
-    
-    dirRa = 0;
-    dirRb = 0;
-    pwmR = xpwmR; 
+    }
+    Brake();
 }
 void Brake()
 {
     dirLa = 0;
     dirLb = 0;
     pwmL=0.0;
-    
+
     dirRa = 0;
     dirRb = 0;
-    pwmR=0.0; 
+    pwmR=0.0;
 }
-void antiClock(float xpwmL,float xpwmR)
-{
-    dirLa = 0;
-    dirLb = 1;
-    pwmL = xpwmL;
-    
-    dirRa = 1;            
-    dirRb = 0;   
-    pwmR = xpwmR;  
-}
-void clockWise(float xpwmL,float xpwmR)
-{
-    dirLa = 1;
-    dirLb = 0;
-    pwmL = xpwmL;
-    
-    dirRa = 0;
-    dirRb = 1;
-    pwmR = xpwmR;
-}
\ No newline at end of file