From b6434324cd04b06e4f595a002d8d9c50020889e8 Mon Sep 17 00:00:00 2001 From: Manuel Weiser Date: Fri, 27 Apr 2018 20:38:01 +0200 Subject: [PATCH] initial Version Stepper with Servo --- .gitignore | 4 + .travis.yml | 67 +++++++++++++++++ _versionen/main.cpp | 154 +++++++++++++++++++++++++++++++++++++++ lib/readme.txt | 41 +++++++++++ platformio.ini | 15 ++++ src/main.cpp | 173 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 454 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 _versionen/main.cpp create mode 100644 lib/readme.txt create mode 100644 platformio.ini create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5dac9f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.pioenvs +.piolibdeps +.clang_complete +.gcc-flags.json diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..9443843 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,67 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < http://docs.platformio.org/page/ci/index.html > +# +# Documentation: +# +# * Travis CI Embedded Builds with PlatformIO +# < https://docs.travis-ci.com/user/integration/platformio/ > +# +# * PlatformIO integration with Travis CI +# < http://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < http://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choice one of the following templates (proposed below) and uncomment +# it (remove "# " before each line) or use own configuration according to the +# Travis CI documentation (see above). +# + + +# +# Template #1: General project. Test it using existing `platformio.ini`. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio run + + +# +# Template #2: The project is intended to by used as a library with examples +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# env: +# - PLATFORMIO_CI_SRC=path/to/test/file.c +# - PLATFORMIO_CI_SRC=examples/file.ino +# - PLATFORMIO_CI_SRC=path/to/test/directory +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/_versionen/main.cpp b/_versionen/main.cpp new file mode 100644 index 0000000..e7785b2 --- /dev/null +++ b/_versionen/main.cpp @@ -0,0 +1,154 @@ +#include +#include +#include + +// Steps per Revolution for Small Stepper +#define smallStepperStepsRev 32 + +// Steps per Revolution for Big Stepper +#define bigStepperStepsRev 200 + +// LCD Buttons +#define btnRIGHT 0 +#define btnUP 1 +#define btnDOWN 2 +#define btnLEFT 3 +#define btnSELECT 4 +#define btnNONE 5 + +// Then the pins are entered here in the sequence 1-3-2-4 for proper sequencing +Stepper smallStepper(smallStepperStepsRev, 30, 31, 32, 33); +Stepper bigStepper(bigStepperStepsRev, 52, 53); + +// setup for 'LCD Keypad Shield' +LiquidCrystal lcd(8,9,4,5,6,7); + +/*-----( Declare Variables )-----*/ +// Big Stepper 1 Revolution = 6400 Steps +// Small Stepper 1 Revolution = 2048 Steps +int smallRev = 2048; +int bigRev = 6400; +int revCounter = 0; +int bigStepCounter = 0; +int lcd_key = 0; +int lcd_key_prev = 0; +int adc_key_in = 0; +bool startWind = false; +int whenJump = 3; +int wideJump = 10; + +void setup() +{ + Serial.begin(115200); + Serial.print("Program Start"); + // set up the LCD ////////////////////// + lcd.begin(2, 16); // Set the size of the LCD + lcd.clear(); // Clear the screen + lcd.setCursor(0,0); // Set cursor for next line + lcd.print("Spool Winder"); // Print this line + lcd.setCursor(0,1); // Set cursor for next line + lcd.print("by ManuelW"); // Print this line + delay(3000); // Wait 3 seconds + + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Waiting..."); + lcd.setCursor(0,1); + lcd.print("Turn:" + String(whenJump)); + lcd.setCursor(8,1); + lcd.print("Wide:" + String(wideJump)); +} + +int read_LCD_buttons(){ // read the buttons + adc_key_in = analogRead(0); // read the value from the sensor + + if (adc_key_in > 1000) return btnNONE; + + if (adc_key_in < 50) return btnRIGHT; + if (adc_key_in < 195) return btnUP; + if (adc_key_in < 380) return btnDOWN; + if (adc_key_in < 555) return btnLEFT; + if (adc_key_in < 790) return btnSELECT; + + return btnNONE; // when all others fail, return this. +} + +void moveBigStepper(int Steps2Take, int StepsSpeed) { + bigStepper.setSpeed(StepsSpeed); + bigStepper.step(Steps2Take); +} + +void moveSmallStepper(int Steps2Take, int StepsSpeed) { + smallStepper.setSpeed(StepsSpeed); + smallStepper.step(Steps2Take); +} + +void loop() +{ + //lcd.setCursor(0,1); // move to the begining of the second line + lcd_key_prev = lcd_key; + lcd_key = read_LCD_buttons(); // read the buttons + + if (lcd_key != lcd_key_prev) { + switch (lcd_key){ + case btnRIGHT:{ + wideJump += 1; + lcd.setCursor(8,1); lcd.print(" "); + lcd.setCursor(8,1); lcd.print("Wide:" + String(wideJump)); + break; + } + case btnLEFT:{ + if (wideJump > 1) wideJump -= 1; + lcd.setCursor(8,1); lcd.print(" "); + lcd.setCursor(8,1); lcd.print("Wide:" + String(wideJump)); + break; + } + case btnUP:{ + whenJump += 1; + lcd.setCursor(0,1); lcd.print(" "); + lcd.setCursor(0,1); lcd.print("Turn:" + String(whenJump)); + break; + } + case btnDOWN:{ + if (whenJump > 1) whenJump -= 1; + lcd.setCursor(0,1); lcd.print(" "); + lcd.setCursor(0,1); lcd.print("Turn:" + String(whenJump)); + break; + } + case btnSELECT:{ + //lcd.print("SELECT"); // push button "SELECT" and show the word on the screen + lcd.setCursor(0,0); + lcd.print(" "); + lcd.setCursor(0,0); + if (startWind == false) { + startWind = true; + lcd.print("Running..."); + } + else { + startWind = false; + lcd.print("Stopping..."); + } + break; + } + } + } + + if (startWind == true) { + if (revCounter < whenJump) { + moveBigStepper(1, 1000); + + bigStepCounter++; + if (bigStepCounter == bigRev) { + revCounter++; + bigStepCounter = 0; + } + } + else { + for (int i=0; i<=wideJump; i++) { + moveBigStepper(1, 1000); + moveSmallStepper(1, 500); + } + revCounter = 0; + } + } +} diff --git a/lib/readme.txt b/lib/readme.txt new file mode 100644 index 0000000..131f1bf --- /dev/null +++ b/lib/readme.txt @@ -0,0 +1,41 @@ + +This directory is intended for the project specific (private) libraries. +PlatformIO will compile them to static libraries and link to executable file. + +The source code of each library should be placed in separate directory, like +"lib/private_lib/[here are source files]". + +For example, see how can be organized `Foo` and `Bar` libraries: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) http://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- readme.txt --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +Then in `src/main.c` you should use: + +#include +#include + +// rest H/C/CPP code + +PlatformIO will find your libraries automatically, configure preprocessor's +include paths and build them. + +More information about PlatformIO Library Dependency Finder +- http://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..439e28f --- /dev/null +++ b/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 +; http://docs.platformio.org/page/projectconf.html + +[env:arduino] +platform = atmelavr +board = megaatmega2560 +//board = uno +framework = arduino diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..cebb413 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,173 @@ +#include +#include +#include +#include + +int servoPin = 50; + +Servo servo; + +int servoAngle = 0; + +// Steps per Revolution for Small Stepper +#define smallStepperStepsRev 32 + +// Steps per Revolution for Big Stepper +#define bigStepperStepsRev 200 + +// LCD Buttons +#define btnRIGHT 0 +#define btnUP 1 +#define btnDOWN 2 +#define btnLEFT 3 +#define btnSELECT 4 +#define btnNONE 5 + +// Then the pins are entered here in the sequence 1-3-2-4 for proper sequencing +Stepper smallStepper(smallStepperStepsRev, 30, 31, 32, 33); +Stepper bigStepper(bigStepperStepsRev, 52, 53); + +// setup for 'LCD Keypad Shield' +LiquidCrystal lcd(8,9,4,5,6,7); + +/*-----( Declare Variables )-----*/ +// Big Stepper 1 Revolution = 6400 Steps +// Small Stepper 1 Revolution = 2048 Steps +int smallRev = 2048; +int bigRev = 6400; +int revCounter = 0; +int bigStepCounter = 0; +int lcd_key = 0; +int lcd_key_prev = 0; +int adc_key_in = 0; +bool startWind = false; +int whenJump = 3; +int wideJump = 10; +float servoPos = 0; + +void setup() +{ + Serial.begin(115200); + Serial.print("Program Start"); + + servo.attach(servoPin); + servo.write(servoPos); + + // set up the LCD ////////////////////// + lcd.begin(2, 16); // Set the size of the LCD + lcd.clear(); // Clear the screen + lcd.setCursor(0,0); // Set cursor for next line + lcd.print("Spool Winder"); // Print this line + lcd.setCursor(0,1); // Set cursor for next line + lcd.print("by ManuelW"); // Print this line + delay(3000); // Wait 3 seconds + + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Waiting..."); + lcd.setCursor(0,1); + lcd.print("Turn:" + String(whenJump)); + lcd.setCursor(8,1); + lcd.print("Wide:" + String(wideJump)); +} + +int read_LCD_buttons(){ // read the buttons + adc_key_in = analogRead(0); // read the value from the sensor + + if (adc_key_in > 1000) return btnNONE; + + if (adc_key_in < 50) return btnRIGHT; + if (adc_key_in < 195) return btnUP; + if (adc_key_in < 380) return btnDOWN; + if (adc_key_in < 555) return btnLEFT; + if (adc_key_in < 790) return btnSELECT; + + return btnNONE; // when all others fail, return this. +} + +void moveBigStepper(int Steps2Take, int StepsSpeed) { + bigStepper.setSpeed(StepsSpeed); + bigStepper.step(Steps2Take); +} + +void moveSmallStepper(int Steps2Take, int StepsSpeed) { + smallStepper.setSpeed(StepsSpeed); + smallStepper.step(Steps2Take); +} + +void loop() +{ + lcd_key_prev = lcd_key; + lcd_key = read_LCD_buttons(); // read the buttons + + if (lcd_key != lcd_key_prev) { + switch (lcd_key){ + case btnRIGHT:{ + wideJump += 10; + lcd.setCursor(8,1); lcd.print(" "); + lcd.setCursor(8,1); lcd.print("Wide:" + String(wideJump)); + break; + } + case btnLEFT:{ + if (wideJump > 1) wideJump -= 10; + lcd.setCursor(8,1); lcd.print(" "); + lcd.setCursor(8,1); lcd.print("Wide:" + String(wideJump)); + break; + } + case btnUP:{ + whenJump += 1; + lcd.setCursor(0,1); lcd.print(" "); + lcd.setCursor(0,1); lcd.print("Turn:" + String(whenJump)); + break; + } + case btnDOWN:{ + if (whenJump > 1) whenJump -= 1; + lcd.setCursor(0,1); lcd.print(" "); + lcd.setCursor(0,1); lcd.print("Turn:" + String(whenJump)); + break; + } + case btnSELECT:{ + //lcd.print("SELECT"); // push button "SELECT" and show the word on the screen + lcd.setCursor(0,0); + lcd.print(" "); + lcd.setCursor(0,0); + if (startWind == false) { + startWind = true; + lcd.print("Running..."); + } + else { + startWind = false; + lcd.print("Stopping..."); + } + break; + } + } + } + + if (startWind == true) { + if (revCounter < whenJump) { + moveBigStepper(1, 1000); + + bigStepCounter++; + if (bigStepCounter == bigRev) { + revCounter++; + bigStepCounter = 0; + } + } + else { + for (int i=0; i<=wideJump; i++) { + moveBigStepper(1, 1000); + + if (servoPos >= 170.00) { + servoPos = 0; + } + else { + servoPos +=0.1; + } + servo.write(servoPos); + Serial.println(servoPos); + } + revCounter = 0; + } + } +}