From 0d960762ca523936009007827d86c35a4a6cac97 Mon Sep 17 00:00:00 2001
From: Aaron John Sabu <aaronjohnsabu1999@gmail.com>
Date: Sun, 17 Oct 2021 00:11:39 -0700
Subject: [PATCH] Updated modularized code

---
 Code/Control/Main_Code/CameraDefn.h   | 24 +++++++
 Code/Control/Main_Code/Constants.h    |  1 +
 Code/Control/Main_Code/LIDAR.h        | 23 ++++---
 Code/Control/Main_Code/Localization.h | 15 +++--
 Code/Control/Main_Code/Main_Code.ino  | 85 +++++++++++++------------
 Code/Control/Main_Code/Mesh.h.bkp     |  6 +-
 Code/Control/Main_Code/PID.h          |  5 --
 Code/Control/Main_Code/Propulsion.h   | 92 ++++++++++++++++-----------
 8 files changed, 146 insertions(+), 105 deletions(-)
 create mode 100644 Code/Control/Main_Code/CameraDefn.h

diff --git a/Code/Control/Main_Code/CameraDefn.h b/Code/Control/Main_Code/CameraDefn.h
new file mode 100644
index 0000000..767cd9e
--- /dev/null
+++ b/Code/Control/Main_Code/CameraDefn.h
@@ -0,0 +1,24 @@
+#ifndef CAMERADEFN_H
+#define CAMERADEFN_H
+
+#include "Constants.h"
+#include "Camera.h"
+
+openmv::rpc_scratch_buffer<256> scratch_buffer; // All RPC objects share this buffer.
+openmv::rpc_i2c_master interface(0x12, 100000); //to make this more robust, consider making address and rate as constructor argument
+
+Camera cam(&interface);
+
+void CameraDefn_Setup(){
+  interface.begin(); //communication between ESP and OpenMV
+}
+
+float CameraDefn_BallDetect(int x, int y){
+  return cam.exe_color_detection_biggestblob(threshold[0], threshold[1], threshold[2], threshold[3], threshold[4], threshold[5], x, y);
+}
+
+float CameraDefn_GoalFind(int8_t goal[3], int id, int tx, int ty, int tz, int rx, int ry, int rz){
+  return cam.exe_goalfinder(goal[0], goal[1], goal[2], id, tx, ty, tz, rx, ry, rz);
+}
+
+#endif
diff --git a/Code/Control/Main_Code/Constants.h b/Code/Control/Main_Code/Constants.h
index f43c1dc..232fa65 100644
--- a/Code/Control/Main_Code/Constants.h
+++ b/Code/Control/Main_Code/Constants.h
@@ -12,6 +12,7 @@ const double RESOLUTION_H = 240.0;
 const int ENDDEMO_TAG = 0;
 const uint32_t THISNODE_ID = 88789821;
 int BASE_SPEED = 50; //125;
+int GROUND_LEVEL = 1000; // Pressure at ground level
 
 // The debug LEDs that we will be using. Description at:
 const int DEBUG_STATE = 31;
