From 6ad32792b841f5de9f460fa3090fe032496af008 Mon Sep 17 00:00:00 2001 From: Gabriel Lima Date: Wed, 8 Mar 2023 19:42:36 -0300 Subject: [PATCH] Lab Encoder plot theta --- Lab Encoder/.gitignore | 5 ++ Lab Encoder/.vscode/extensions.json | 10 +++ Lab Encoder/Serial plot.vi | Bin 0 -> 34067 bytes Lab Encoder/include/README | 39 ++++++++ Lab Encoder/lib/README | 46 ++++++++++ Lab Encoder/platformio.ini | 15 ++++ Lab Encoder/src/main.cpp | 133 ++++++++++++++++++++++++++++ Lab Encoder/test/README | 11 +++ 8 files changed, 259 insertions(+) create mode 100644 Lab Encoder/.gitignore create mode 100644 Lab Encoder/.vscode/extensions.json create mode 100644 Lab Encoder/Serial plot.vi create mode 100644 Lab Encoder/include/README create mode 100644 Lab Encoder/lib/README create mode 100644 Lab Encoder/platformio.ini create mode 100644 Lab Encoder/src/main.cpp create mode 100644 Lab Encoder/test/README diff --git a/Lab Encoder/.gitignore b/Lab Encoder/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/Lab Encoder/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/Lab Encoder/.vscode/extensions.json b/Lab Encoder/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/Lab Encoder/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/Lab Encoder/Serial plot.vi b/Lab Encoder/Serial plot.vi new file mode 100644 index 0000000000000000000000000000000000000000..af06845be87e5f609a685b2ce087f998876db8b6 GIT binary patch literal 34067 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 literal 0 HcmV?d00001 diff --git a/Lab Encoder/include/README b/Lab Encoder/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/Lab Encoder/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/Lab Encoder/lib/README b/Lab Encoder/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/Lab Encoder/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/Lab Encoder/platformio.ini b/Lab Encoder/platformio.ini new file mode 100644 index 0000000..cf558c0 --- /dev/null +++ b/Lab Encoder/platformio.ini @@ -0,0 +1,15 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:uno] +platform = atmelavr +board = uno +framework = arduino +monitor_speed = 115200 \ No newline at end of file diff --git a/Lab Encoder/src/main.cpp b/Lab Encoder/src/main.cpp new file mode 100644 index 0000000..aec669f --- /dev/null +++ b/Lab Encoder/src/main.cpp @@ -0,0 +1,133 @@ +#include + +#define ENCA 2 +#define ENCB 3 + +#define MOTORA 7 +#define MOTORB 8 +#define MOTOREN 9 + +uint8_t state = 0; +uint8_t lastState = 0; + +int32_t theta = 0; +int32_t targetTheta = 100; + +int32_t error = 0; +int32_t lastError = 0; +int32_t dError = 0; +int32_t iError = 0; +int32_t lastInstant = 0; +int32_t instant; +float Kp = 10; +float Kd = 0; +float Ki = 0; + +bool f = false; + +int32_t period = 10000; + +void update() { + delay(1); + lastInstant = instant; + instant = micros(); + int32_t deltaT = instant - lastInstant; + lastError = error; + error = targetTheta - theta; + dError = (error - lastError)/deltaT; + iError = iError + error*deltaT; + if (iError > 255) + iError = 255; + else if (iError < -255) + iError = -255; +} + +int16_t pid() { return Kp * error + Ki * iError + Kd * dError; } + +void setPower(int16_t power) { + if (power > 255) { + power = 255; + } else if (power < -255) { + power = -255; + } + + if (power > 0) { + analogWrite(MOTOREN, power); + digitalWrite(MOTORA, HIGH); + digitalWrite(MOTORB, LOW); + } else { + analogWrite(MOTOREN, -power); + digitalWrite(MOTORA, LOW); + digitalWrite(MOTORB, HIGH); + } +} + +void plot(){ + Serial.print(">timestamp:"); + Serial.println(micros()); + Serial.print(">theta:"); + Serial.println(theta); + Serial.print(">targetTheta:"); + Serial.println(targetTheta); +} + +void encoderIsr() { + lastState = state; + state = (digitalRead(3) << 1) + digitalRead(2); + switch (lastState) { + case 0: + if (state == 1) { + theta++; + } else { + theta--; + } + break; + case 1: + if (state == 3) { + theta++; + } else { + theta--; + } + break; + case 3: + if (state == 2) { + theta++; + } else { + theta--; + } + break; + case 2: + if (state == 0) { + theta++; + } else { + theta--; + } + break; + } +} + +void setup() { + Serial.begin(115200); + pinMode(LED_BUILTIN, OUTPUT); + pinMode(ENCA, INPUT); + pinMode(ENCB, INPUT); + pinMode(MOTORA, OUTPUT); + pinMode(MOTORB, OUTPUT); + pinMode(MOTOREN, OUTPUT); + attachInterrupt(digitalPinToInterrupt(ENCA), encoderIsr, CHANGE); + attachInterrupt(digitalPinToInterrupt(ENCB), encoderIsr, CHANGE); +} + +void loop() { + if (!f && millis() % period < period/2) { + targetTheta = 100; + f = true; + } else if (f && millis() % period > period/2) { + targetTheta = -100; + f = false; + } + plot(); + update(); + setPower(pid()); + delay(10); +} \ No newline at end of file diff --git a/Lab Encoder/test/README b/Lab Encoder/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/Lab Encoder/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html