-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.ino
140 lines (110 loc) · 3.57 KB
/
main.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <Stepper.h>
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
const int VRx = A0;
const int VRy = A1;
const int SW = 2;
const int motorPin1 = 3;
const int motorPin2 = 4;
const int motorEnablePin = 5;
const int redLEDPin = 7;
int motorSpeedLevel = 1;
const int maxSpeedLevel = 3;
const int speedIncrement = 85;
bool autoMode = false; // Start in manual mode
bool buttonPressed = false;
void setup() {
Serial.begin(9600);
Serial.println("Setup complete");
// Initialize the button pin as input with pull-up resistor
pinMode(SW, INPUT_PULLUP);
// Set initial speed of the stepper motor
myStepper.setSpeed(10); // 10 RPM
// Initialize DC motor pins
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorEnablePin, OUTPUT);
pinMode(redLEDPin, OUTPUT);
digitalWrite(redLEDPin, LOW);
}
void loop() {
// Read joystick values
int xPosition = analogRead(VRx);
int yPosition = analogRead(VRy);
bool currentButtonState = digitalRead(SW) == LOW;
// Check for button press to toggle mode
if (currentButtonState && !buttonPressed) {
autoMode = !autoMode;
Serial.print("Mode changed to: ");
Serial.println(autoMode ? "AUTO" : "MANUAL");
buttonPressed = true;
} else if (!currentButtonState) {
buttonPressed = false;
}
// Control stepper motor based on mode
if (autoMode) {
static bool direction = true;
static unsigned long lastStepTime = 0;
unsigned long currentTime = millis();
if (currentTime - lastStepTime >= 250) { // Change direction every 250ms
lastStepTime = currentTime;
direction = !direction;
}
if (direction) {
Serial.println("Stepping clockwise in auto mode");
myStepper.step(stepsPerRevolution / 7); // Step clockwise for 1/5 a revolution
} else {
Serial.println("Stepping counterclockwise in auto mode");
myStepper.step(-stepsPerRevolution / 7); // Step counterclockwise for 1/5 a revolution
}
} else {
// Control stepper motor based on vertical joystick position (Y axis)
if (yPosition < 300) {
Serial.println("Stepping counterclockwise...");
myStepper.step(stepsPerRevolution / 10);
} else if (yPosition > 700) {
Serial.println("Stepping clockwise...");
myStepper.step(-stepsPerRevolution / 10); /
} else {
Serial.println("Stopping stepper motor...");
// No steps taken, the motor stops naturally
}
}
// Adjust DC motor speed based on horizontal joystick position (X axis)
if (xPosition < 300) {
if (motorSpeedLevel < maxSpeedLevel) {
motorSpeedLevel++;
Serial.print("Increasing speed to level: ");
Serial.println(motorSpeedLevel);
} else {
Serial.println("Already at maximum speed level!");
}
delay(300); // Debounce
} else if (xPosition > 700) {
if (motorSpeedLevel > 0) {
motorSpeedLevel--;
Serial.print("Decreasing speed to level: ");
Serial.println(motorSpeedLevel);
} else {
Serial.println("Already at minimum speed level!");
}
delay(300); // Debounce
}
// Set the speed of the DC motor based on the speed level
int motorSpeed = motorSpeedLevel * speedIncrement;
analogWrite(motorEnablePin, motorSpeed);
// Update LED indicator
if (motorSpeedLevel == 0) {
digitalWrite(redLEDPin, HIGH);
} else {
digitalWrite(redLEDPin, LOW);
}
if (motorSpeed > 0) {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
} else {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
}
delay(5);
}