#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("RECORD = Record | PLAY = Loop 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 && indexPos > 0) {
recording = false;
playing = true;
Serial.print(F("=== LOOP PLAYBACK STARTED | Steps: "));
Serial.print(indexPos);
Serial.println(F(" ==="));
delay(300);
}
// ===== Continuous Playback =====
if (playing) {
playLoopContinuous();
}
}
// ===== Continuous Loop Playback =====
void playLoopContinuous() {
for (byte i = 0; i < indexPos; i++) {
// Stop loop 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);
}
// Jab end ho jaye → dobara start
Serial.println(F("=== LOOP RESTART ==="));
}