From 0e5ffebaa76cb0e8b09c8ec6264e889354af00af Mon Sep 17 00:00:00 2001 From: Fisch Date: Tue, 31 Mar 2020 17:13:21 +0200 Subject: [PATCH] migrate from arduino to platformio --- .../mixercontroller_w5100_pio/.gitignore | 1 + .../mixercontroller_w5100_pio/include/README | 39 ++ .../mixercontroller_w5100_pio/lib/README | 46 ++ .../mixercontroller_w5100_pio/platformio.ini | 50 +++ .../mixercontroller_w5100_pio/src/main.ino | 400 ++++++++++++++++++ .../mixercontroller_w5100_pio/test/README | 11 + 6 files changed, 547 insertions(+) create mode 100644 controller/mixercontroller_w5100_pio/.gitignore create mode 100644 controller/mixercontroller_w5100_pio/include/README create mode 100644 controller/mixercontroller_w5100_pio/lib/README create mode 100644 controller/mixercontroller_w5100_pio/platformio.ini create mode 100644 controller/mixercontroller_w5100_pio/src/main.ino create mode 100644 controller/mixercontroller_w5100_pio/test/README diff --git a/controller/mixercontroller_w5100_pio/.gitignore b/controller/mixercontroller_w5100_pio/.gitignore new file mode 100644 index 0000000..03f4a3c --- /dev/null +++ b/controller/mixercontroller_w5100_pio/.gitignore @@ -0,0 +1 @@ +.pio diff --git a/controller/mixercontroller_w5100_pio/include/README b/controller/mixercontroller_w5100_pio/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/controller/mixercontroller_w5100_pio/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/controller/mixercontroller_w5100_pio/lib/README b/controller/mixercontroller_w5100_pio/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/controller/mixercontroller_w5100_pio/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/controller/mixercontroller_w5100_pio/platformio.ini b/controller/mixercontroller_w5100_pio/platformio.ini new file mode 100644 index 0000000..ee561a4 --- /dev/null +++ b/controller/mixercontroller_w5100_pio/platformio.ini @@ -0,0 +1,50 @@ +; 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:pro16MHzatmega328] +platform = atmelavr +board = pro16MHzatmega328 +framework = arduino + +monitor_speed = 9600 + +lib_deps = + # Using library Id + 28 + # Using library Name + Adafruit NeoPixel + # Depend on specific version + Adafruit NeoPixel@1.3.5 + # Semantic Versioning Rules + Adafruit NeoPixel@^1.3.5 + Adafruit NeoPixel@~1.3.5 + Adafruit NeoPixel@>=1.3.5 + + # Using library Id + 89 + # Using library Name + PubSubClient + # Depend on specific version + PubSubClient@2.7 + # Semantic Versioning Rules + PubSubClient@^2.7 + PubSubClient@~2.7 + PubSubClient@>=2.7 + + # Using library Id + 129 + # Using library Name + Encoder + # Depend on specific version + Encoder@1.4.1 + # Semantic Versioning Rules + Encoder@^1.4.1 + Encoder@~1.4.1 + Encoder@>=1.4.1 \ No newline at end of file diff --git a/controller/mixercontroller_w5100_pio/src/main.ino b/controller/mixercontroller_w5100_pio/src/main.ino new file mode 100644 index 0000000..5e02f11 --- /dev/null +++ b/controller/mixercontroller_w5100_pio/src/main.ino @@ -0,0 +1,400 @@ +/* + * TODO: + * bestehende steuerung aus espcontroller übernehmen und testen + * topics und handler implementieren + */ + +#include + +#include +#ifdef __AVR__ + #include +#endif + +#define LEDPIN 9 //PB1 = D9 = Pin15 +Adafruit_NeoPixel leds = Adafruit_NeoPixel(9, LEDPIN, NEO_GRB + NEO_KHZ800); + +uint8_t wheelpos=0; +#include "Ethernet.h" +#include "PubSubClient.h" + +boolean useethernet=false; + +//Ethernet and MQTT +String ip = ""; +uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x06}; + +#define CLIENT_ID "Mixer" +EthernetClient ethClient; +PubSubClient mqttClient; + +#define PUBLISH_DELAY 10000 +long last_send=0; + + + +//Serial +long last_serialdebug=0; +#define INTERVAL_SERIALDEBUG 200 + +//Inputs +#define PIN_BUTTON A3 //A3 = PC3, defining PCx as pin doesnt work +#define PIN_ENCA A2 //A2 = PC2 +#define PIN_ENCB A1 //A1 = PC1 +#define BUTTON_RELEASE_DEBOUNCE 10 //minimum time after button release to reenable triggering + +boolean button_flag=false; //true if button pressed +boolean button_released=true; +long last_button_released=0; //last time button has been released (for debounce) + +//Shift Register 595 +//connections: https://www.arduino.cc/en/tutorial/ShiftOut +#define SRLATCH PD4 //D4 = PD4 +#define SRCLOCK PD3 //D3 = PD3 +#define SRDATA PD2 //D2 = PD2 +uint16_t srbits=0; + +#include +Encoder volEnc(PIN_ENCA,PIN_ENCB); +float encoderMultiplier=4.0; + +//Servo stuff +#define PIN_MOTOR_IN1 PD5 //to L293(pin2) Motor IN1 +#define PIN_MOTOR_IN2 PD6 //to L293(pin7) Motor IN2 +//#define SRPIN_MOTOR_IN1 1 //L293(pin2) Motor IN1 -- moved to atmega pin +//#define SRPIN_MOTOR_IN2 2 //L293(pin7) Motor IN2 -- moved to atmega pin + +#define PIN_POT A0 //A0 = PC0, reference potentiometer wiper +#define DEADZONE_POTI 5 //maximum allowed error. stop when reached this zone +#define POT_MIN 10 //minimum value pot can reach +#define POT_MAX 1010 //maximum value pot can reach +#define POTIFILTER 0.8 //0 to 1. 1 means old value stays forever + +int poti_set=512; //set value +int poti_read=0; //read value from poti +boolean poti_reachedposition=true; //set to true if position reached. after that stop turning + +//#define MOTOR_STOP(); srWrite(SRPIN_MOTOR_IN1,LOW); srWrite(SRPIN_MOTOR_IN2,LOW); +//#define MOTOR_LEFT(); srWrite(SRPIN_MOTOR_IN1,LOW); srWrite(SRPIN_MOTOR_IN2,HIGH); +//#define MOTOR_RIGHT(); srWrite(SRPIN_MOTOR_IN1,HIGH); srWrite(SRPIN_MOTOR_IN2,LOW); +//#define MOTOR_TURNING() (srRead(SRPIN_MOTOR_IN1) != srRead(SRPIN_MOTOR_IN2)) +#define MOTOR_STOP(); digitalWrite(PIN_MOTOR_IN1,LOW); digitalWrite(PIN_MOTOR_IN2,LOW); +#define MOTOR_LEFT(); digitalWrite(PIN_MOTOR_IN1,LOW); digitalWrite(PIN_MOTOR_IN2,HIGH); +#define MOTOR_RIGHT(); digitalWrite(PIN_MOTOR_IN1,HIGH); digitalWrite(PIN_MOTOR_IN2,LOW); +#define MOTOR_TURNING() (digitalRead(PIN_MOTOR_IN1) != digitalRead(PIN_MOTOR_IN2)) + + +//Motorcheck +long last_motorcheck=0; +#define INTERVAL_MOTORCHECK 100 //check motor movement every x ms +int poti_read_last=0; +int motor_vel=0; //analog read units per second +#define MINIMUM_MOTORVEL 20 //minimum velocity motor should turn wenn active +#define MOTOR_FAILTIME 500 //in ms. if motor did not turn fox x amount of time at least with MINIMUM_MOTORVEL an error will initiate +long last_motorTooSlow=0; //typically 0 + +//error +uint8_t error=0; +#define NOERROR 0 +#define MOTORDIDNOTTURN 1 + +void setup() { + pinMode(PIN_BUTTON,INPUT_PULLUP); + + pinMode(PIN_POT,INPUT); + + pinMode(SRLATCH, OUTPUT); + pinMode(SRCLOCK, OUTPUT); + pinMode(SRDATA, OUTPUT); + + Serial.begin(9600); + while (!Serial) {}; + Serial.println("Starting"); + + leds.begin(); + for(uint8_t i=0;i 0) { + int _value = Serial.parseInt(); + if (Serial.read() == '\n') { + Serial.print("value="); + Serial.println(_value); + //poti_set=_value; + //poti_reachedposition=false; //aim for new position + srWrite(_value,!srRead(_value)); + + } + + } + + //Inputs ################################################### + poti_read=poti_read*POTIFILTER + (1.0-POTIFILTER)*analogRead(PIN_POT); //read poti + + if (!digitalRead(PIN_BUTTON)){ //button pressed + if (button_released){ + button_released=false; //flag: not released + if(loopmillis-last_button_released > BUTTON_RELEASE_DEBOUNCE){ + button_flag=true; + } + } + }else if(!button_flag && !button_released){ //button released and flag has been cleared + last_button_released=loopmillis; + button_released=true; + } + + //Read Encoder to velocity "volEncVel" + int volEncVel=0; + int _volEnc=volEnc.read(); + if (_volEnc!=0){ //encoder moved + volEncVel=_volEnc; + volEnc.write(0); //reset value + } + + + //Input Handling + if (volEncVel!=0){ //knob moved + poti_set+=volEncVel*encoderMultiplier; //change poti set value + poti_set=constrain(poti_set, POT_MIN,POT_MAX); + poti_reachedposition=false; + } + + + //Motor Movement Routine ################# + if (error==0){ //no errors + + if (!poti_reachedposition && abs(poti_read-poti_set)>DEADZONE_POTI){ //error too high + if (poti_read-poti_set < 0){ + MOTOR_LEFT(); + }else{ + MOTOR_RIGHT(); + } + }else if(!poti_reachedposition){ //position reached but flag not set + MOTOR_STOP(); + Serial.print("reached:"); + Serial.print(" set="); + Serial.print(poti_set); + Serial.print(" is="); + Serial.print(poti_read); + Serial.print(" vel="); + Serial.println(); + poti_reachedposition=true; //position reached + } + + + if ( loopmillis > last_motorcheck+INTERVAL_MOTORCHECK){ + last_motorcheck=loopmillis; + + motor_vel=(poti_read-poti_read_last)*1000 /INTERVAL_MOTORCHECK ; //calculate current motor velocity + poti_read_last=poti_read; + + //motor fail check + if (MOTOR_TURNING() && abs(motor_vel) MOTOR_FAILTIME){ + error=MOTORDIDNOTTURN; + Serial.println("MOTORDIDNOTTURN"); + } + + }else if (last_motorTooSlow>0){ //was recognized too slow but is now turning fast again + last_motorTooSlow=0; //reset + } + + } + }else{ //an error occured. error!=0 + MOTOR_STOP(); + } + + + + if ( loopmillis > last_serialdebug+INTERVAL_SERIALDEBUG){ + last_serialdebug=loopmillis; + + + Serial.print(" set="); + Serial.print(poti_set); + Serial.print(" is="); + Serial.print(poti_read); + Serial.print(" vel="); + Serial.print(motor_vel); + Serial.println(""); + + if (button_flag){ //TODO: remove hier if correct behaviour implemented + Serial.println("BUTTON Pressed"); + button_flag=false; //clear flag to reenable button triggering. + } + + for(uint8_t i=0;i>8); + shiftOut(SRDATA, SRCLOCK, MSBFIRST, srbits); + digitalWrite(SRLATCH, HIGH); +} +boolean srRead(uint8_t pin){ + return (srbits >> pin) & 1U; +} + + +uint32_t Wheel(byte WheelPos) { + WheelPos = 255 - WheelPos; + if(WheelPos < 85) { + return leds.Color(255 - WheelPos * 3, 0, WheelPos * 3); + } + if(WheelPos < 170) { + WheelPos -= 85; + return leds.Color(0, WheelPos * 3, 255 - WheelPos * 3); + } + WheelPos -= 170; + return leds.Color(WheelPos * 3, 255 - WheelPos * 3, 0); +} diff --git a/controller/mixercontroller_w5100_pio/test/README b/controller/mixercontroller_w5100_pio/test/README new file mode 100644 index 0000000..df5066e --- /dev/null +++ b/controller/mixercontroller_w5100_pio/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing 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 PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html