π― Π‘Π΅Π³ΠΎΠ΄Π½Ρ: Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠΎΠ±ΠΎΡΠ° Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΠ°ΠΌΠΈ
β Π¦Π΅Π»Ρ: ΠΠ°ΡΡΠΈΡΡΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
π¨βπ« Π£ΡΠΈΡΠ΅Π»Ρ: ΠΡ
ΠΌΠ΅ΡΠΎΠ² Π ΡΡΡΠ°ΠΌ
π« Π¨ΠΊΠΎΠ»Π°: ΠΠΠΠ£ β 1362
π
ΠΠ°ΡΠ°: 2025-06-14
β° ΠΡΠ΅ΠΌΡ: 90 ΠΌΠΈΠ½ΡΡ
ΠΡΠΎΠ΅ΠΊΡ Π: Π ΠΎΠ±ΠΎΡ-ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΎΡ π¦Ύ
ΠΡΠΎΠ΅ΠΊΡ Π: Π¨Π°Π³Π°ΡΡΠΈΠΉ ΡΠΎΠ±ΠΎΡ πΆ
ΠΠΎΠ²ΡΠΎΡΡΠ΅ΠΌ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ:
ΠΠΎΠΏΡΠΎΡΡ Π΄Π»Ρ ΡΠ°Π·ΠΌΡΡΠ»Π΅Π½ΠΈΡ:
Π‘Ρ Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ:
Arduino Uno:
π PIN 3 β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 1 (Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΏΠΎΠ²ΠΎΡΠΎΡ)
π PIN 5 β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 2 (ΠΏΠ»Π΅ΡΠΎ)
π PIN 6 β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 3 (ΠΏΡΠ΅Π΄ΠΏΠ»Π΅ΡΡΠ΅)
π PIN 9 β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 4 (Π·Π°Ρ
Π²Π°Ρ)
π΄ 5V β ΠΡΠ΅ ΠΊΡΠ°ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²ΠΎΠ΄Π°
β« GND β ΠΡΠ΅ ΡΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²ΠΎΠ΄Π°
ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ:
ΠΠ°Π·ΠΎΠ²Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
#include <Servo.h>
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΠ°
Servo servo1; // Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΏΠΎΠ²ΠΎΡΠΎΡ
Servo servo2; // ΠΏΠ»Π΅ΡΠΎ
Servo servo3; // ΠΏΡΠ΅Π΄ΠΏΠ»Π΅ΡΡΠ΅
Servo servo4; // Π·Π°Ρ
Π²Π°Ρ
void setup() {
// ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΡ ΠΊ ΠΏΠΈΠ½Π°ΠΌ
servo1.attach(3);
servo2.attach(5);
servo3.attach(6);
servo4.attach(9);
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
moveToHome();
}
void moveToHome() {
servo1.write(90); // ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
servo2.write(90);
servo3.write(90);
servo4.write(90);
delay(1000);
}
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ:
Π§ΡΠΎΠ±Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΠΎΠ² Π΄Π²ΠΈΠ³Π°Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π»ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½ΠΎ Π²ΡΠ΅ΠΌΡ, Π½ΡΠΆΠ½ΠΎ ΡΠ°ΡΡΡΠΈΡΠ°ΡΡ ΡΠΊΠΎΡΠΎΡΡΠΈ:
\[t_{max} = \max\left(\frac{|\theta_{1,ΠΊΠΎΠ½Π΅Ρ} - \theta_{1,ΡΡΠ°ΡΡ}|}{\omega_1}, \frac{|\theta_{2,ΠΊΠΎΠ½Π΅Ρ} - \theta_{2,ΡΡΠ°ΡΡ}|}{\omega_2}, ...\right)\]Π³Π΄Π΅ $\omega_i$ - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠΊΠΎΡΠΎΡΡΡ i-Π³ΠΎ ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΠ°
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ:
void smoothMove(int angle1, int angle2, int angle3, int totalTime) {
int currentAngle1 = servo1.read();
int currentAngle2 = servo2.read();
int currentAngle3 = servo3.read();
int steps = totalTime / 20; // 20 ΠΌΡ Π½Π° ΡΠ°Π³
for (int i = 0; i <= steps; i++) {
float progress = (float)i / steps;
int newAngle1 = currentAngle1 + (angle1 - currentAngle1) * progress;
int newAngle2 = currentAngle2 + (angle2 - currentAngle2) * progress;
int newAngle3 = currentAngle3 + (angle3 - currentAngle3) * progress;
servo1.write(newAngle1);
servo2.write(newAngle2);
servo3.write(newAngle3);
delay(20);
}
}
ΠΠΈΠ½Π΅ΠΌΠ°ΡΠΈΠΊΠ° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΎΡΠ°:
ΠΡΡΠΌΠ°Ρ ΠΊΠΈΠ½Π΅ΠΌΠ°ΡΠΈΠΊΠ° (ΠΎΡ ΡΠ³Π»ΠΎΠ² ΠΊ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ):
\[\begin{cases} x = L_1 \cos(\theta_1) + L_2 \cos(\theta_1 + \theta_2) \\ y = L_1 \sin(\theta_1) + L_2 \sin(\theta_1 + \theta_2) \end{cases}\]ΠΠ±ΡΠ°ΡΠ½Π°Ρ ΠΊΠΈΠ½Π΅ΠΌΠ°ΡΠΈΠΊΠ° (ΠΎΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊ ΡΠ³Π»Π°ΠΌ):
\[\theta_2 = \pm \arccos\left(\frac{x^2 + y^2 - L_1^2 - L_2^2}{2L_1L_2}\right)\] \[\theta_1 = \arctan2(y, x) - \arctan2(L_2\sin(\theta_2), L_1 + L_2\cos(\theta_2))\]ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
Π‘Ρ Π΅ΠΌΠ° ΡΠ±ΠΎΡΠΊΠΈ:
[ΠΠ°Ρ
Π²Π°Ρ] β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 4
β
[ΠΡΠ΅Π΄ΠΏΠ»Π΅ΡΡΠ΅] β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 3
β
[ΠΠ»Π΅ΡΠΎ] β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 2
β
[ΠΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅] β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 1
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ:
#include <Servo.h>
Servo baseServo; // ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅
Servo shoulderServo; // ΠΏΠ»Π΅ΡΠΎ
Servo elbowServo; // ΠΏΡΠ΅Π΄ΠΏΠ»Π΅ΡΡΠ΅
Servo gripperServo; // Π·Π°Ρ
Π²Π°Ρ
void setup() {
baseServo.attach(3);
shoulderServo.attach(5);
elbowServo.attach(6);
gripperServo.attach(9);
homePosition();
delay(2000);
// ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅
pickAndPlace();
}
void homePosition() {
baseServo.write(90); // ΡΠ΅Π½ΡΡ
shoulderServo.write(90); // Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎ
elbowServo.write(90); // ΠΏΡΡΠΌΠΎ
gripperServo.write(90); // ΠΏΠΎΠ»ΡΠΎΡΠΊΡΡΡ
}
void pickAndPlace() {
// 1. ΠΠΎΠ²ΠΎΡΠΎΡ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ
smoothMove(45, 90, 90, 90, 1000);
// 2. ΠΠΏΡΡΠΊΠ°Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ
smoothMove(45, 120, 60, 90, 1500);
// 3. ΠΠ°Ρ
Π²Π°Ρ
smoothMove(45, 120, 60, 180, 800);
// 4. ΠΠΎΠ΄ΡΠ΅ΠΌ
smoothMove(45, 90, 90, 180, 1500);
// 5. ΠΠΎΠ²ΠΎΡΠΎΡ ΠΊ ΡΠ΅Π»ΠΈ
smoothMove(135, 90, 90, 180, 1000);
// 6. ΠΠΏΡΡΠΊΠ°Π½ΠΈΠ΅
smoothMove(135, 120, 60, 180, 1500);
// 7. ΠΡΠΏΡΡΠΊΠ°Π½ΠΈΠ΅
smoothMove(135, 120, 60, 90, 800);
// 8. ΠΠΎΠ·Π²ΡΠ°Ρ Π΄ΠΎΠΌΠΎΠΉ
smoothMove(90, 90, 90, 90, 2000);
}
void smoothMove(int baseAngle, int shoulderAngle,
int elbowAngle, int gripperAngle, int duration) {
int startBase = baseServo.read();
int startShoulder = shoulderServo.read();
int startElbow = elbowServo.read();
int startGripper = gripperServo.read();
int steps = duration / 20;
for (int i = 0; i <= steps; i++) {
float progress = (float)i / steps;
baseServo.write(startBase + (baseAngle - startBase) * progress);
shoulderServo.write(startShoulder + (shoulderAngle - startShoulder) * progress);
elbowServo.write(startElbow + (elbowAngle - startElbow) * progress);
gripperServo.write(startGripper + (gripperAngle - startGripper) * progress);
delay(20);
}
}
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΡΡ ΡΠΎΡΠ΅ΠΊ:
ΠΠ»Ρ 2-Π·Π²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΎΡΠ° ΡΠ°Π±ΠΎΡΠ΅Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ:
\[|L_1 - L_2| \leq \sqrt{x^2 + y^2} \leq L_1 + L_2\]ΠΡΠΎΠ±ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΠΎΡΡΠΈ:
bool isReachable(float x, float y, float L1, float L2) {
float distance = sqrt(x*x + y*y);
return (distance >= abs(L1 - L2)) && (distance <= L1 + L2);
}
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
Π‘Ρ Π΅ΠΌΠ° ΠΊΠΈΠ½Π΅ΠΌΠ°ΡΠΈΠΊΠΈ:
[ΠΠΎΡΠΏΡΡ]
/ \
[ΠΠ΅Π΄ΡΠΎ_Π] [ΠΠ΅Π΄ΡΠΎ_Π] β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΡ 1,3 (ΡΠ°Π·ΠΎΠ±Π΅Π΄ΡΠ΅Π½Π½ΡΠ΅)
| |
[ΠΠΎΠ»Π΅Π½Ρ_Π] [ΠΠΎΠ»Π΅Π½Ρ_Π] β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΡ 2,4 (ΠΊΠΎΠ»Π΅Π½Π½ΡΠ΅)
| |
[Π‘ΡΠΎΠΏΠ°_Π] [Π‘ΡΠΎΠΏΠ°_Π]
Π€Π°Π·Ρ ΡΠ°Π³Π°:
#include <Servo.h>
Servo leftHip; // Π»Π΅Π²ΡΠΉ ΡΠ°Π·ΠΎΠ±Π΅Π΄ΡΠ΅Π½Π½ΡΠΉ
Servo leftKnee; // Π»Π΅Π²ΠΎΠ΅ ΠΊΠΎΠ»Π΅Π½ΠΎ
Servo rightHip; // ΠΏΡΠ°Π²ΡΠΉ ΡΠ°Π·ΠΎΠ±Π΅Π΄ΡΠ΅Π½Π½ΡΠΉ
Servo rightKnee; // ΠΏΡΠ°Π²ΠΎΠ΅ ΠΊΠΎΠ»Π΅Π½ΠΎ
// Π£Π³Π»Ρ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ
ΠΏΠΎΠ·ΠΈΡΠΈΠΉ
int hipCenter = 90; // ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π΄ΡΠ°
int hipForward = 120; // Π±Π΅Π΄ΡΠΎ Π²ΠΏΠ΅ΡΠ΅Π΄
int hipBackward = 60; // Π±Π΅Π΄ΡΠΎ Π½Π°Π·Π°Π΄
int kneeDown = 90; // Π½ΠΎΠ³Π° Π½Π° Π·Π΅ΠΌΠ»Π΅
int kneeUp = 45; // Π½ΠΎΠ³Π° ΠΏΠΎΠ΄Π½ΡΡΠ°
void setup() {
leftHip.attach(3);
leftKnee.attach(5);
rightHip.attach(6);
rightKnee.attach(9);
standingPosition();
delay(2000);
// ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ Ρ
ΠΎΠ΄ΡΠ±Ρ
for(int i = 0; i < 4; i++) {
walkCycle();
}
standingPosition();
}
void standingPosition() {
leftHip.write(hipCenter);
leftKnee.write(kneeDown);
rightHip.write(hipCenter);
rightKnee.write(kneeDown);
delay(500);
}
void walkCycle() {
// Π¨Π°Π³ ΠΏΡΠ°Π²ΠΎΠΉ Π½ΠΎΠ³ΠΎΠΉ
stepRight();
delay(200);
// Π¨Π°Π³ Π»Π΅Π²ΠΎΠΉ Π½ΠΎΠ³ΠΎΠΉ
stepLeft();
delay(200);
}
void stepRight() {
// 1. ΠΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ ΠΏΡΠ°Π²ΡΡ Π½ΠΎΠ³Ρ
rightKnee.write(kneeUp);
delay(300);
// 2. ΠΠ²ΠΈΠ³Π°Π΅ΠΌ ΠΏΡΠ°Π²ΡΡ Π½ΠΎΠ³Ρ Π²ΠΏΠ΅ΡΠ΅Π΄
rightHip.write(hipForward);
delay(400);
// 3. ΠΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠ°Π²ΡΡ Π½ΠΎΠ³Ρ
rightKnee.write(kneeDown);
delay(300);
// 4. ΠΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ Π²Π΅Ρ - ΠΎΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΠΌΡΡ Π»Π΅Π²ΠΎΠΉ Π½ΠΎΠ³ΠΎΠΉ
leftHip.write(hipBackward);
rightHip.write(hipCenter);
delay(400);
}
void stepLeft() {
// 1. ΠΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ Π»Π΅Π²ΡΡ Π½ΠΎΠ³Ρ
leftKnee.write(kneeUp);
delay(300);
// 2. ΠΠ²ΠΈΠ³Π°Π΅ΠΌ Π»Π΅Π²ΡΡ Π½ΠΎΠ³Ρ Π²ΠΏΠ΅ΡΠ΅Π΄
leftHip.write(hipForward);
delay(400);
// 3. ΠΠΏΡΡΠΊΠ°Π΅ΠΌ Π»Π΅Π²ΡΡ Π½ΠΎΠ³Ρ
leftKnee.write(kneeDown);
delay(300);
// 4. ΠΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ Π²Π΅Ρ - ΠΎΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠ°Π²ΠΎΠΉ Π½ΠΎΠ³ΠΎΠΉ
rightHip.write(hipBackward);
leftHip.write(hipCenter);
delay(400);
}
Π¦Π΅Π½ΡΡ ΠΌΠ°ΡΡ ΠΈ ΡΠ°Π²Π½ΠΎΠ²Π΅ΡΠΈΠ΅:
ΠΠ»Ρ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΠΉ Ρ ΠΎΠ΄ΡΠ±Ρ ΡΠ΅Π½ΡΡ ΠΌΠ°ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π½Π°Π΄ ΠΎΠΏΠΎΡΠ½ΠΎΠΉ Π½ΠΎΠ³ΠΎΠΉ:
\[x_{Π¦Π} = \frac{m_{ΠΊΠΎΡΠΏΡΡ} \cdot x_{ΠΊΠΎΡΠΏΡΡ} + m_{Π½ΠΎΠ³Π°} \cdot x_{Π½ΠΎΠ³Π°}}{m_{ΠΎΠ±ΡΠ°Ρ}}\]Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ:
\[|x_{Π¦Π} - x_{ΠΎΠΏΠΎΡΠ°}| < \frac{L_{ΡΡΠΎΠΏΠ°}}{2}\]Π’ΡΠ°Π΅ΠΊΡΠΎΡΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΡΡΠΎΠΏΡ:
ΠΠΏΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΡΠ°Π΅ΠΊΡΠΎΡΠΈΡ ΡΡΠΎΠΏΡ ΠΏΡΠΈ ΡΠ°Π³Π΅:
\[\begin{cases} x(t) = x_0 + v \cdot t \\ y(t) = h \cdot \sin\left(\frac{\pi t}{T}\right) \end{cases}\]Π³Π΄Π΅ h - Π²ΡΡΠΎΡΠ° ΠΏΠΎΠ΄ΡΠ΅ΠΌΠ° Π½ΠΎΠ³ΠΈ, T - Π²ΡΠ΅ΠΌΡ ΡΠ°Π³Π°
ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ:
void smoothStep(float stepLength, float stepHeight, int duration) {
int steps = duration / 20;
for(int i = 0; i <= steps; i++) {
float t = (float)i / steps;
// ΠΠ°ΡΠ°Π±ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΠ°Π΅ΠΊΡΠΎΡΠΈΡ ΠΏΠΎΠ΄ΡΠ΅ΠΌΠ° Π½ΠΎΠ³ΠΈ
float height = stepHeight * sin(PI * t);
// ΠΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΏΠ΅ΡΠ΅Π΄
float forward = stepLength * t;
// ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ Π² ΡΠ³Π»Ρ ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΠΎΠ²
int hipAngle = calculateHipAngle(forward);
int kneeAngle = calculateKneeAngle(height);
rightHip.write(hipAngle);
rightKnee.write(kneeAngle);
delay(20);
}
}
ΠΠ»Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΎΡΠ°:
Arduino β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΡ
PIN 3 β ΠΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅ (base)
PIN 5 β ΠΠ»Π΅ΡΠΎ (shoulder)
PIN 6 β ΠΡΠ΅Π΄ΠΏΠ»Π΅ΡΡΠ΅ (elbow)
PIN 9 β ΠΠ°Ρ
Π²Π°Ρ (gripper)
5V β ΠΡΠ΅ ΠΊΡΠ°ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²ΠΎΠ΄Π°
GND β ΠΡΠ΅ ΡΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²ΠΎΠ΄Π°
ΠΠ»Ρ ΡΠ°Π³Π°ΡΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΎΡΠ°:
Arduino β Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΡ
PIN 3 β ΠΠ΅Π²ΡΠΉ ΡΠ°Π·ΠΎΠ±Π΅Π΄ΡΠ΅Π½Π½ΡΠΉ
PIN 5 β ΠΠ΅Π²ΠΎΠ΅ ΠΊΠΎΠ»Π΅Π½ΠΎ
PIN 6 β ΠΡΠ°Π²ΡΠΉ ΡΠ°Π·ΠΎΠ±Π΅Π΄ΡΠ΅Π½Π½ΡΠΉ
PIN 9 β ΠΡΠ°Π²ΠΎΠ΅ ΠΊΠΎΠ»Π΅Π½ΠΎ
ΠΠΈΡΠ°Π½ΠΈΠ΅:
ΠΠ΅Ρ Π°Π½ΠΈΠΊΠ°:
ΠΡΠ°ΠΏ 1: ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
void testAllServos() {
Serial.println("Π’Π΅ΡΡΠΈΡΡΠ΅ΠΌ ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΡ...");
servo1.write(0); delay(1000);
servo1.write(180); delay(1000);
servo1.write(90); delay(1000);
Serial.println("Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ 1 - OK");
// ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π»Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ
ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΠΎΠ²
}
ΠΡΠ°ΠΏ 2: ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ²
ΠΡΠ°ΠΏ 3: Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
| ΠΡΠΎΠ±Π»Π΅ΠΌΠ° | ΠΡΠΈΡΠΈΠ½Π° | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|
| Π‘Π΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡ Π΄Π΅ΡΠ³Π°Π΅ΡΡΡ | ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ ΠΏΠΈΡΠ°Π½ΠΈΡ | ΠΠ½Π΅ΡΠ½Π΅Π΅ ΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
| ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π·Π°Π΅Π΄Π°Π΅Ρ | ΠΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ° | Π£ΠΌΠ΅Π½ΡΡΠΈΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ |
| ΠΠ΅ΡΠΎΡΠ½ΡΠ΅ ΡΠ³Π»Ρ | ΠΠ»ΠΎΡ Π°Ρ ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²ΠΊΠ° | ΠΠ°ΡΡΡΠΎΠΈΡΡ ΡΠ³Π»Ρ |
| Π ΠΎΠ±ΠΎΡ ΠΏΠ°Π΄Π°Π΅Ρ | ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅ Π±Π°Π»Π°Π½ΡΠ° | ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ |
ΠΠ»Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΎΡΠ°:
ΠΠ»Ρ ΡΠ°Π³Π°ΡΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΎΡΠ°:
ΠΠΎΠ½ΡΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:
ΠΠ»Π°Π½ Π²ΡΡΡΡΠΏΠ»Π΅Π½ΠΈΡ (2 ΠΌΠΈΠ½ΡΡΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ):
Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π½Π°Π²ΡΠΊΠΈ:
ΠΡΠΈΠ½ΡΠΈΠΏΡ ΡΠΎΠ±ΠΎΡΠΎΡΠ΅Ρ Π½ΠΈΠΊΠΈ:
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ:
ΠΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ:
1. ΠΡΡΠ΅Ρ ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ Π‘ΠΎΡΡΠ°Π²ΡΡΠ΅ ΠΎΡΡΠ΅Ρ (2-3 ΡΡΡΠ°Π½ΠΈΡΡ), Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ:
2. ΠΠ½Π°Π»ΠΈΠ· Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ ΠΠΏΠΈΡΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ Π²Π°ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΎΡΠ° ΠΈ ΠΎΠ±ΡΡΡΠ½ΠΈΡΠ΅, ΠΏΠΎΡΠ΅ΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠ°Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°.
3. Π£Π»ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΠΎΡΠ°Π±ΠΎΡΠ°ΠΉΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠ²:
4. ΠΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠ±ΠΎΡΠ° Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΡΠΎΠ±ΠΎΡΠ° Ρ 5-6 ΡΠ΅ΡΠ²ΠΎΠΌΠΎΡΠΎΡΠ°ΠΌΠΈ:
5. ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ:
6. ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΠΈ ΠΈΡΡΠ»Π΅Π΄ΡΠΉΡΠ΅ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΠ΅ΠΌ:
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ:
ΠΠΎΠ²ΡΠ΅ Π·Π½Π°Π½ΠΈΡ:
“Π ΠΎΠ±ΠΎΡ - ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ. ΠΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠΎΠ³Π»Π°ΡΠΈΠΈ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π΄Π»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΉ ΡΠ΅Π»ΠΈ!”
ΠΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠΎΠΊΠ°Ρ :
π― Π‘Π΅Π³ΠΎΠ΄Π½Ρ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π½Π°ΡΡΠΎΡΡΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠΎΠ±ΠΎΡΠΎΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΡΡ ΡΠΈΡΡΠ΅ΠΌΡ!
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ:
ΠΠ»Ρ ΡΠΊΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ²:
β ΠΠ»Ρ ΡΠ³Π»ΡΠ±Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ:
ΠΠ΄Π΅ΠΈ Π΄Π»Ρ ΡΠ°Π·Π²ΠΈΡΠΈΡ:
Π£ΡΠΏΠ΅Ρ ΠΎΠ² Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΎΡΠ΅Π²ΡΡ ΡΠΎΠ±ΠΎΡΠΎΠ²! π€βοΈβ¨