/*
Forum: https://forum.arduino.cc/t/using-a-stepper-motor-between-boundaries/1211483
Wokwi: https://wokwi.com/projects/387014223071927297
*/
const int motorPin1 = 8;
const int motorPin2 = 9;
const int motorPin3 = 10;
const int motorPin4 = 11;
const int sensorPin = A0;
//const float minVoltage = 0.42;
//const float maxVoltage = 2.41;
const int minValue = 86;
const int maxValue = 493;
const int totalSteps = 1020;
int position;
boolean moveLeft = true;
int stepNumber = 0;
void setup() {
Serial.begin(9600);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}
void loop() {
if (moveLeft){
turnLeft();
} else {
turnRight();
}
}
int sensorValue(){
return analogRead(sensorPin);
}
void turnLeft(){
position = sensorValue();
if (position > minValue){
stepMotor(-1);
stepNumber--;
} else {
moveLeft = false;
}
}
void turnRight(){
position = sensorValue();
if (position < maxValue){
stepMotor(1);
stepNumber++;
} else {
moveLeft = true;
}
}
void stepMotor(int dir){
Serial.println(position);
if (dir == 1){
for (int i = 0;i <= 3;i++ ){
step(i);
}
} else {
for (int i = 3; i >= 0;i-- ){
step(i);
}
}
}
void step(int aStep) {
switch (aStep) {
case 0:
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
break;
case 1:
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
break;
case 2:
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
break;
case 3:
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
break;
}
delay(10);
}