pid foward back and reverse

Dependencies:   PID QEI chair_BNO055 ros_lib_kinetic

Dependents:  

Fork of wheelchaircontrol by ryan lin

Files at this revision

API Documentation at this revision

Comitter:
ryanlin97
Date:
Tue Jul 17 07:19:04 2018 +0000
Parent:
4:29a27953fe70
Child:
6:0cd57bdd8fbc
Commit message:
imu added

Changed in this revision

chair_imu.cpp Show annotated file Show diff for this revision Revisions of this file
chair_imu.h Show annotated file Show diff for this revision Revisions of this file
imu.cpp Show diff for this revision Revisions of this file
imu.h Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
wheelchair.cpp Show annotated file Show diff for this revision Revisions of this file
wheelchair.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chair_imu.cpp	Tue Jul 17 07:19:04 2018 +0000
@@ -0,0 +1,121 @@
+#include "chair_imu.h"
+
+Serial pc(USBTX, USBRX);
+Timer t;
+
+chair_imu::chair_imu(){
+  imu = new BNO055(SDA, SCL);
+}
+
+chair_imu::chair_imu(PinName sda_pin, PinName scl_pin){
+  imu = new BNO055(sda_pin, scl_pin);
+}
+
+void chair_imu::setup(){
+  imu->reset();
+  pc.printf("Bosch Sensortec BNO055 test program on \r\n");
+  while (imu->check() == 0) {
+    pc.printf("Bosch BNO055 is NOT available!!\r\n");
+    wait(.5);
+  }
+  pc.printf("Bosch Sensortec BNO055 available \r\n");
+  imu->set_accel_units(MPERSPERS);
+  imu->setmode(OPERATION_MODE_AMG);
+  imu->get_calib();
+  imu->write_calibration_data();
+  imu->set_angle_units(DEGREES);
+  imu->setmode(OPERATION_MODE_AMG); //put into while loop 
+  t.start();
+}
+
+double chair_imu::accel_x(){
+  imu->get_accel();
+  return (double)imu->accel.x;
+}
+
+double chair_imu::accel_y(){
+  imu->get_accel();
+  return (double)imu->accel.y;
+}
+
+double chair_imu::accel_z(){
+  imu->get_accel();
+  return (double)imu->accel.z;
+}
+
+double chair_imu::gyro_x(){
+  imu->get_gyro();
+  return (double)imu->gyro.x;
+}
+
+double chair_imu::gyro_y(){
+  imu->get_gyro();
+  return (double)imu->gyro.y;
+}
+
+double chair_imu::gyro_z(){
+  imu->get_gyro();
+  return (double)imu->gyro.z;
+}
+
+double chair_imu::angle_north(){
+  imu->get_mag();
+  float x = imu->mag.x;
+  float y = imu->mag.y;
+  
+  float result = x/y;
+  
+  float angleToNorth;
+  if(imu->mag.y>0)
+    angleToNorth = 90.0 - atan(result)*180/PI;
+  else if(imu->mag.y<0)
+    angleToNorth = 270.0 - atan(result)*180/PI;
+  else if(y == 0 && x <= 0)
+    angleToNorth = 180;
+  else if(y == 0 && x > 0)
+    angleToNorth = 0;
+  
+  return (double)angleToNorth;
+}
+
+double chair_imu::roll(){
+  imu->get_accel();
+  imu->get_gyro();
+  
+  float roll = atan2(-imu->accel.x ,( sqrt((imu->accel.y * imu->accel.y) + 
+  (imu->accel.z * imu->accel.z))));
+  roll = roll*57.3;
+  
+  t.reset();
+
+  return (double)roll;
+}
+
+double chair_imu::pitch(){
+  imu->get_accel();
+  imu->get_gyro();
+  
+  float pitch = atan2 (imu->accel.y ,( sqrt ((imu->accel.x * imu->accel.x) + 
+  (imu->accel.z * imu->accel.z))));
+  pitch = pitch*57.3;
+  
+  t.reset();
+
+  return (double)pitch;
+}
+
+double chair_imu::yaw(){
+  imu->get_gyro();
+  float yaw = (yaw - t.read()*imu->gyro.z);
+  
+  if(yaw > 360)
+    yaw -= 360;
+  if(yaw < 0)
+    yaw += 360;
+    
+  t.reset();
+
+  return (double)yaw;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chair_imu.h	Tue Jul 17 07:19:04 2018 +0000
@@ -0,0 +1,34 @@
+#ifndef Chair_imu
+#define Chair_imu
+
+#include  "mbed.h"
+#include  "math.h"
+#include  "BNO055.h"
+
+#define PI 3.141593
+#define SDA D14
+#define SCL D15
+
+class chair_imu
+{
+public:
+  chair_imu();
+  chair_imu(PinName sda_pin, PinName scl_pin);
+  void setup();
+  double accel_x();
+  double accel_y();
+  double accel_z();
+  double gyro_x();
+  double gyro_y();
+  double gyro_z();
+  double angle_north();
+  double roll();
+  double pitch();
+  double yaw();
+
+private:
+  BNO055* imu;
+
+};
+
+#endif
--- a/imu.cpp	Tue Jul 17 02:29:26 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#include "imu.h"
-
-Imu::Imu(){
-  imu = new BNO055(SDA, SCL);
-}
-
-Imu::Imu(PinName sda_pin, PinName scl_pin){
-  imu = new BNO055(sda_pin, scl_pin);
-}
-void Imu::setup(){
-  imu.reset();
-  pc.printf("Bosch Sensortec BNO055 test program on \r\n");
-  while (imu.check() == 0) {
-    pc.printf("Bosch BNO055 is NOT available!!\r\n");
-    wait(.5);
-  }
-  pc.printf("Bosch Sensortec BNO055 available \r\n");
-  imu.set_accel_units(MPERSPERS);
-  imu.setmode(OPERATION_MODE_AMG);
-  imu.get_calib();
-  imu.write_calibration_data();
-  imu.set_angle_units(DEGREES);
-}
\ No newline at end of file
--- a/imu.h	Tue Jul 17 02:29:26 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#ifndef Imu
-#define imu
-
-#include  "mbed.h"
-#include  "math.h"
-#include    "BNO055.h"
-
-#define PI 3.141593
-#define SDA D14
-#define SCL D15
-
-class Imu
-{
-public:
-  Imu();
-  Imu(BNO055*)
-  void setup();
-
-
-private:
-
-};
-
-#endif
--- a/main.cpp	Tue Jul 17 02:29:26 2018 +0000
+++ b/main.cpp	Tue Jul 17 07:19:04 2018 +0000
@@ -1,7 +1,5 @@
 #include "wheelchair.h"
 
-Serial pc(USBTX, USBRX);
-
 AnalogIn x(A0);
 AnalogIn y(A1);
 
--- a/wheelchair.cpp	Tue Jul 17 02:29:26 2018 +0000
+++ b/wheelchair.cpp	Tue Jul 17 07:19:04 2018 +0000
@@ -4,14 +4,14 @@
 {
     x = new PwmOut(xPin);
     y = new PwmOut(yPin);
+    imu = new chair_imu();
 }
 /*
 * joystick has analog out of 200-700, scale values between 1.3 and 3.3
 */
 void Wheelchair::move(float x_coor, float y_coor)
 {
-    printf("raw is %f %f \n", x_coor, y_coor);
-    printf("x is %f y is %f \n", ((x_coor*1.6f) + 1.7f), ((y_coor*1.6f) + 1.7f)); 
+     
     float scaled_x = ((x_coor * 1.6f) + 1.7f)/3.3f;
     float scaled_y = (3.3f - (y_coor * 1.6f))/3.3f;
     x->write(scaled_x);
@@ -19,6 +19,27 @@
     
 }
 
+void Wheelchair::turn_right(){
+    double start = imu->yaw();
+    double final = start + 90;
+    if(final > 360)
+        final -= 360;
+   
+    while(imu->yaw() <= final) {
+        Wheelchair::right();
+        } 
+}
+
+void Wheelchair::turn_left(){
+    double start = imu->yaw();
+    double final = start - 90;
+    if(final <0)
+        final += 360;
+   
+    while(imu->yaw() >= final) {
+        Wheelchair::left();
+        } 
+}
 void Wheelchair::forward()
 {
     x->write(high);
--- a/wheelchair.h	Tue Jul 17 02:29:26 2018 +0000
+++ b/wheelchair.h	Tue Jul 17 07:19:04 2018 +0000
@@ -1,8 +1,7 @@
 #ifndef wheelchair
 #define wheelchair
 
-#include "mbed.h"
-#include "math.h"
+#include "chair_imu.h"
 
 #define def (2.5f/3.3f)
 #define high 3.3f
@@ -17,6 +16,8 @@
 public:
     Wheelchair(PinName xPin, PinName yPin);
     void move(float x_coor, float y_coor);
+    void turn_right();
+    void turn_left();
     void forward();
     void backward();
     void right();
@@ -26,6 +27,7 @@
 private:
     PwmOut* x;
     PwmOut* y;
+    chair_imu* imu;
 
 };
 #endif
\ No newline at end of file