Skip to content
Snippets Groups Projects
Commit 1990abba authored by mhby1g21's avatar mhby1g21
Browse files

better fist animation

parent d11520bb
No related branches found
No related tags found
No related merge requests found
......@@ -35,7 +35,7 @@ int pinkyTarget = 90;
// Movement parameters
const int STEP_DELAY = 5; // Delay between steps (ms)
const int STEP_SIZE = 15; // Size of each step in degrees
const int STEP_SIZE = 15; // Size of each step in degrees
void setup() {
Serial.begin(9600);
......@@ -72,6 +72,49 @@ void setup() {
server.begin();
}
// Move all servos together for fist motion
void moveAllServosSmooth(int targetPos) {
int maxSteps = 0;
// Calculate the maximum number of steps needed
maxSteps = max(maxSteps, abs(indexTarget - indexPos));
maxSteps = max(maxSteps, abs(middleTarget - middlePos));
maxSteps = max(maxSteps, abs(ringTarget - ringPos));
maxSteps = max(maxSteps, abs(pinkyTarget - pinkyPos));
if (maxSteps > 0) {
// Calculate step size for each finger
float indexStep = (float)(indexTarget - indexPos) / maxSteps;
float middleStep = (float)(middleTarget - middlePos) / maxSteps;
float ringStep = (float)(ringTarget - ringPos) / maxSteps;
float pinkyStep = (float)(pinkyTarget - pinkyPos) / maxSteps;
// Move all fingers together
for (int i = 1; i <= maxSteps; i++) {
// Calculate next position for each finger
int newIndexPos = indexPos + round(indexStep * i);
int newMiddlePos = middlePos + round(middleStep * i);
int newRingPos = ringPos + round(ringStep * i);
int newPinkyPos = pinkyPos + round(pinkyStep * i);
// Move all servos
index_f.write(newIndexPos);
middle.write(newMiddlePos);
ring.write(newRingPos);
pinky.write(newPinkyPos);
delay(STEP_DELAY);
}
// Update the current positions
indexPos = indexTarget;
middlePos = middleTarget;
ringPos = ringTarget;
pinkyPos = pinkyTarget;
}
}
// Individual servo movement for single finger control
void moveServoSmooth(Servo &servo, int &currentPos, int targetPos) {
if (currentPos < targetPos) {
for (int pos = currentPos; pos <= targetPos; pos += STEP_SIZE) {
......@@ -89,11 +132,29 @@ void moveServoSmooth(Servo &servo, int &currentPos, int targetPos) {
}
void loop() {
// Handle smooth servo movements
if (indexPos != indexTarget) moveServoSmooth(index_f, indexPos, indexTarget);
if (middlePos != middleTarget) moveServoSmooth(middle, middlePos, middleTarget);
if (ringPos != ringTarget) moveServoSmooth(ring, ringPos, ringTarget);
if (pinkyPos != pinkyTarget) moveServoSmooth(pinky, pinkyPos, pinkyTarget);
// Check if any finger needs to move to its target position
bool needToMove = (indexPos != indexTarget) ||
(middlePos != middleTarget) ||
(ringPos != ringTarget) ||
(pinkyPos != pinkyTarget);
// If all fingers have the same target (fist motion), move them simultaneously
bool sameFistMotion = (indexTarget == middleTarget &&
middleTarget == ringTarget &&
ringTarget == pinkyTarget);
if (needToMove) {
if (sameFistMotion) {
// Move all fingers together
moveAllServosSmooth(indexTarget);
} else {
// Move individual fingers
if (indexPos != indexTarget) moveServoSmooth(index_f, indexPos, indexTarget);
if (middlePos != middleTarget) moveServoSmooth(middle, middlePos, middleTarget);
if (ringPos != ringTarget) moveServoSmooth(ring, ringPos, ringTarget);
if (pinkyPos != pinkyTarget) moveServoSmooth(pinky, pinkyPos, pinkyTarget);
}
}
WiFiClient client = server.available();
......@@ -127,20 +188,31 @@ void loop() {
client.println(".button:hover { background: #45a049; }");
client.println(".preset { background: #2196F3; }");
client.println(".reset { background: #f44336; }");
client.println(".wave { background: #ff9800; }");
client.println(".fist { background: #9C27B0; }");
client.println("</style>");
client.println("</head>");
client.println("<body>");
client.println("<h1>Robotic Hand Control Panel</h1>");
// Fist motion controls (added at top for prominence)
client.println("<div class='control-group'>");
client.println("<h2>Fist Motion Controls</h2>");
client.println("<button class='button fist' onclick='allFingers(0)'>Close Fist</button>");
client.println("<button class='button fist' onclick='allFingers(180)'>Open Hand</button>");
client.println("<button class='button fist' onclick='fistGrasp()'>Grasp Motion</button>");
client.println("</div>");
// Individual finger controls
String fingers[] = {"Index", "Middle", "Ring", "Pinky"};
int positions[] = {indexPos, middlePos, ringPos, pinkyPos};
String endpoints[] = {"index", "middle", "ring", "pinky"};
client.println("<div class='control-group'>");
client.println("<h2>Individual Finger Controls</h2>");
for(int i = 0; i < 4; i++) {
client.println("<div class='control-group'>");
client.println("<div style='margin-bottom:10px;'>");
client.println("<h3>" + fingers[i] + " Finger</h3>");
client.println("<input type='range' class='slider' min='0' max='180' value='" + String(positions[i]) + "' ");
client.println("oninput='updateFinger(\"" + endpoints[i] + "\", this.value)'>");
......@@ -150,19 +222,12 @@ void loop() {
client.println("<button class='button' onclick='updateFinger(\"" + endpoints[i] + "\", 180)'>Open</button>");
client.println("</div>");
}
// Preset controls
client.println("<div class='control-group'>");
client.println("<h3>Preset Controls</h3>");
client.println("<button class='button preset' onclick='allFingers(0)'>Close All</button>");
client.println("<button class='button preset' onclick='allFingers(180)'>Open All</button>");
client.println("<button class='button reset' onclick='resetPositions()'>Reset to 90°</button>");
client.println("</div>");
// Wave motion controls
// Additional preset controls
client.println("<div class='control-group'>");
client.println("<h3>Wave Motion</h3>");
client.println("<button class='button wave' onclick='startWave()'>Start Wave</button>");
client.println("<h3>Other Controls</h3>");
client.println("<button class='button reset' onclick='resetPositions()'>Reset to 90°</button>");
client.println("</div>");
// JavaScript
......@@ -172,23 +237,20 @@ void loop() {
client.println("}");
client.println("function allFingers(angle) {");
client.println(" ['index', 'middle', 'ring', 'pinky'].forEach(finger => {");
client.println(" updateFinger(finger, angle);");
client.println(" });");
client.println(" fetch('/fist/' + angle);");
client.println("}");
client.println("function resetPositions() {");
client.println(" allFingers(90);");
client.println("}");
client.println("function startWave() {");
client.println(" let fingers = ['index', 'middle', 'ring', 'pinky'];");
client.println(" let delay = 0;");
client.println(" fingers.forEach(finger => {");
client.println(" setTimeout(() => updateFinger(finger, 180), delay);");
client.println(" setTimeout(() => updateFinger(finger, 0), delay + 1000);");
client.println(" delay += 500;");
client.println(" });");
client.println("function fistGrasp() {");
client.println(" // Open hand first");
client.println(" allFingers(180);");
client.println(" // Close after a delay");
client.println(" setTimeout(() => allFingers(0), 1500);");
client.println(" // Open again after another delay");
client.println(" setTimeout(() => allFingers(180), 3000);");
client.println("}");
client.println("</script>");
......@@ -223,7 +285,16 @@ void processRequest(String request) {
Serial.println("Command: " + command);
// Parse command and set target positions
if (command.startsWith("/index/")) {
if (command.startsWith("/fist/")) {
// Set all fingers to same position
int angle = constrain(command.substring(6).toInt(), 0, 180);
indexTarget = angle;
middleTarget = angle;
ringTarget = angle;
pinkyTarget = angle;
Serial.println("Moving all fingers to " + String(angle));
}
else if (command.startsWith("/index/")) {
indexTarget = constrain(command.substring(7).toInt(), 0, 180);
Serial.println("Moving index to " + String(indexTarget));
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment