Created
June 29, 2021 10:38
-
-
Save unixfool/2b063d0c8badfe112747ae4d7f64f1d1 to your computer and use it in GitHub Desktop.
Needs Stepper.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Stepper.h" | |
#define STEPS 32 // Number of steps for one revolution of Internal shaft | |
// 2048 steps for one revolution of External shaft | |
volatile boolean TurnDetected; // need volatile for Interrupts | |
volatile boolean rotationdirection; // CW or CCW rotation | |
const int PinCLK=2; // Generating interrupts using CLK signal | |
const int PinDT=3; // Reading DT signal | |
const int PinSW=4; // Reading Push Button switch | |
int RotaryPosition=0; // To store Stepper Motor Position | |
int PrevPosition; // Previous Rotary position Value to check accuracy | |
int StepsToTake; // How much to move Stepper | |
// Setup of proper sequencing for Motor Driver Pins | |
// In1, In2, In3, In4 in the sequence 1-3-2-4 | |
Stepper small_stepper(STEPS, 8, 10, 9, 11); | |
// Interrupt routine runs if CLK goes from HIGH to LOW | |
void isr () { | |
delay(4); // delay for Debouncing | |
if (digitalRead(PinCLK)) | |
rotationdirection= digitalRead(PinDT); | |
else | |
rotationdirection= !digitalRead(PinDT); | |
TurnDetected = true; | |
} | |
void setup () { | |
pinMode(PinCLK,INPUT); | |
pinMode(PinDT,INPUT); | |
pinMode(PinSW,INPUT); | |
digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch | |
attachInterrupt (0,isr,FALLING); // interrupt 0 always connected to pin 2 on Arduino UNO | |
} | |
void loop () { | |
small_stepper.setSpeed(700); //Max seems to be 700 | |
if (!(digitalRead(PinSW))) { // check if button is pressed | |
if (RotaryPosition == 0) { // check if button was already pressed | |
} else { | |
small_stepper.step(-(RotaryPosition*50)); | |
RotaryPosition=0; // Reset position to ZERO | |
} | |
} | |
// Runs if rotation was detected | |
if (TurnDetected) { | |
PrevPosition = RotaryPosition; // Save previous position in variable | |
if (rotationdirection) { | |
RotaryPosition=RotaryPosition-1;} // decrase Position by 1 | |
else { | |
RotaryPosition=RotaryPosition+1;} // increase Position by 1 | |
TurnDetected = false; // do NOT repeat IF loop until new rotation detected | |
// Which direction to move Stepper motor | |
if ((PrevPosition + 1) == RotaryPosition) { // Move motor CW | |
StepsToTake=50; | |
small_stepper.step(StepsToTake); | |
} | |
if ((RotaryPosition + 1) == PrevPosition) { // Move motor CCW | |
StepsToTake=-50; | |
small_stepper.step(StepsToTake); | |
} | |
} | |
digitalWrite(8, LOW); | |
digitalWrite(9, LOW); | |
digitalWrite(10, LOW); | |
digitalWrite(11, LOW); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment