init commit
This commit is contained in:
parent
d387b9bcdc
commit
b952e9fe1e
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
[submodule "lib/Arduino-PID-Library"]
|
||||
path = lib/Arduino-PID-Library
|
||||
url = https://github.com/br3ttb/Arduino-PID-Library
|
||||
[submodule "lib/DMXSerial"]
|
||||
path = lib/DMXSerial
|
||||
url = https://github.com/mathertel/DMXSerial
|
||||
1
lib/Arduino-PID-Library
Submodule
1
lib/Arduino-PID-Library
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 524a4268fc01e6ea397e7fc5b5d820741e9b662f
|
||||
1
lib/DMXSerial
Submodule
1
lib/DMXSerial
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 46745295694eda720361a18b21ac3d5cba6d872f
|
||||
46
lib/README
Normal file
46
lib/README
Normal file
@ -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 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 <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
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
|
||||
15
platformio.ini
Normal file
15
platformio.ini
Normal file
@ -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
|
||||
lib_deps = DMXSerial
|
||||
103
src/main.cpp
Normal file
103
src/main.cpp
Normal file
@ -0,0 +1,103 @@
|
||||
#include <Arduino.h>
|
||||
#include <DMXSerial.h>
|
||||
#include <PID_v1.h>
|
||||
|
||||
|
||||
// #define SENSOR_PIN A0
|
||||
#define RPWM_PIN 10
|
||||
#define LPWM_PIN 11
|
||||
#define L_EN_PIN 12
|
||||
#define R_EN_PIN 13
|
||||
#define ENCODER_A 2
|
||||
#define ENCODER_B 3
|
||||
|
||||
const int DMX_CHANNEL = 1;
|
||||
|
||||
double pidGain;
|
||||
double currentPosition = 0;
|
||||
double targetPosition = 50;
|
||||
int positionDif = 0;
|
||||
double pidPwm = 0;
|
||||
|
||||
|
||||
PID pid(¤tPosition, &pidPwm, &targetPosition, 2, 5, 1, DIRECT);
|
||||
|
||||
void updateEncoder() {
|
||||
if (digitalRead(ENCODER_B) == LOW) {
|
||||
currentPosition++; // CCW
|
||||
} else {
|
||||
currentPosition--; // CW
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
DMXSerial.init(DMXReceiver);
|
||||
DMXSerial.write(DMX_CHANNEL, 0);
|
||||
|
||||
pinMode(RPWM_PIN, OUTPUT);
|
||||
pinMode(LPWM_PIN, OUTPUT);
|
||||
pinMode(L_EN_PIN, OUTPUT);
|
||||
pinMode(L_EN_PIN, OUTPUT);
|
||||
pinMode(ENCODER_A, INPUT_PULLUP);
|
||||
pinMode(ENCODER_B, INPUT_PULLUP);
|
||||
|
||||
attachInterrupt(digitalPinToInterrupt(ENCODER_A), updateEncoder, RISING);
|
||||
|
||||
pid.SetMode(AUTOMATIC);
|
||||
// pid.SetSampleTime(50);
|
||||
pid.SetOutputLimits(-255, 255);
|
||||
|
||||
|
||||
pinMode(5, OUTPUT);
|
||||
pinMode(6, OUTPUT);
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
// Calculate how long no data bucket was received
|
||||
if (DMXSerial.noDataSince() < 5000) {
|
||||
|
||||
// read recent DMX values and set pwm levels
|
||||
// pidGain = 0.0001 + (0.002 * (DMXSerial.read(DMX_CHANNEL + 1) / 255));
|
||||
// float kP = 10 * (DMXSerial.read(DMX_CHANNEL + 2) / 255);
|
||||
// float kI = 10 * (DMXSerial.read(DMX_CHANNEL + 3) / 255);
|
||||
// float kD = 10 * (DMXSerial.read(DMX_CHANNEL + 4) / 255);
|
||||
|
||||
// pid.SetTunings(kP, kI, kD);
|
||||
|
||||
targetPosition = (DMXSerial.read(DMX_CHANNEL) - 100) * 6; // 0-200. 100 is center, <100 is CW, >100 is CCW. 0 & 200 are 360 degrees
|
||||
|
||||
// PID
|
||||
pid.Compute();
|
||||
|
||||
// positionDif = targetPosition - currentPosition;
|
||||
// pidPwm += (positionDif - pidPwm) * pidGain;
|
||||
// if (pidPwm > 255) pidPwm = 255;
|
||||
// if (pidPwm < -255) pidPwm = -255;
|
||||
|
||||
if (abs(pidPwm > 150)) {
|
||||
digitalWrite(R_EN_PIN, 1);
|
||||
digitalWrite(L_EN_PIN, 1);
|
||||
if (pidPwm > 0) {
|
||||
analogWrite(RPWM_PIN, 0);
|
||||
analogWrite(LPWM_PIN, pidPwm);
|
||||
|
||||
analogWrite(5, 0);
|
||||
analogWrite(6, pidPwm);
|
||||
} else {
|
||||
analogWrite(LPWM_PIN, 0);
|
||||
analogWrite(RPWM_PIN, -pidPwm);
|
||||
|
||||
analogWrite(6, 0);
|
||||
analogWrite(5, -pidPwm);
|
||||
}
|
||||
} else {
|
||||
digitalWrite(R_EN_PIN, 0);
|
||||
digitalWrite(L_EN_PIN, 0);
|
||||
}
|
||||
|
||||
} else {
|
||||
digitalWrite(R_EN_PIN, 0);
|
||||
digitalWrite(L_EN_PIN, 0);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user