From 6463fd0bf16cec0023708c58f32a4727587633cc Mon Sep 17 00:00:00 2001 From: Aaron John Sabu <aaronjohnsabu1999@gmail.com> Date: Tue, 12 Oct 2021 22:18:51 -0700 Subject: [PATCH] added integrated altitude code --- .../Barometer Code/Barometer Readings 02.xlsx | Bin 0 -> 30024 bytes Code/Barometer Code/Barometer Readings 03.png | Bin 0 -> 28637 bytes .../Barometer_Code/Barometer_Code.ino | 16 +- .../Altitude_Control/.gitkeep | 0 .../Altitude_Control/Altitude_Control.ino | 430 ++++++++++++++++++ .../Altitude_Control/Camera.cpp | 91 ++++ .../Altitude_Control/Camera.h | 19 + .../Altitude_Control/LedPanel.cpp | 65 +++ .../Altitude_Control/LedPanel.h | 28 ++ .../Altitude_Control/utilities.cpp | 83 ++++ .../Altitude_Control/utilities.h | 8 + .../PID_Test/PID_Test.ino | 40 +- 12 files changed, 756 insertions(+), 24 deletions(-) create mode 100644 Code/Barometer Code/Barometer Readings 02.xlsx create mode 100644 Code/Barometer Code/Barometer Readings 03.png create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/.gitkeep create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/Altitude_Control.ino create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/Camera.cpp create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/Camera.h create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.cpp create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.h create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/utilities.cpp create mode 100644 Code/Control/Feather Code - Aaron/Altitude_Control/utilities.h diff --git a/Code/Barometer Code/Barometer Readings 02.xlsx b/Code/Barometer Code/Barometer Readings 02.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..307bbc8f8032c1495a58829c0711cc851156b012 GIT binary patch literal 30024 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 NXs}@B*yj7ue*q+qM27$X literal 0 HcmV?d00001 diff --git a/Code/Barometer Code/Barometer Readings 03.png b/Code/Barometer Code/Barometer Readings 03.png new file mode 100644 index 0000000000000000000000000000000000000000..14707799fbf8fc5ca6f81f7a08da62caa2a10616 GIT binary patch literal 28637 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 WYjH>GM_kc6Uc01rG4q14@Bac<O8Ra9 literal 0 HcmV?d00001 diff --git a/Code/Barometer Code/Barometer_Code/Barometer_Code.ino b/Code/Barometer Code/Barometer_Code/Barometer_Code.ino index 8a42d27..7b0cb6e 100644 --- a/Code/Barometer Code/Barometer_Code/Barometer_Code.ino +++ b/Code/Barometer Code/Barometer_Code/Barometer_Code.ino @@ -20,14 +20,14 @@ void setup() { } void loop() { - float pressure = baro.getPressure(); +// float pressure = baro.getPressure(); float altitude = baro.getAltitude(); - float temperature = baro.getTemperature(); +// float temperature = baro.getTemperature(); - Serial.println("-----------------"); - Serial.print("pressure = "); Serial.print(pressure); Serial.println(" hPa"); - Serial.print("altitude = "); Serial.print(altitude); Serial.println(" m"); - Serial.print("temperature = "); Serial.print(temperature); Serial.println(" C"); - - delay(100); + // Serial.println("-----------------"); + // Serial.print("pressure = "); Serial.print(pressure); Serial.println(" hPa"); + // Serial.print("altitude = "); Serial.print(altitude); Serial.println(" m"); + // Serial.print("temperature = "); Serial.print(temperature); Serial.println(" C"); + Serial.println(altitude); + delay(10); } diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/.gitkeep b/Code/Control/Feather Code - Aaron/Altitude_Control/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/Altitude_Control.ino b/Code/Control/Feather Code - Aaron/Altitude_Control/Altitude_Control.ino new file mode 100644 index 0000000..70711e5 --- /dev/null +++ b/Code/Control/Feather Code - Aaron/Altitude_Control/Altitude_Control.ino @@ -0,0 +1,430 @@ +#include <string> +#include <vector> +#include <Wire.h> +#include "Camera.h" +#include <PID_v1.h> +#include <Arduino.h> +#include "LedPanel.h" +#include "utilities.h" +#include <Adafruit_MPL3115A2.h> +#include <Adafruit_MotorShield.h> +// #include "Adafruit_VL53L0X.h" +// #include "ArnholdMesh.h" + +double Setpointx, Inputx, Outputx; +double Setpointy, Inputy, Outputy; + +//Identify all the global constants that will be used by the robot +const int BAUD_RATE = 115200; +const int MAX_SPEED = 255; +const int SEEKING_SPEED = 70; +const double RESOLUTION_W = 320.0; +const double RESOLUTION_H = 240.0; +const int ENDDEMO_TAG = 0; +const uint32_t THISNODE_ID = 88789821; +float groundLevel = 120; +float lowHeightBarrier = 4; +float highHeightBarrier = 4; +float ceilingHeight = 20; + +//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 pau = 0; +int displayTracking = 0; +int8_t threshold[6] = {0, 0, 0, 0, 0, 0}; +int BASE_SPEED = 50; //125; +int ball_capture = 0; + +//The debug LEDs that we will be using. Description at: +const int DEBUG_STATE = 31; +const int DEBUG_KP = 30; +const int DEBUG_KI = 29; +const int DEBUG_KD = 28; +const int DEBUG_BASESPEED = 27; +const int DEBUG_THRESHOLD_MIN = 26; +const int DEBUG_THRESHOLD_MAX = 25; +const int DEBUG_VERTICALSPEED = 17; +const int DEBUG_RSPEED = 16; +const int DEBUG_LSPEED = 24; + +//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 + +// Create the motor shield object with the default I2C address +Adafruit_MotorShield AFMS = Adafruit_MotorShield(); +Adafruit_DCMotor *motor_VL = AFMS.getMotor(2); +Adafruit_DCMotor *motor_VR = AFMS.getMotor(1); +Adafruit_DCMotor *motor_HL = AFMS.getMotor(3); +Adafruit_DCMotor *motor_HR = AFMS.getMotor(4); + +Camera cam(&interface); +LedPanel panel(NUMPIXELS,PIN_PIXELS); +// ArnholdMesh thisNode; +Adafruit_MPL3115A2 baro; + +//Specify the links and initial tuning parameters +double Kpx=2, Kix=0.05, Kdx=0.25; +double Kpy=2, Kiy=0.1, Kdy=0.25; +PID PID_x(&Inputx, &Outputx, &Setpointx, Kpx, Kix, Kdx, DIRECT); +PID PID_y(&Inputy, &Outputy, &Setpointy, Kpy, Kiy, Kdy, DIRECT); + +void setup() { + Serial.begin(BAUD_RATE); + translateCodetoThreshold(findcolor); + Wire.begin(); + AFMS.begin(); // create with the default frequency 1.6KHz + interface.begin(); //communication between ESP and OpenMV + panel.beginPanel(); + + Setpointx = 160.0; + Setpointy = 120.0; //the values that the PID will try to reach + PID_y.SetOutputLimits(-255, 255); //up positive + PID_x.SetOutputLimits(-255, 255); //left positive + PID_x.SetMode(AUTOMATIC); + PID_y.SetMode(AUTOMATIC); + + if (!baro.begin()) { + Serial.println("Barometer not found"); + while(1); + } + baro.setSeaPressure(1016); +} + +void loop() { + // + panel.singleLED(DEBUG_BASESPEED, BASE_SPEED, BASE_SPEED, BASE_SPEED); + + while(pau == 1){ + // thisNode.update(); + int zero = 0; + moveVertical(zero); + moveHorizontal(zero,zero); + panel.singleLED(DEBUG_STATE, 10, 10, 0); + Serial.println("pause"); + } + + //Check to see if we want to end the demo + int xtemp = 0; + int ytemp = 0; + int angletemp = 0; + int x = 0; + int y = 0; + panel.singleLED(DEBUG_STATE, 10, 0, 0); //standby + int id = -1; + int tx = 0; + int ty = 0; + int tz = 0; + int rx = 0; + int ry = 0; + int rz = 0; + int8_t goal[3] = {0,1,2}; + float altitude = altitudeCalc() - groundLevel; + + if(altitude < lowHeightBarrier){ + moveVertical((lowHeightBarrier - altitude)*255/lowHeightBarrier) + } + else if(altitude > ceilingHeight - highHeightBarrier){ + moveVertical(((ceilingHeight - highHeightBarrier) - altitude)*255/highHeightBarrier) + } + + if(insideWindyArea){ + // leave windy area + // flip horizontal inputs + } + + // Have we captured the ball? + // ball_capture = lidar_output() + + if(ball_capture){ + if(cam.exe_goalfinder(goal[0], goal[1], goal[2], id, x, y, tz, rx, ry, rz)){ + if (displayTracking > 0){ + displayTrackedObject(x, y, RESOLUTION_W, RESOLUTION_H); //THIS NEEDS WORK + } + panel.singleLED(DEBUG_STATE, 0, 10, 0); + Serial.println("blob detected"); + Serial.print("x value: "); + Serial.println(x); + Serial.print("y value: "); + Serial.println(y); + Inputx = x/1.00; + Inputy = y/1.00; + PID_x.Compute(); + PID_y.Compute(); + + Serial.print("Outputx: "); + Serial.println(Outputx); + Serial.print("Outputy: "); + Serial.println(Outputy); + + moveVertical(Outputy); + moveHorizontal(Outputx, BASE_SPEED); + } else { //seeking algorithm + //panel.resetPanel(); + panel.singleLED(DEBUG_STATE, 10, 10, 10); + Serial.println("seeking..."); + int zero = 0; + moveVertical(zero); + moveHorizontal(SEEKING_SPEED, zero); + } + } + else { + ball_detect = cam.exe_color_detection_biggestblob(threshold[0], threshold[1], threshold[2], threshold[3], threshold[4], threshold[5], x, y); + if(ball_detect) { + // move towards ball + + } + else { + // seek the ball + // add seeking algorithm - turn around for 360 degrees? + } + } +} + +//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); + } +} + +void moveHorizontal(int vel_hori,int base_speed){ + int lspeed = vel_hori + base_speed; + int rspeed = vel_hori + base_speed; + + if (lspeed > 0){ + motor_HL->run(FORWARD); + } else { + motor_HL->run(BACKWARD); + } + + if (rspeed > 0){ + motor_HR->run(FORWARD); + } 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 displaySpeed(int lspeed, int rspeed){ + //Serial.println("display speed"); + if (lspeed < 0){ + panel.singleLED(DEBUG_LSPEED, 0, 0, abs(lspeed)); + } else { + panel.singleLED(DEBUG_LSPEED, abs(lspeed), 0, 0); + } + + if (rspeed < 0){ + panel.singleLED(DEBUG_RSPEED, 0, 0, abs(rspeed)); + } else { + panel.singleLED(DEBUG_RSPEED, abs(rspeed), 0, 0); + } +} + +//When using the camera to detect objects such as colored blobs or april tags. This function is +//useful when only a single object is the target. The approximate position will be marked with an +//led turning white in the 8*4 panel of the NeoPixel LED Panel. Therefore, this function can be +//called assuming that you have created the LED panel object, which in this code is named "panel". +//If the LED panel is called something else, just edit the code here +void displayTrackedObject(int cx, int cy, int w_res, int h_res){ + int lednum = 0; + int vertshift = 0; + panel.resetPanel(); + lednum = cx/(w_res/8); //because lednum is an int, it will handle flooring the value + vertshift = cy/(h_res/4); + lednum = lednum + 8*vertshift; + panel.singleLED(lednum, 10, 10 , 10); +} + +//Interpret a message to change what color the camera is detecting +void setColor(String msg) { + if (msg.length() < 3){ + int val = msg.toInt(); + translateCodetoThreshold(val); + Serial.println("code detected"); + } else { + Serial.println("new threshold detected"); + setColorThreshold(msg, threshold, 6); + } + for (int j = 0; j < 6; j++){ + Serial.print(threshold[j]); + Serial.print(" "); + } + Serial.println(""); +} + +//in case we don't want to maually set each LAB threshold, we can send over an int to +//use preset threshold values instead +void translateCodetoThreshold(int code){ + switch(code){ + case 1: //green old = (30, 100, -68, -13, 30, 127) + //(30,100,-68,2,6,127) - detect the yellow wall as well + threshold[0] = 30; + threshold[1] = 100; + threshold[2] = -93; + threshold[3] = -5; + threshold[4] = 13; + threshold[5] = 127; + break; + case 2: //blue + threshold[0] = 30; + threshold[1] = 100; + threshold[2] = -108; + threshold[3] = -9; + threshold[4] = 0; + threshold[5] = -42; + break; + case 5: //red (30, 100, 127, 41, 127, 13) + threshold[0] = 30; + threshold[1] = 100; + threshold[2] = 127; + threshold[3] = 41; + threshold[4] = 127; + threshold[5] = 13; + } +} + + +//threshold array must have at least six elements. This function helps +//translating a message with threshold values to ints. Example msg that would +//be received by this function are "1 2 3 4 5 6" or "-100 70 9 -9 -50 128". +//NOTE: - the threshold value should be between -128 to 128 +// - the message should not include the command character used by the mesh +// - suggested command character: 'C'[olor] +void setColorThreshold(String msg, int8_t thres[], int arraySize){ + int len = msg.length(); + int temp = 0; + int startpoint = 0; + for (int i = 0; i < len; i++){ + if (msg[i] == ' '){ + thres[temp] = msg.substring(startpoint,i).toInt(); + startpoint = i + 1; + temp++; + } + if (temp == 5){ + thres[temp] = msg.substring(startpoint).toInt(); + break; + } + } +} + +//This function translate a string of message into the constants for a PID controller. Ignoring the +//first command character, user can input any one, two, or all three parameter to be changed by identifying +//the new parameter with the capital letter of that specific parameter, each separated with a space. +//Some of the valid msg examples are: +// - "P0.02" +// - "D1.23" +// - "P0.14 D9.5" +// - "P0.1 I0.1 D0.1" +// +//NOTE: +// - the parameter doesn't have to be in order. You can do DI or IP in whichever order as long as it follows a valid double value +// - while the function works if you passed a negative double, the PID controller will not and will produce error. +// - suggested command character: 'T'[uning] +void setPIDConstants(String msg, double &p_constant, double &i_constant, double &d_constant){ + double new_p = Kpx; + double new_i = Kix; + double new_d = Kdx; + + int len = msg.length(); + int startpoint = 0; + int endpoint = 0; + for (int i = 0; i < len; i++){ + if (msg[i] == 'P'){ + startpoint = i + 1; + for (int j = i + 1; j < len; j++){ + if (msg[j] == ' '){ + endpoint = j; + break; + } else { + endpoint = len; + } + } + if (endpoint > startpoint){ //check to see if it is a valid value + //Serial.println(msg.substring(startpoint, endpoint)); + new_p = msg.substring(startpoint, endpoint).toDouble(); + } + } + + if (msg[i] == 'I'){ + startpoint = i + 1; + for (int j = i + 1; j < len; j++){ + if (msg[j] == ' '){ + endpoint = j; + break; + } else { + endpoint = len; + } + } + if (endpoint > startpoint){ //check to see if it is a valid value + //Serial.println(msg.substring(startpoint, endpoint)); + //i_constant = msg.substring(startpoint, endpoint).toDouble(); + new_i = msg.substring(startpoint, endpoint).toDouble(); + } + } + + if (msg[i] == 'D'){ + startpoint = i + 1; + for (int j = i + 1; j <= len; j++){ + if (msg[j] == ' ' || msg[j] == '\0'){ + endpoint = j; + break; + } else { + endpoint = len; + } + } + if (endpoint > startpoint){ //check to see if it is a valid value + //Serial.println(msg.substring(startpoint, endpoint)); + //d_constant = msg.substring(startpoint, endpoint).toDouble(); + new_d = msg.substring(startpoint, endpoint).toDouble(); + } + } + } + + //DEBUGGING SECTION + unsigned long t = millis(); + debugPIDConstants(DEBUG_KP, p_constant, new_p); + debugPIDConstants(DEBUG_KI, i_constant, new_i); + debugPIDConstants(DEBUG_KD, d_constant, new_d); + + p_constant = new_p; + i_constant = new_i; + d_constant = new_d; + + while(millis() < t+2000); //debugging LED will light up for 2 seconds + panel.singleLED(DEBUG_KP, 0, 0, 0); + panel.singleLED(DEBUG_KI, 0, 0, 0); + panel.singleLED(DEBUG_KD, 0, 0, 0); +} + +void debugPIDConstants(int lednum, double oldval, double newval){ + int r, g, b; + if (newval > oldval){ + panel.singleLED(lednum, 0, 10, 0); + } else if (newval < oldval){ + panel.singleLED(lednum, 10, 0, 0); + } else { //equal + panel.singleLED(lednum, 10, 10, 10); + } +} + +float altitudeCalc(){ + return baro.getAltitude(); +} diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/Camera.cpp b/Code/Control/Feather Code - Aaron/Altitude_Control/Camera.cpp new file mode 100644 index 0000000..fb27cf8 --- /dev/null +++ b/Code/Control/Feather Code - Aaron/Altitude_Control/Camera.cpp @@ -0,0 +1,91 @@ +#include "Camera.h" +#include <Wire.h> +#include <Arduino.h> +#include <openmvrpc.h> + +Camera::Camera(openmv::rpc_i2c_master *intface){ + interface = intface; +} + +void Camera::exe_face_detection(){ + struct { uint16_t x, y, w, h; } face_detection_result; + if (interface->call_no_args(F("face_detection"), &face_detection_result, sizeof(face_detection_result))) { + Serial.print(F("Largest Face Detected [x=")); + Serial.print(face_detection_result.x); + Serial.print(F(", y=")); + Serial.print(face_detection_result.y); + Serial.print(F(", w=")); + Serial.print(face_detection_result.w); + Serial.print(F(", h=")); + Serial.print(face_detection_result.h); + Serial.println(F("]")); + } +} + +bool Camera::exe_apriltag_detection(int ID,int *x_temp,int *y_temp,int *angle_temp){ + struct { uint16_t cx, cy, rot; } result; + if (interface->call(F("apriltags"), &ID, sizeof(ID), &result, sizeof(result))) { + } + if (result.cx == 0 && result.cy == 0 && result.rot == 0){ + return false; + } else { + *x_temp = result.cx; + *y_temp = result.cy; + *angle_temp = result.rot; + return true; + } +} + +bool Camera::exe_color_detection(int8_t l_min, int8_t l_max, int8_t a_min, int8_t a_max, int8_t b_min, int8_t b_max){ + int8_t color_thresholds[6] = {l_min, l_max, a_min, a_max, b_min, b_max}; + short buff[128 + 1] = {}; + if (interface->call(F("color_detection"), color_thresholds, sizeof(color_thresholds), buff, sizeof(buff)-1)) { + int i = 0; + while (buff[i] != '\0' && i<100) { + Serial.print(buff[i]); + i++; + } + Serial.println(""); + } + if (buff[0] == 0){ //no blob detected + return false; + } else { + return true; + } +} + +bool Camera::exe_color_detection_biggestblob(int8_t l_min, int8_t l_max, int8_t a_min, int8_t a_max, int8_t b_min, int8_t b_max, int& x, int&y){ + int8_t color_thresholds[6] = {l_min, l_max, a_min, a_max, b_min, b_max}; + struct { uint16_t cx, cy; } color_detection_result; + if (interface->call(F("color_detection_single"), color_thresholds, sizeof(color_thresholds), &color_detection_result, sizeof(color_detection_result))) { + + } + x = color_detection_result.cx; + y = color_detection_result.cy; + if (x == 0 && y == 0){ + return false; + } else { + return true; + } +} + + +bool Camera::exe_goalfinder(int8_t goal1, int8_t goal2, int8_t goal3, int&id, int&tx, int&ty, int&tz, int&rx, int&ry, int&rz){ + int8_t goalid[3] = {goal1, goal2, goal3}; + struct { uint16_t cid, ctx, cty, ctz, crx, cry, crz; } goalfinder_result; + if(interface->call(F("goalfinder"), goalid, sizeof(goalid), &goalfinder_result, sizeof(goalfinder_result))){ + + } + if (goalfinder_result.crx == 0 && goalfinder_result.cry == 0){ + return false; + } else { + id = goalfinder_result.cid; + tx = goalfinder_result.ctx; + ty = goalfinder_result.cty; + tz = goalfinder_result.ctz; + rx = goalfinder_result.crx; + ry = goalfinder_result.cry; + rz = goalfinder_result.crz; + return true; + } +} diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/Camera.h b/Code/Control/Feather Code - Aaron/Altitude_Control/Camera.h new file mode 100644 index 0000000..5a4536e --- /dev/null +++ b/Code/Control/Feather Code - Aaron/Altitude_Control/Camera.h @@ -0,0 +1,19 @@ +#ifndef CAMERA_H +#define CAMERA_H +#include <openmvrpc.h> + +class Camera +{ + private: + openmv::rpc_i2c_master *interface; + + public: + Camera(openmv::rpc_i2c_master *intface); + void exe_face_detection(); // Face should be about 2ft away. + bool exe_apriltag_detection(int ID,int *x_temp,int *y_temp,int *angle_temp); + bool exe_color_detection(int8_t l_min, int8_t l_max, int8_t a_min, int8_t a_max, int8_t b_min, int8_t b_max); + bool exe_color_detection_biggestblob(int8_t l_min, int8_t l_max, int8_t a_min, int8_t a_max, int8_t b_min, int8_t b_max, int& x, int&y); + bool exe_goalfinder(int8_t goal1, int8_t goal2, int8_t goal3, int&id, int&tx, int&ty, int&tz, int&rx, int&ry, int&rz); //optional to add tag size as parameter? + +}; +#endif diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.cpp b/Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.cpp new file mode 100644 index 0000000..eb4ee53 --- /dev/null +++ b/Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.cpp @@ -0,0 +1,65 @@ +#include "LedPanel.h" + +LedPanel::LedPanel(int pixelnum, int pixelpin){ + led_num = pixelnum; + //pixels = Adafruit_NeoPixel(pixelnum, pixelpin, NEO_GRB + NEO_KHZ800); +} + +void LedPanel::fullPanelLight(int r, int g, int b){ + for (int i=0 ; i<led_num ; i++){ + pixels.setPixelColor(i, r,g,b); + } + pixels.show(); +} + +void LedPanel::beginPanel(){ + pixels.begin(); +} + +void LedPanel::resetPanel(){ + for (int i=0 ; i<led_num ; i++){ + pixels.setPixelColor(i, 0,0,0); + } + pixels.show(); +} + +void LedPanel::topLeftQuadrant(int r, int g, int b){ + for (int i = 0; i<HORIZONTAL_SIZE/2; i++){ + for (int j=0; j<VERTICAL_SIZE/2;j++){ + pixels.setPixelColor(i+j*HORIZONTAL_SIZE, r, g, b); + } + } + pixels.show(); +} + +void LedPanel::bottomLeftQuadrant(int r, int g, int b){ + for (int i = 0; i<HORIZONTAL_SIZE/2; i++){ + for (int j=VERTICAL_SIZE/2; j<VERTICAL_SIZE;j++){ + pixels.setPixelColor(i+j*HORIZONTAL_SIZE, r, g, b); + } + } + pixels.show(); +} + +void LedPanel::topRightQuadrant(int r, int g, int b){ + for (int i = HORIZONTAL_SIZE/2; i<HORIZONTAL_SIZE; i++){ + for (int j=0; j<VERTICAL_SIZE/2;j++){ + pixels.setPixelColor(i+j*HORIZONTAL_SIZE, r, g, b); + } + } + pixels.show(); +} + +void LedPanel::bottomRightQuadrant(int r, int g, int b){ + for (int i = HORIZONTAL_SIZE/2; i<HORIZONTAL_SIZE; i++){ + for (int j=VERTICAL_SIZE/2; j<VERTICAL_SIZE;j++){ + pixels.setPixelColor(i+j*HORIZONTAL_SIZE, r, g, b); + } + } + pixels.show(); +} + +void LedPanel::singleLED(int num, int r, int g, int b) { + pixels.setPixelColor(num, r, g, b); + pixels.show(); +} diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.h b/Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.h new file mode 100644 index 0000000..41721cc --- /dev/null +++ b/Code/Control/Feather Code - Aaron/Altitude_Control/LedPanel.h @@ -0,0 +1,28 @@ +#ifndef LEDPANEL_H +#define LEDPANEL_H + +#include <Adafruit_NeoPixel.h> +#define NUMPIXELS 32 +#define PIN_PIXELS 32 // Use pin 32 for NeoPixels +const int HORIZONTAL_SIZE = 8; +const int VERTICAL_SIZE = 4; + +class LedPanel { + private: + int led_num; + Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800); + + public: + LedPanel(int pixelnum, int pixelpin); + void fullPanelLight(int r, int b, int g); + void resetPanel(); + void topLeftQuadrant(int r, int g, int b); + void bottomLeftQuadrant(int r, int g, int b); + void topRightQuadrant(int r, int g, int b); + void bottomRightQuadrant(int r, int g, int b); + void beginPanel(); + void singleLED(int num, int r, int g, int b); + +}; + +#endif diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/utilities.cpp b/Code/Control/Feather Code - Aaron/Altitude_Control/utilities.cpp new file mode 100644 index 0000000..7a90e33 --- /dev/null +++ b/Code/Control/Feather Code - Aaron/Altitude_Control/utilities.cpp @@ -0,0 +1,83 @@ +#include <math.h> + +//Source: http://www.easyrgb.com/index.php?X=MATH&H=01#text1 +void lab2rgb( float l_s, float a_s, float b_s, float& R, float& G, float& B ) +{ + float var_Y = ( l_s + 16. ) / 116.; + float var_X = a_s / 500. + var_Y; + float var_Z = var_Y - b_s / 200.; + + if ( pow(var_Y,3) > 0.008856 ) var_Y = pow(var_Y,3); + else var_Y = ( var_Y - 16. / 116. ) / 7.787; + if ( pow(var_X,3) > 0.008856 ) var_X = pow(var_X,3); + else var_X = ( var_X - 16. / 116. ) / 7.787; + if ( pow(var_Z,3) > 0.008856 ) var_Z = pow(var_Z,3); + else var_Z = ( var_Z - 16. / 116. ) / 7.787; + + float X = 95.047 * var_X ; //ref_X = 95.047 Observer= 2°, Illuminant= D65 + float Y = 100.000 * var_Y ; //ref_Y = 100.000 + float Z = 108.883 * var_Z ; //ref_Z = 108.883 + + + var_X = X / 100. ; //X from 0 to 95.047 (Observer = 2°, Illuminant = D65) + var_Y = Y / 100. ; //Y from 0 to 100.000 + var_Z = Z / 100. ; //Z from 0 to 108.883 + + float var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986; + float var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415; + float var_B = var_X * 0.0557 + var_Y * -0.2040 + var_Z * 1.0570; + + if ( var_R > 0.0031308 ) var_R = 1.055 * pow(var_R , ( 1 / 2.4 )) - 0.055; + else var_R = 12.92 * var_R; + if ( var_G > 0.0031308 ) var_G = 1.055 * pow(var_G , ( 1 / 2.4 ) ) - 0.055; + else var_G = 12.92 * var_G; + if ( var_B > 0.0031308 ) var_B = 1.055 * pow( var_B , ( 1 / 2.4 ) ) - 0.055; + else var_B = 12.92 * var_B; + + R = var_R * 255.; + G = var_G * 255.; + B = var_B * 255.; + +} + + + + + +//old codes + +// motorVertical->setSpeed(0); +// motorVertical->run(FORWARD); +// // turn on motor +// motorVertical->run(RELEASE); +// Serial.println(SEEKING_SPEED); +// motorLeft->setSpeed(SEEKING_SPEED); +// motorLeft->run(FORWARD); +// motorRight->setSpeed(SEEKING_SPEED); + +// if (abs(Outputx) < 125){ +// motorRight->setSpeed(BASE_SPEED - Outputx); +// motorRight->run(BACKWARD); +// motorLeft->setSpeed(BASE_SPEED + Outputx); //this need to be higher +// motorLeft->run(BACKWARD); +// } else if (Outputx >= 125) { //propeller push in opposite direction, moving to the right +// motorRight->setSpeed(Outputx); +// motorRight->run(FORWARD); +// motorLeft->setSpeed(255); //this need to be higher +// motorLeft->run(BACKWARD); +// } else { +// motorRight->setSpeed(255); +// motorRight->run(BACKWARD); +// motorLeft->setSpeed(Outputx); //this need to be higher +// motorLeft->run(FORWARD); +// } + +// motorVertical->setSpeed(0); +// motorVertical->run(FORWARD); +// // turn on motor +// motorVertical->run(RELEASE); +// motorLeft->setSpeed(0); +// motorLeft->run(FORWARD); +// motorRight->setSpeed(0); +// motorRight->run(BACKWARD); +// motorRight->run(BACKWARD); diff --git a/Code/Control/Feather Code - Aaron/Altitude_Control/utilities.h b/Code/Control/Feather Code - Aaron/Altitude_Control/utilities.h new file mode 100644 index 0000000..a1ad9ad --- /dev/null +++ b/Code/Control/Feather Code - Aaron/Altitude_Control/utilities.h @@ -0,0 +1,8 @@ +#ifndef UTI_H +#define UTI_H + +void lab2rgb( float l_s, float a_s, float b_s, float& R, float& G, float& B ); +void translateCodetoThreshold(int code); + + +#endif diff --git a/Code/Control/Feather Code - Aaron/PID_Test/PID_Test.ino b/Code/Control/Feather Code - Aaron/PID_Test/PID_Test.ino index 2e12cb8..80961fc 100644 --- a/Code/Control/Feather Code - Aaron/PID_Test/PID_Test.ino +++ b/Code/Control/Feather Code - Aaron/PID_Test/PID_Test.ino @@ -6,6 +6,7 @@ #include <Arduino.h> #include "LedPanel.h" #include "utilities.h" +#include <Adafruit_MPL3115A2.h> #include <Adafruit_MotorShield.h> // #include "Adafruit_VL53L0X.h" // #include "ArnholdMesh.h" @@ -57,6 +58,7 @@ Adafruit_DCMotor *motor_HR = AFMS.getMotor(4); Camera cam(&interface); LedPanel panel(NUMPIXELS,PIN_PIXELS); // ArnholdMesh thisNode; +Adafruit_MPL3115A2 baro; //Specify the links and initial tuning parameters double Kpx=2, Kix=0.05, Kdx=0.25; @@ -78,6 +80,12 @@ void setup() { PID_x.SetOutputLimits(-255, 255); //left positive PID_x.SetMode(AUTOMATIC); PID_y.SetMode(AUTOMATIC); + + if (!baro.begin()) { + Serial.println("Barometer not found"); + while(1); + } + baro.setSeaPressure(1016); } void loop() { @@ -108,22 +116,16 @@ void loop() { int ry = 0; int rz = 0; int8_t goal[3] = {0,1,2}; + float altitude = baro.getAltitude(); + - ball_capture = cam.exe_color_detection_biggestblob(threshold[0], threshold[1], threshold[2], threshold[3], threshold[4], threshold[5], x, y) + // Have we captured the ball? + // ball_capture = lidar_output() if(ball_capture){ - if(cam.exe_apriltag_detection(ENDDEMO_TAG, &xtemp, &ytemp, &angletemp)){ - int zero = 0; - moveVertical(zero); - moveHorizontal(zero,zero); - panel.singleLED(DEBUG_STATE, 0, 0, 10); - while(1){ - Serial.println("end of demo"); - } - } - if(cam.exe_goalfinder(goal[0], goal[1], goal[2], id, x, y, tz, rx, ry, rz)){ + if(cam.exe_goalfinder(goal[0], goal[1], goal[2], id, x, y, tz, rx, ry, rz)){ if (displayTracking > 0){ - displayTrackedObject(x, y, RESOLUTION_W, RESOLUTION_H); //THIS NEEDS WORK + displayTrackedObject(x, y, RESOLUTION_W, RESOLUTION_H); //THIS NEEDS WORK } panel.singleLED(DEBUG_STATE, 0, 10, 0); Serial.println("blob detected"); @@ -141,9 +143,8 @@ void loop() { Serial.print("Outputy: "); Serial.println(Outputy); - moveVertical(Outputy); + moveVertical(Outputy); moveHorizontal(Outputx, BASE_SPEED); - } else { //seeking algorithm //panel.resetPanel(); panel.singleLED(DEBUG_STATE, 10, 10, 10); @@ -154,8 +155,15 @@ void loop() { } } else { - // seek the ball - + ball_detect = cam.exe_color_detection_biggestblob(threshold[0], threshold[1], threshold[2], threshold[3], threshold[4], threshold[5], x, y); + if(ball_detect) { + // move towards ball + + } + else { + // seek the ball + // add seeking algorithm - turn around for 360 degrees? + } } } -- GitLab