From fd3155f49d1e607ca7edeedc26153a0630a74e91 Mon Sep 17 00:00:00 2001 From: Alexander Klein Date: Wed, 4 Oct 2023 09:22:54 +0200 Subject: [PATCH 1/4] added cppcheck --- .gitignore | 3 +-- rover.cppcheck | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 rover.cppcheck diff --git a/.gitignore b/.gitignore index 72abbae..c8ced1f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,11 +3,10 @@ .vscode/c_cpp_properties.json .vscode/launch.json .vscode/ipch +rover-cppcheck-build-dir doc/Doxygen/html* doc/Doxygen/generated* - - workspace.code-workspace projektarbeit.code-workspace diff --git a/rover.cppcheck b/rover.cppcheck new file mode 100644 index 0000000..d853181 --- /dev/null +++ b/rover.cppcheck @@ -0,0 +1,16 @@ + + + rover-cppcheck-build-dir + false + true + true + 2 + 100 + + + + + + + rover + From 692adf7e16b5450ebfa244d60268a3c8fa9865d5 Mon Sep 17 00:00:00 2001 From: Alexander Klein Date: Tue, 10 Oct 2023 17:06:30 +0200 Subject: [PATCH 2/4] - todos - test driving --- doc/TODO allgemein.txt | 12 ++++++++---- include/config.h | 9 +++++---- lib/Speedometer/speedometer.cpp | 13 +++++++++++-- lib/Speedometer/speedometer.h | 10 ++-------- platformio.ini | 5 ++--- src/driveModi/Modi/TestMode/testMode.cpp | 4 ++-- src/driveModi/Modi/TestMode/testMode.h | 2 -- src/moveControl.cpp | 14 ++++++++------ 8 files changed, 38 insertions(+), 31 deletions(-) diff --git a/doc/TODO allgemein.txt b/doc/TODO allgemein.txt index b1d53b8..5be3695 100644 --- a/doc/TODO allgemein.txt +++ b/doc/TODO allgemein.txt @@ -37,20 +37,24 @@ Do later: -> Check speration between Ui and Route (RouteMenu) -> update sparkfun gnss auf v3 für SPI korrekturdatenüvbetragung -> Rover Objekt mit Error zustand freeze, damit das wenn möglich auch auf dem Display angezeigt wird. + -> ESP und Sensoren in den DeepSleep für Auschalten oder Akkuschutz Do now: Code: Doxygen Kommentare aktualisieren - esp und sensoren in den deepsleep magic numbers etc + speedometer geschwindigkeit auch als rad/s + Menu in Lib Folder packen + testMode einzelner Motor testen klappt nicht + Fernbedienung! Latex: Anhang: Liste mit allen Komponenten und Kurzbeschreibung Unterschied funktionale und nicht funktionale Anforderungen - Strom nicht über Zeit sondern Rampe - Formel für Zeit anfahrrampe Einheiten - Überall den Durchmesser der Räder auf 12cm und Pulse auf 384 / 3 = 128 + Overfull H-Boxen + Test Motor, Zeiten kontrolieren. Wenn einfach so dann bezug auf fehler bei Timing und freeRtos + Bild mit RPY einbinden 3D: diff --git a/include/config.h b/include/config.h index d8e60c1..cf8e055 100644 --- a/include/config.h +++ b/include/config.h @@ -35,18 +35,19 @@ namespace PinNumbers { } namespace Settings { - constexpr float wheelDiameter = 0.1263; - constexpr uint16_t encoderSteps = 360; + constexpr float wheelDiameter = 0.105; + constexpr float wheelDistance = 0.255; + constexpr uint16_t encoderSteps = 384; namespace Pid { namespace Left { - constexpr uint8_t P = 75; + constexpr uint8_t P = 5; constexpr uint8_t I = 0; constexpr uint8_t D = 0; } namespace Right { - constexpr uint8_t P = 75; + constexpr uint8_t P = 5; constexpr uint8_t I = 0; constexpr uint8_t D = 0; } diff --git a/lib/Speedometer/speedometer.cpp b/lib/Speedometer/speedometer.cpp index 8313efa..7132b56 100644 --- a/lib/Speedometer/speedometer.cpp +++ b/lib/Speedometer/speedometer.cpp @@ -16,14 +16,14 @@ Speedometer::Speedometer(uint8_t pin, double diameter, uint16_t steps) { this->steps = steps; this->pulseCounter = new Counter(pin); - this->pulseCounter->setFilterValue(1000); // ignore pulses less than 1000 x 2.5ns + this->pulseCounter->setFilterValue(1023); // ignore pulses less than 1000 x 2.5ns this->pulseCounter->clear(); this->pulseCounter->resume(); Component::loopDelay = Speedometer::loopDelay; - clearAvgBuf(); + this->clearAvgBuf(); } Speedometer::~Speedometer() { @@ -47,18 +47,27 @@ void Speedometer::run() { double n = (double)pulse / this->steps; // Wheel revolutions in absolute time double u = n / ((double)elapsedTime / 1000); // Wheel revolutions per second double ms = u * (diameter * PI); // Speed in m/s + double rad = u * 2 * PI; + + if (speed < 0.1) { + speed = 0; + rad = 0; + } switch (this->currentDirection) { case Direction::Forward : this->speed = ms; + this->rad = rad; break; case Direction::Backward : this->speed = -ms; + this->rad = -rad; break; case Direction::None : this->speed = 0; + this->rad = 0; break; } diff --git a/lib/Speedometer/speedometer.h b/lib/Speedometer/speedometer.h index ae78366..a1635fb 100644 --- a/lib/Speedometer/speedometer.h +++ b/lib/Speedometer/speedometer.h @@ -59,13 +59,6 @@ class Speedometer : public Component { */ void setDirection(Direction dir); - /** - * @brief Set the number of last values ​​to be taken into account for the average. - * - * @param val length of the array - */ - void setNumOfValForAvg(uint8_t val); - /** * @brief Set the Enc Filter to prevent bouncing * @@ -88,6 +81,7 @@ class Speedometer : public Component { * @return double speed in m/s */ double getSpeed() const { return this->speed; } + double getSpeedRad() const { return this->rad; }; double getAvgSpeed() const; /** @@ -111,7 +105,6 @@ class Speedometer : public Component { private: void run() override; - void init(uint8_t pin, double diameter, uint16_t steps); void clearAvgBuf(); void addValToBuf(int16_t val); int16_t calcAverage() const; @@ -126,6 +119,7 @@ class Speedometer : public Component { bool calibrationRunning = false; double speed = 0; + double rad = 0; double diameter; uint8_t printCounter = 0; diff --git a/platformio.ini b/platformio.ini index c5bc22d..36de8e2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,7 +15,7 @@ board_build.partitions = no_ota.csv framework = arduino monitor_speed = 115200 upload_speed = 921600 -monitor_port = COM6 +monitor_port = COM3 lib_deps = https://git.kleiax.de/PlatformIO-Libs/SparkFunGNSS.git knolleary/PubSubClient@^2.8 @@ -24,9 +24,8 @@ lib_deps = bblanchon/ArduinoJson@^6.20.0 mprograms/QMC5883LCompass@^1.2.0 https://git.kleiax.de/PlatformIO-Libs/Menu.git - nrf24/RF24@^1.4.5 jrowberg/I2Cdevlib-MPU6050@^1.0.0 -upload_port = COM6 +upload_port = COM3 test_ignore = test_desktop build_type = debug monitor_filters = esp32_exception_decoder diff --git a/src/driveModi/Modi/TestMode/testMode.cpp b/src/driveModi/Modi/TestMode/testMode.cpp index cb067d1..b937a34 100644 --- a/src/driveModi/Modi/TestMode/testMode.cpp +++ b/src/driveModi/Modi/TestMode/testMode.cpp @@ -112,7 +112,7 @@ void TestMode::abortManeuver() { } uint8_t TestMode::getRemainingManeuverTime() const { - if (busy) + if (this->busy) return (uint8_t) ((this->maneuverTime - (millis() - this->actionStart)) / 1000); return 0; } @@ -120,7 +120,7 @@ uint8_t TestMode::getRemainingManeuverTime() const { bool TestMode::engineInit(int16_t powerPercentage, int16_t seconds) { if (this->busy) return false; - if (powerPercentage >= 100 || powerPercentage <= -100) + if (powerPercentage > 100 || powerPercentage < -100) return false; if (seconds < 0) return false; diff --git a/src/driveModi/Modi/TestMode/testMode.h b/src/driveModi/Modi/TestMode/testMode.h index bae19de..1480e36 100644 --- a/src/driveModi/Modi/TestMode/testMode.h +++ b/src/driveModi/Modi/TestMode/testMode.h @@ -14,7 +14,6 @@ #include #include "moveControl.h" -#include "navigation.h" #include "driveModi/driveModi.h" @@ -97,7 +96,6 @@ class TestMode : public DriveModi { void run() override; bool engineInit(int16_t powerPercentage, int16_t seconds); - Navigation* navigation; Maneuver maneuver = Maneuver::None; int16_t maneuverValueOne = 0; int16_t maneuverValueTwo = 0; diff --git a/src/moveControl.cpp b/src/moveControl.cpp index 20c9248..d7614a4 100644 --- a/src/moveControl.cpp +++ b/src/moveControl.cpp @@ -170,12 +170,12 @@ void MoveControl::calcTargetWheelSpeed() { \ 1 -b / \ T / \ Xr / */ // (1 / r) * 1 - constexpr double A = 15.82278481; + constexpr double A = 1.0 / (Settings::wheelDiameter / 2); // (1 / r) * b - constexpr double B = 2.096518987; + constexpr double B = (1.0 / (Settings::wheelDiameter / 2)) * (Settings::wheelDistance / 2); - this->wheelspeed_right_target = (A * this->drivingSpeeds.x + B * this->drivingSpeeds.rot) * (Settings::wheelDiameter / 2); - this->wheelspeed_left_target = (A * this->drivingSpeeds.x + (-B) * this->drivingSpeeds.rot) * (Settings::wheelDiameter / 2); + this->wheelspeed_right_target = (A * this->drivingSpeeds.x + B * this->drivingSpeeds.rot); + this->wheelspeed_left_target = (A * this->drivingSpeeds.x + (-B) * this->drivingSpeeds.rot); } void MoveControl::regulateMotors() { @@ -208,6 +208,8 @@ void MoveControl::regulateMotors() { } void MoveControl::updateCurrentWheelSpeed() { - this->wheelspeed_left = this->left_speedometer->getSpeed(); - this->wheelspeed_right = this->right_speedometer->getSpeed(); + this->wheelspeed_left = this->left_speedometer->getSpeedRad(); + this->wheelspeed_right = this->right_speedometer->getSpeedRad(); + // this->wheelspeed_left = this->left_speedometer->getSpeed(); + // this->wheelspeed_right = this->right_speedometer->getSpeed(); } From f41cf5c6ebe0e0f631821f66e1a8919a4e064c7a Mon Sep 17 00:00:00 2001 From: Alexander Klein Date: Tue, 10 Oct 2023 18:11:46 +0200 Subject: [PATCH 3/4] an update --- doc/TODO allgemein.txt | 1 - src/moveControl.cpp | 2 -- 2 files changed, 3 deletions(-) diff --git a/doc/TODO allgemein.txt b/doc/TODO allgemein.txt index 5be3695..6a0ff6a 100644 --- a/doc/TODO allgemein.txt +++ b/doc/TODO allgemein.txt @@ -44,7 +44,6 @@ Do now: Code: Doxygen Kommentare aktualisieren magic numbers etc - speedometer geschwindigkeit auch als rad/s Menu in Lib Folder packen testMode einzelner Motor testen klappt nicht Fernbedienung! diff --git a/src/moveControl.cpp b/src/moveControl.cpp index d7614a4..0f741c5 100644 --- a/src/moveControl.cpp +++ b/src/moveControl.cpp @@ -210,6 +210,4 @@ void MoveControl::regulateMotors() { void MoveControl::updateCurrentWheelSpeed() { this->wheelspeed_left = this->left_speedometer->getSpeedRad(); this->wheelspeed_right = this->right_speedometer->getSpeedRad(); - // this->wheelspeed_left = this->left_speedometer->getSpeed(); - // this->wheelspeed_right = this->right_speedometer->getSpeed(); } From a00e8d6d03bde25db11293999fa4203214ee6c6e Mon Sep 17 00:00:00 2001 From: Alexander Klein Date: Wed, 11 Oct 2023 11:38:17 +0200 Subject: [PATCH 4/4] fix pwm channel --- doc/TODO allgemein.txt | 18 ++---------------- include/config.h | 2 +- include/networkConfig.h | 14 +++++++++++++- platformio.ini | 5 ++--- src/driveModi/Modi/TestMode/testMode.cpp | 3 ++- src/moveControl.cpp | 10 +++++++--- 6 files changed, 27 insertions(+), 25 deletions(-) diff --git a/doc/TODO allgemein.txt b/doc/TODO allgemein.txt index 6a0ff6a..d89abe9 100644 --- a/doc/TODO allgemein.txt +++ b/doc/TODO allgemein.txt @@ -6,7 +6,6 @@ Do later: -> Program underfloorLighting -> Add an beeper -> Program the beeper - -> Update GNSS Lib to v3 -> Engine slow down without curve in motorControl -> Network clean up (Mqtt remove?) -> Extra class for maneuver, autopilot should inherit from int16_t @@ -19,16 +18,7 @@ Do later: -> Menu Display from parent as run() to make Menu as Component -> Racing Mode -> ConsolControl - -> Menü für Sensordaten (kann in jedem Betriebsmodus aufgerufen werden) - - GNSS - - Ntrip - - CalcCompass - - RealCompass - - Gyroskop - - Geschwindigkeiten (vielleicht) -> Menü für Einstellungen - - PID - - Geschwindigkeiten - WiFi (save in Flash) -> Battery - tabelle mit eigenen Werten übergeben und nicht in header (wiederverwendbarkeit) @@ -44,8 +34,6 @@ Do now: Code: Doxygen Kommentare aktualisieren magic numbers etc - Menu in Lib Folder packen - testMode einzelner Motor testen klappt nicht Fernbedienung! Latex: @@ -53,8 +41,6 @@ Latex: Unterschied funktionale und nicht funktionale Anforderungen Overfull H-Boxen Test Motor, Zeiten kontrolieren. Wenn einfach so dann bezug auf fehler bei Timing und freeRtos - Bild mit RPY einbinden + Was mit den nicht erfüllten Anforderungen machen? + Hardware doppelt erklärt -3D: - -Rover: diff --git a/include/config.h b/include/config.h index cf8e055..5b86d4a 100644 --- a/include/config.h +++ b/include/config.h @@ -30,7 +30,7 @@ namespace PinNumbers { constexpr uint8_t dir2 = 23; constexpr uint8_t pwm = 22; constexpr uint8_t encoder = 33; - constexpr uint8_t pmwChannel = 0; + constexpr uint8_t pmwChannel = 1; } } diff --git a/include/networkConfig.h b/include/networkConfig.h index e5b0bc3..8e28c90 100644 --- a/include/networkConfig.h +++ b/include/networkConfig.h @@ -14,7 +14,7 @@ #include -#define HOTSPOT +#define HW1 #ifdef HOTSPOT namespace NetworkConfig { @@ -28,6 +28,18 @@ namespace NetworkConfig { } #endif //HOTSPOT +#ifdef HW1 +namespace NetworkConfig { + const char ssid[] = "hw1_gast"; + const char password[] = "KeineAhnung"; + const char ip[] = "192.168.0.4"; + const char subnet[] = "255.255.255.0"; + const char gateway[] = "192.168.0.1"; + const char dns[] = "8.8.8.8"; + const bool mqtt = false; +} +#endif //HW1 + //Network config Rhede #ifdef RHEDE namespace NetworkConfig { diff --git a/platformio.ini b/platformio.ini index 36de8e2..df2e73e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,7 +15,7 @@ board_build.partitions = no_ota.csv framework = arduino monitor_speed = 115200 upload_speed = 921600 -monitor_port = COM3 +monitor_port = COM6 lib_deps = https://git.kleiax.de/PlatformIO-Libs/SparkFunGNSS.git knolleary/PubSubClient@^2.8 @@ -23,9 +23,8 @@ lib_deps = marcoschwartz/LiquidCrystal_I2C@^1.1.4 bblanchon/ArduinoJson@^6.20.0 mprograms/QMC5883LCompass@^1.2.0 - https://git.kleiax.de/PlatformIO-Libs/Menu.git jrowberg/I2Cdevlib-MPU6050@^1.0.0 -upload_port = COM3 +upload_port = COM6 test_ignore = test_desktop build_type = debug monitor_filters = esp32_exception_decoder diff --git a/src/driveModi/Modi/TestMode/testMode.cpp b/src/driveModi/Modi/TestMode/testMode.cpp index b937a34..2c03b0a 100644 --- a/src/driveModi/Modi/TestMode/testMode.cpp +++ b/src/driveModi/Modi/TestMode/testMode.cpp @@ -17,7 +17,7 @@ void TestMode::run() { this->abort = true; } - if (millis() - this->actionStart > this->maneuverTime || this->abort) { + if (this->busy && millis() - this->actionStart > this->maneuverTime || this->abort) { this->busy = false; this->abort = false; this->moveControl->setDrivingStatus(MoveControl::Status::Stop); @@ -83,6 +83,7 @@ bool TestMode::leftEngine(int16_t powerPercentage, int16_t seconds) { if (this->engineInit(powerPercentage, seconds)) { this->moveControl->setRawPowerLeft(powerPercentage); this->maneuver = Maneuver::LeftEngine; + std::cout << "TestMode::leftEngine" << std::endl; return true; } return false; diff --git a/src/moveControl.cpp b/src/moveControl.cpp index 0f741c5..aee387e 100644 --- a/src/moveControl.cpp +++ b/src/moveControl.cpp @@ -44,7 +44,7 @@ MoveControl::MoveControl() { this->right_motor->init(PinNumbers::RightMotor::pwm, PinNumbers::RightMotor::pmwChannel, PinNumbers::RightMotor::dir1, PinNumbers::RightMotor::dir2); this->addChildComponent(this->left_motor); - this->addChildComponent(this->right_motor); + this->addChildComponent(this->right_motor); this->addChildComponent(this->left_speedometer); this->addChildComponent(this->right_speedometer); } @@ -80,11 +80,15 @@ void MoveControl::setDrivingStatus(Status status) { this->driving_status = status; // switch (this->driving_status) { // case Status::Stop : - // Serial.println("New drivingState = Stop in MoveControl::setDrivingStatus"); + // std::cout << "New drivingState = Stop in MoveControl::setDrivingStatus" << std::endl; // break; // case Status::Drive : - // Serial.println("New drivingState = Drive in MoveControl::setDrivingStatus"); + // std::cout << "New drivingState = Drive in MoveControl::setDrivingStatus" << std::endl; + // break; + + // case Status::Raw : + // std::cout << "New drivingState = Raw in MoveControl::setDrivingStatus" << std::endl; // break; // default: