#include <Servo.h>
// ===== Servo Objects =====
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
// ===== Potentiometer Pins =====
const byte pot1 = A0;
const byte pot2 = A1;
const byte pot3 = A2;
const byte pot4 = A3;
// ===== Button Pins =====
const byte recordBtn = 2;
const byte playBtn = 4;
// ===== Servo Pins =====
const byte s1 = 3;
const byte s2 = 5;
const byte s3 = 6;
const byte s4 = 9;
// ===== Memory Storage =====
#define MAX_STEPS 80
byte pos1[MAX_STEPS];
byte pos2[MAX_STEPS];
byte pos3[MAX_STEPS];
byte pos4[MAX_STEPS];
byte indexPos = 0;
// ===== States =====
bool recording = false;
bool playing = false;
void setup() {
Serial.begin(9600);
servo1.attach(s1);
servo2.attach(s2);
servo3.attach(s3);
servo4.attach(s4);
pinMode(recordBtn, INPUT_PULLUP);
pinMode(playBtn, INPUT_PULLUP);
Serial.println(F("=== Robotic Arm Ready ==="));
Serial.println(F("Press RECORD to start recording"));
Serial.println(F("Press PLAY to playback"));
}
void loop() {
// ===== Manual Control =====
if (!playing) {
byte angle1 = map(analogRead(pot1), 0, 1023, 0, 180);
byte angle2 = map(analogRead(pot2), 0, 1023, 0, 180);
byte angle3 = map(analogRead(pot3), 0, 1023, 0, 180);
byte angle4 = map(analogRead(pot4), 0, 1023, 0, 180);
servo1.write(angle1);
servo2.write(angle2);
servo3.write(angle3);
servo4.write(angle4);
// ===== Recording =====
if (recording && indexPos < MAX_STEPS) {
pos1[indexPos] = angle1;
pos2[indexPos] = angle2;
pos3[indexPos] = angle3;
pos4[indexPos] = angle4;
indexPos++;
Serial.print(F("Recording Step: "));
Serial.println(indexPos);
delay(100);
}
}
// ===== RECORD BUTTON =====
if (digitalRead(recordBtn) == LOW) {
recording = true;
playing = false;
indexPos = 0;
Serial.println(F("=== RECORDING STARTED ==="));
delay(300);
}
// ===== PLAY BUTTON =====
if (digitalRead(playBtn) == LOW) {
if (indexPos > 0) {
recording = false;
playing = true;
Serial.print(F("=== PLAYBACK STARTED | Steps: "));
Serial.print(indexPos);
Serial.println(F(" ==="));
} else {
Serial.println(F("No data recorded!"));
}
delay(300);
}
// ===== Playback =====
if (playing) {
playLoop();
}
}
// ===== Playback Function =====
void playLoop() {
for (byte i = 0; i < indexPos; i++) {
// Stop playback if RECORD pressed
if (digitalRead(recordBtn) == LOW) {
playing = false;
recording = true;
indexPos = 0;
Serial.println(F("=== PLAYBACK STOPPED ==="));
Serial.println(F("=== NEW RECORDING STARTED ==="));
delay(300);
return;
}
servo1.write(pos1[i]);
servo2.write(pos2[i]);
servo3.write(pos3[i]);
servo4.write(pos4[i]);
Serial.print(F("Playing Step: "));
Serial.println(i + 1);
delay(100);
}
Serial.println(F("=== PLAYBACK FINISHED ==="));
playing = false;
}