From f51b525f5bd372dbd39fb9efaa94df7e476bcb48 Mon Sep 17 00:00:00 2001 From: Chris Tarantl Date: Thu, 19 May 2022 10:47:47 +0200 Subject: [PATCH] optimisations --- data/config.json | 4 ++-- src/lvgl_loop.h | 10 ++++----- src/lvgl_setup.h | 4 ++-- src/main.ino | 54 +++++++++++++++++++++++++++++++++--------------- src/nunchuk.h | 38 +++++++++++++++++++++++++++++----- 5 files changed, 79 insertions(+), 31 deletions(-) diff --git a/data/config.json b/data/config.json index f3ca2ec..f0fb41d 100644 --- a/data/config.json +++ b/data/config.json @@ -6,8 +6,8 @@ { "speed_max":300, "speed_min":-300, - "steer_max":100, - "steer_min":-100, + "steer_max":200, + "steer_min":-200, "accel":200, "decel":200, "boost":100, diff --git a/src/lvgl_loop.h b/src/lvgl_loop.h index da4df9a..8f949e9 100644 --- a/src/lvgl_loop.h +++ b/src/lvgl_loop.h @@ -6,8 +6,8 @@ if (first == 0){ lv_label_set_text_fmt(label," "); first = 1; } -//lv_label_set_text_fmt(txt1, "speed: %d", driveSpeed ); -lv_label_set_text_fmt(txt1, "SetSpeed: %d", forwardReverseInput ); +lv_label_set_text_fmt(txt1, "speed: %d", driveSpeed ); +//lv_label_set_text_fmt(txt1, "SetSpeed: %d", forwardReverseInput ); lv_label_set_text_fmt(txt2, "configNum: %d", configNum); lv_label_set_text_fmt(txt3, "%d", configNum); @@ -18,9 +18,9 @@ lv_gauge_set_value (gauge, 0, driveSpeed ); //lv_gauge_set_value (gauge, 1, sentSpeed ); lv_gauge_set_value (gauge2, 0, batVoltage ); -lv_gauge_set_value (gauge3, 0, forwardReverseValue); -lv_gauge_set_value (gauge3, 1, forwardReverseInput); -lv_gauge_set_value (gauge3, 2, myDrive); +//lv_gauge_set_value (gauge3, 0, forwardReverseValue); +//lv_gauge_set_value (gauge3, 1, forwardReverseInput); +//lv_gauge_set_value (gauge3, 2, myDrive); if(motorOn){ diff --git a/src/lvgl_setup.h b/src/lvgl_setup.h index 1a5cacc..4f4f5fb 100644 --- a/src/lvgl_setup.h +++ b/src/lvgl_setup.h @@ -189,9 +189,9 @@ ser3 = lv_chart_add_series(chart, LV_COLOR_GREEN); led1 = lv_led_create(tab5, NULL); - lv_obj_align(led1, NULL, LV_ALIGN_CENTER, 0,0); + lv_obj_align(led1, NULL, LV_ALIGN_CENTER, -50,-30); lv_led_off(led1); led2 = lv_led_create(tab5, NULL); - lv_obj_align(led2, NULL, LV_ALIGN_CENTER, -50,0); + lv_obj_align(led2, NULL, LV_ALIGN_CENTER, -100,-30); lv_led_off(led2); \ No newline at end of file diff --git a/src/main.ino b/src/main.ino index bb0b2e2..0f92523 100644 --- a/src/main.ino +++ b/src/main.ino @@ -17,8 +17,8 @@ struct Config { int speed_min; int steer_max; int steer_min; - int accel_min; - int decel_min; + unsigned int accel_min; + unsigned int decel_min; int boost_max; }; @@ -33,7 +33,7 @@ const char* password = config.passwd; #define PIN_SCL 22 #define WII_I2C_PORT 0 #define READ_TASK_CPU 0 -#define READ_DELAY 30 +#define READ_DELAY 10 static unsigned int controller_type; #define HOVER_SERIAL_BAUD 115200 // [-] Baud rate for HoverSerial (used to communicate with the hoverboard) @@ -71,15 +71,16 @@ int16_t leftRightCalibration = 0; int16_t forwardReverseCalibration = 0; int16_t thresholdMovement = 100; int16_t leftRightValue = 0; +int16_t leftRightInput = 0; int16_t forwardReverseValue = 0; int16_t forwardReverseInput = 0; int16_t OLDleftRightValue = 0; int16_t OLDforwardReverseValue = 0; -int16_t accel = config.accel_min; // Acceleration time [ms] -int16_t decel = config.accel_min; // Acceleration time [ms] +unsigned int accel = config.accel_min; // Acceleration time [ms] +unsigned int decel = config.accel_min; // Acceleration time [ms] int16_t safetyCool = 10; - +boolean rampDrive = false; int16_t myDrive = 0; int16_t oldmyDrive = 0; @@ -105,6 +106,8 @@ typedef struct{ SerialFeedback Feedback; SerialFeedback NewFeedback; +ramp speedRamp; + #include "lvgl_start.h" #include "configload.h" @@ -114,14 +117,15 @@ void setup() M5.begin(); Serial.begin(SERIAL_BAUD); HoverSerial.begin(HOVER_SERIAL_BAUD); + speedRamp.go(0); while (!SPIFFS.begin()) { Serial.println(F("Failed to initialize SPIFFS")); bool formatted = SPIFFS.format(); if(formatted){ - Serial.println("\n\nSuccess formatting"); + Serial.println("\n\nSuccess formatting"); }else{ - Serial.println("\n\nError formatting"); + Serial.println("\n\nError formatting"); } delay(1000); } @@ -158,21 +162,37 @@ int first = 0; #include "hoverboard_telemetry.h" - void forWard(int16_t start, int16_t target){ + void forWard(int16_t start, int16_t target, int8_t direction){ myDrive = start; - while(myDrive < target){ - myDrive = myDrive + 1; + speedRamp.go(myDrive); + if(direction == 1){ + speedRamp.go(target, 200, LINEAR, ONCEFORWARD); // accel + }else{ + speedRamp.go(target, 500, LINEAR, ONCEBACKWARD); // decel } - //myDrive = target; + while(speedRamp.getCompletion() < 100){ + speedRamp.update(); + lv_gauge_set_value (gauge3, 2, myDrive); + } + + //myDrive = target; oldmyDrive = myDrive; } - void backWard(int16_t start, int16_t target){ + void backWard(int16_t start, int16_t target, int8_t direction){ myDrive = start; - while(myDrive > target){ - myDrive = myDrive - 1; + speedRamp.go(myDrive); + if(direction == 1){ + speedRamp.go(target, 200, LINEAR, ONCEBACKWARD); // accel + }else{ + speedRamp.go(target, 500, LINEAR, ONCEFORWARD); // decel + } + while(speedRamp.getCompletion() < 100){ + speedRamp.update(); + lv_gauge_set_value (gauge3, 2, myDrive); } - //myDrive = target; + + //myDrive = target; oldmyDrive = myDrive; } @@ -198,7 +218,7 @@ void loop(void) iTimeSend = millis(); if(motorOn == true){ - SendCommand(leftRightValue, myDrive); + SendCommand(leftRightValue, myDrive * -1); }else{ myDrive = 0; SendCommand(0, 0); diff --git a/src/nunchuk.h b/src/nunchuk.h index d594e00..ad8d2a6 100644 --- a/src/nunchuk.h +++ b/src/nunchuk.h @@ -17,19 +17,22 @@ } // USART command 1000 is 1000 RPM - // 300 + 100 * 0,1,2,3,4 = 300, 400, 500, 600, 700 + // speed 300 + 100 * 0,1,2,3,4 = 300, 400, 500, 600, 700 + // steer 200 + 100 * 0,1,2,3,4 = 200, 300, 400, 500, 600 // mapped Value is sent to Controller and board speeds up delay(200); } + leftRightInput = state.x; leftRightValue = state.x; forwardReverseInput = state.y; forwardReverseValue = state.y; triggerstate = state.z; switchState = state.c; - if( leftRightValue > -15 && leftRightValue < 15 ){ + if( leftRightInput > - 5 && leftRightInput < 5 ){ + leftRightInput = 0; leftRightValue = 0; }else{ @@ -50,10 +53,19 @@ forwardReverseInput = -50; // limit backward }*/ - leftRightValue = map(leftRightValue, -100, 100, config.steer_min, config.steer_max); + leftRightValue = map(leftRightInput, -100, 100, config.steer_min-(config.boost_max*configNum), config.steer_max+(config.boost_max*configNum)); + + if(leftRightValue > 500){ + leftRightValue = 500; + }else if(leftRightValue < 300){ + leftRightValue = 300; + } + forwardReverseValue = map(forwardReverseInput, -100, 100, config.speed_min-(config.boost_max*configNum), config.speed_max+(config.boost_max*configNum)); //myDrive = forwardReverseValue; + lv_gauge_set_value (gauge3, 0, forwardReverseValue); + lv_gauge_set_value (gauge3, 1, forwardReverseInput); if(forwardReverseInput > -5 && forwardReverseInput < 5){ lv_led_off(led1); @@ -66,12 +78,28 @@ if(forwardReverseInput > 5){ // forward lv_led_off(led2); lv_led_on(led1); - forWard(OLDforwardReverseValue, forwardReverseValue); + if(rampDrive){ + if(OLDforwardReverseValue < forwardReverseValue){ + forWard(OLDforwardReverseValue, forwardReverseValue, 1); // accel + }else{ + forWard(OLDforwardReverseValue, forwardReverseValue, 0); // decel + } + }else{ + myDrive = forwardReverseValue; + } }else if(forwardReverseInput < -5){ // backward lv_led_on(led2); lv_led_off(led1); - backWard(OLDforwardReverseValue, forwardReverseValue); + if(rampDrive){ + if(OLDforwardReverseValue > forwardReverseValue){ + backWard(OLDforwardReverseValue, forwardReverseValue, 1); // accel + }else{ + backWard(OLDforwardReverseValue, forwardReverseValue, 0); // decel + } + }else{ + myDrive = forwardReverseValue; + } } }