diff --git a/Code/Control/Main_Code/LIDAR.h b/Code/Control/Main_Code/LIDAR.h
index c5cab0b..554e392 100644
--- a/Code/Control/Main_Code/LIDAR.h
+++ b/Code/Control/Main_Code/LIDAR.h
@@ -13,25 +13,24 @@ int lidarThres = 300; // mm
 void LIDAR_Setup(){
   pinMode(LED, OUTPUT);
   digitalWrite(LED, HIGH);
-  if (distanceSensor.begin() == 0)
-    Serial.println("Sensor online!");
+//  if (distanceSensor.begin() == 0)
+//    Serial.println("Sensor online!");
   distanceSensor.startRanging();
   distanceSensor.setIntermeasurementPeriod(budgetValue[budgetIndex]);
   digitalWrite(LED, LOW);
 }
 
 float LIDAR_BallCapture(){
-  int dist = 0;
-  int ball_cap = 0;
-  dist = distanceSensor.getDistance();
-  Serial.println(dist);
-  if ((dist < lidarThres) && (dist > 0)){ // if we capture the ball 
-    ball_cap = 1; 
-    Serial.println("find ball");
-  }else{
-    ball_cap = 2;
-    Serial.println("no ball");
+  int LIDARVal = 0;
+  int ballCapture = 0;
+  LIDARVal = distanceSensor.getDistance();
+  Serial.print("LIDAR value: ");
+  Serial.println(LIDARVal);
+  if ((LIDARVal < lidarThres) && (LIDARVal > 0)){
+    // Ball captured
+    ballCapture = 1; 
   }
+  return ballCapture;
 }
 
 #endif
diff --git a/Code/Control/Main_Code/Localization.h b/Code/Control/Main_Code/Localization.h
index 54be7c9..590799e 100644
--- a/Code/Control/Main_Code/Localization.h
+++ b/Code/Control/Main_Code/Localization.h
@@ -15,6 +15,7 @@ float hoverAltitude = -1;
 
 // Function Declarations
 float altitudeCalc();
+float altitudeControl();
 
 void Localization_Setup(){
   if (!baro.begin()) {
@@ -25,14 +26,11 @@ void Localization_Setup(){
 }
 
 float Localization_Init(){
-  float altitude = altitudeCalc() - groundLevel;
-  return altitude;
+  return altitudeCalc();
 }
 
-void Localization_GoalFound(float altitude){
-  if (hoverAltitude == -1){
-    hoverAltitude = altitude;
-  }
+void Localization_GoalFound(){
+  altitudeControl();
 }
 
 void Localization_BallDetected(){
@@ -40,11 +38,14 @@ void Localization_BallDetected(){
 }
 
 float altitudeControl(){
+  if (hoverAltitude == -1){
+    hoverAltitude = altitudeCalc();
+  }
   return hoverAltitude;
 }
 
 float altitudeCalc(){
-  return baro.getAltitude();
+  return baro.getAltitude() - groundLevel;
 }
 
 #endif
diff --git a/Code/Control/Main_Code/Main_Code.ino b/Code/Control/Main_Code/Main_Code.ino
index a359a37..49f46f1 100644
--- a/Code/Control/Main_Code/Main_Code.ino
+++ b/Code/Control/Main_Code/Main_Code.ino
@@ -4,62 +4,54 @@
 #include <Wire.h>
 #include "Debug.h"
 #include "LIDAR.h"
-#include "Camera.h"
 #include <Arduino.h>
 #include "Constants.h"
 #include "utilities.h"
+#include "CameraDefn.h"
 #include "Propulsion.h"
 #include "ColorDetect.h"
-#include "Localization.h"
+//#include "Localization.h"
 // #include "Adafruit_VL53L0X.h"
 using namespace std;
 
-//Identify all the variables that will be used by the robot
-int findcolor = 1; //based on the same code from openMV. Determine the color you want to find
-char newPTCL = '1';
-int pauseState = 0;
-int displayTracking = 0;
-
-int ballCapture = 0;
-int ballDetect  = 0;
-int goalFind    = 0;
-
-float altitude  = 0;
+// Identify all the variables that will be used by the robot
+int   findcolor       = 1; //based on the same code from openMV. Determine the color you want to find
+int   pauseState      = 0;
+int   displayTracking = 0;
+int   ballCapture     = 0;
+int   ballDetect      = 0;
+int   goalFind        = 0;
+float altitude        = 0;
 
 // Function Declarations
 
-
-//Create the interface that will be used by the camera
-openmv::rpc_scratch_buffer<256> scratch_buffer; // All RPC objects share this buffer.
-openmv::rpc_i2c_master interface(0x12, 100000); //to make this more robust, consider making address and rate as constructor argument
-
-Camera cam(&interface);
-
 void setup() {
   Serial.begin(BAUD_RATE);
   Wire.begin();
   AFMS.begin();  // create with the default frequency 1.6KHz
-  interface.begin(); //communication between ESP and OpenMV
-    
+  
+  CameraDefn_Setup();
   ColorDetect_Setup(findcolor);
   Debug_Setup();
   PID_Setup();
   LIDAR_Setup();
-  Localization_Setup();
+  #ifdef LOCALIZATION_H
+    Localization_Setup();
+  #endif
   #ifdef MESH_H
     Mesh_Setup();
   #endif
 }
 
 void loop(){
+  /* ---------- MAIN LOOP ---------- */
   Debug_LoopStart();
   #ifdef MESH_H
-    MeshUpdate();
+    Mesh_LoopStart();
   #endif
   
   /* --------- PAUSE STATE --------- */
   while(pauseState == 1){
-    Serial.println("pause");
     #ifdef MESH_H
       Mesh_PauseState();
     #endif
@@ -68,38 +60,41 @@ void loop(){
   }
   /* ------- END PAUSE STATE ------- */
   
+  /* -------- INITIALIZATION ------- */
   int id = -1;
   int  x = 0,  y = 0;
   int tx = 0, ty = 0, tz = 0;
   int rx = 0, ry = 0, rz = 0;
   int8_t goal[3] = {0,1,2};
   
+  ballCapture = LIDAR_BallCapture();
+  ballDetect  = CameraDefn_BallDetect(x, y);
+  goalFind    = CameraDefn_GoalFind(goal, id, tx, ty, tz, rx, ry, rz);
+  /* ----- END INITIALIZATION ------ */
+  
   /* -------- STANDBY STATE -------- */
   Debug_StandbyState();
   /* ------ END STANDBY STATE ------ */
 
-  altitude = Localization_Init();
-  
   /* --------- INTERRUPTS ---------- */
-  altitudeBarrier(altitude);
+  #ifdef LOCALIZATION_H
+    altitudeBarrier();
+  #endif
   
   if(insideWindyArea()){
     // leave windy area
     // flip horizontal inputs
   }
-  /* ------ END OF INTERRUPTS ------ */
+  /* -------- END INTERRUPTS ------- */
 
-  /* ---------- MAIN LOOP ---------- */
-  // Have we captured the ball?
-  ballCapture = LIDAR_BallCapture();
-  ballDetect  = cam.exe_color_detection_biggestblob(threshold[0], threshold[1], threshold[2], threshold[3], threshold[4], threshold[5], x, y);
-  goalFind    = cam.exe_goalfinder(goal[0], goal[1], goal[2], id, tx, ty, tz, rx, ry, rz);
-  
+  /* ---------- MAIN LOGIC --------- */
   if(ballCapture){ // Ball captured
 	  if(goalFind){ // Ball captured and Goal found
       Debug_GoalFound();
       PID_GoalFound(tx/1.00, ty/1.00);
-      Localization_GoalFound(altitude);
+      #ifdef LOCALIZATION_H
+        Localization_GoalFound();
+	    #endif
 	    Propulsion_GoalFound();
     }
     else { // Ball captured but Goal not found
@@ -110,7 +105,9 @@ void loop(){
   else { // Ball not captured
 	  if(ballDetect) { // Ball not captured but detected
       Debug_BallDetected();
-      Localization_BallDetected();
+      #ifdef LOCALIZATION_H
+        Localization_BallDetected();
+      #endif
       PID_BallDetected(x/1.00, y/1.00);
       Propulsion_BallDetected();
     }
@@ -118,19 +115,23 @@ void loop(){
       Propulsion_BallSeeking();
     }
   }
-
-  // -------- END MAIN LOOP -------- //
+  /* ------- END MAIN LOGIC -------- */
+  /* -------- END MAIN LOOP -------- */
 }
 
-void altitudeBarrier(int altitude){
+#ifdef LOCALIZATION_H
+void altitudeBarrier(){
+  float altitude = altitudeCalc();
   if(altitude < lowHeightBarrier){
-    moveVertical((lowHeightBarrier - altitude)*255/lowHeightBarrier);
+    move_V((lowHeightBarrier - altitude)*255/lowHeightBarrier);
   }
   else if(altitude > ceilingHeight - highHeightBarrier){
-    moveVertical(((ceilingHeight - highHeightBarrier) - altitude)*255/highHeightBarrier);
+    move_V(((ceilingHeight - highHeightBarrier) - altitude)*255/highHeightBarrier);
   }	
 }
+#endif
 
 float insideWindyArea(){
+  
   return 0;
 }
diff --git a/Code/Control/Main_Code/Mesh.h.bkp b/Code/Control/Main_Code/Mesh.h.bkp
index f13d583..ad6d4cf 100644
--- a/Code/Control/Main_Code/Mesh.h.bkp
+++ b/Code/Control/Main_Code/Mesh.h.bkp
@@ -8,7 +8,7 @@
 
 ArnholdMesh thisNode;
 
-void MeshSetup(){
+void Mesh_Setup(){
   thisNode.setPanel(&panel);
   thisNode.setStationInfo(STATION_SSID, STATION_PASSWORD);
   thisNode.setMQTTInfo(MQTT_BROKER, MQTT_TOPIC);
@@ -16,6 +16,10 @@ void MeshSetup(){
   thisNode.init();
 }
 
+void Mesh_LoopStart(){
+  MeshUpdate();
+}
+
 void MeshUpdate(){
   thisNode.update();
 }
diff --git a/Code/Control/Main_Code/PID.h b/Code/Control/Main_Code/PID.h
index fa548ce..2aa0478 100644
--- a/Code/Control/Main_Code/PID.h
+++ b/Code/Control/Main_Code/PID.h
@@ -33,11 +33,6 @@ void PID_GoalFound(int InputxVal, int InputyVal){
   Inputy = InputyVal;
   PID_x.Compute();
   PID_y.Compute();
-
-//  Serial.print("Outputx: ");
-//  Serial.println(Outputx);
-//  Serial.print("Outputy: ");
-//  Serial.println(Outputy);
 }
 
 void PID_BallDetected(int InputxVal, int InputyVal){
diff --git a/Code/Control/Main_Code/Propulsion.h b/Code/Control/Main_Code/Propulsion.h
index 663c317..e37903f 100644
--- a/Code/Control/Main_Code/Propulsion.h
+++ b/Code/Control/Main_Code/Propulsion.h
@@ -1,14 +1,15 @@
 #ifndef PROPULSION_H
 #define PROPULSION_H
 
+#include "Debug.h"
 #include "Constants.h"
+#include "Localization.h"
 #include <Adafruit_MotorShield.h>
 
-int zero = 0;
-
 // Function Declarations
-void moveVertical(int vel);
-void moveHorizontal(int vel_hori, int base_speed);
+void move_V(int V_Trn);
+void move_H(int V_Rot, int V_Trn);
+void hover(float altitude);
 
 // Create the motor shield object with the default I2C address
 Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
@@ -18,69 +19,84 @@ Adafruit_DCMotor *motor_HL = AFMS.getMotor(3);
 Adafruit_DCMotor *motor_HR = AFMS.getMotor(4);
 
 void Propulsion_PauseState(){
-  moveVertical(zero);
-  moveHorizontal(zero,zero);
+  move_V(0);
+  move_H(0, 0);
 }
 
 void Propulsion_GoalFound(){
-  moveVertical(Outputy);
-  moveHorizontal(Outputx, BASE_SPEED);
+  move_V(Outputy);
+  move_H(Outputx, BASE_SPEED);
 }
 
 void Propulsion_GoalSeeking(){
-  moveVertical(0);
-  moveHorizontal(SEEKING_SPEED, 0);
+//  move_V(0);
+  hover(altitudeCalc());
+  move_H(SEEKING_SPEED, 0);
 }
 
 void Propulsion_BallDetected(){
-  moveVertical(Outputy);
-  moveHorizontal(Outputx, BASE_SPEED);
+  move_V(Outputy);
+  move_H(Outputx, BASE_SPEED);
 }
 
 void Propulsion_BallSeeking(){
-  moveVertical(0);
-  moveHorizontal(SEEKING_SPEED, 0);
+//  move_V(0);
+  hover(altitudeCalc());
+  move_H(SEEKING_SPEED, 0);
 }
 
-//vel value should be between -255 to 255 with positive values moving the blimp upward.
-void moveVertical(int vel){
-    if (vel > 0) { //up
-      panel.singleLED(DEBUG_VERTICALSPEED, abs(vel), 0, 0);
-      motor_VL->setSpeed(abs((int) vel));
-      motor_VR->setSpeed(abs((int) vel)); 
-      motor_VL->run(BACKWARD);
-      motor_VR->run(BACKWARD);
-    } else if(vel < 0) { //down
-      panel.singleLED(DEBUG_VERTICALSPEED, 0, 0, abs(vel));
-      motor_VL->setSpeed(abs((int) Outputy));  
-      motor_VR->setSpeed(abs((int) Outputy)); 
-      motor_VL->run(FORWARD);
-      motor_VR->run(FORWARD);
-    } else {
-      panel.singleLED(DEBUG_VERTICALSPEED, 0, 0, 0);
-      motor_VL->setSpeed(0);
-      motor_VR->setSpeed(0);
-    }
+// V_Trn value should be between -255 to 255 with positive values moving the blimp upward.
+void move_V(int V_Trn){
+  if (V_Trn > 0) {
+    // Move up
+    panel.singleLED(DEBUG_VERTICALSPEED, abs(V_Trn), 0, 0);
+    motor_VL->setSpeed(abs((int) V_Trn));
+    motor_VR->setSpeed(abs((int) V_Trn)); 
+    motor_VL->run(BACKWARD);
+    motor_VR->run(BACKWARD);
+  }
+  else if(V_Trn < 0) {
+    // Move down
+    panel.singleLED(DEBUG_VERTICALSPEED, 0, 0, abs(V_Trn));
+    motor_VL->setSpeed(abs((int) V_Trn));  
+    motor_VR->setSpeed(abs((int) V_Trn)); 
+    motor_VL->run(FORWARD);
+    motor_VR->run(FORWARD);
+  }
+  else {
+    // No motor action
+    panel.singleLED(DEBUG_VERTICALSPEED, 0, 0, 0);
+    motor_VL->setSpeed(0);
+    motor_VR->setSpeed(0);
+  }
 }
 
-void moveHorizontal(int vel_hori, int base_speed){
-  int lspeed = vel_hori + base_speed;
-  int rspeed = vel_hori + base_speed;
+void move_H(int V_Rot, int V_Trn){
+  int lspeed = -1*V_Rot + V_Trn;
+  int rspeed =  1*V_Rot + V_Trn;
 
   if (lspeed > 0){
     motor_HL->run(FORWARD);
-  } else {
+  }
+  else {
     motor_HL->run(BACKWARD);
   }
 
   if (rspeed > 0){
     motor_HR->run(FORWARD);
-  } else {
+  }
+  else {
     motor_HR->run(BACKWARD);
   }
+  
   displaySpeed(lspeed, rspeed);
   motor_HL->setSpeed(min(MAX_SPEED, abs(rspeed)));
   motor_HR->setSpeed(min(MAX_SPEED, abs(lspeed)));
 }
 
+void hover(float altitude){
+  float hoverAltitude = altitudeControl();
+  move_V(BASE_SPEED*(hoverAltitude-altitudeCalc()));
+}
+
 #endif
-- 
GitLab