Skip to content

Commit 6b34d89

Browse files
committed
This sketch can be used to set the servo motors to their desired position prior to mounting the servo horns.
1 parent 86d8a07 commit 6b34d89

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/* This example is used for setting all servos to the
2+
* desired initial servo position prior to mounting the
3+
* servo horns.
4+
*/
5+
6+
/**************************************************************************************
7+
* INCLUDE
8+
**************************************************************************************/
9+
10+
#include <Braccio++.h>
11+
12+
/**************************************************************************************
13+
* TYPEDEF
14+
**************************************************************************************/
15+
16+
class InitialServoPosition
17+
{
18+
public:
19+
InitialServoPosition(int const motor_id, float const motor_angle_deg)
20+
: _motor_id{motor_id}
21+
, _motor_angle_deg{motor_angle_deg}
22+
{ }
23+
24+
inline int id() const { return _motor_id; }
25+
inline float angle() const { return _motor_angle_deg; }
26+
27+
private:
28+
int const _motor_id;
29+
float const _motor_angle_deg;
30+
};
31+
32+
/**************************************************************************************
33+
* CONSTANT
34+
**************************************************************************************/
35+
36+
static std::array<InitialServoPosition, 6> const INITIAL_SERVO_POSITION =
37+
{
38+
InitialServoPosition{1, SmartServoClass::MAX_ANGLE / 2.0f},
39+
InitialServoPosition{2, SmartServoClass::MAX_ANGLE / 2.0f},
40+
InitialServoPosition{3, SmartServoClass::MAX_ANGLE / 2.0f},
41+
InitialServoPosition{4, SmartServoClass::MAX_ANGLE / 2.0f},
42+
InitialServoPosition{5, SmartServoClass::MAX_ANGLE / 2.0f},
43+
InitialServoPosition{6, 90.0f},
44+
};
45+
46+
/**************************************************************************************
47+
* FUNCTIONS
48+
**************************************************************************************/
49+
50+
bool set_initial_servo_position(int const id, float const target_angle)
51+
{
52+
Serial.print("Connecting .... ");
53+
for (; !Braccio.get(id).connected(); delay(10)) { }
54+
Serial.println("OK.");
55+
delay(500);
56+
57+
Serial.print("Disengaging ... ");
58+
Braccio.get(id).disengage();
59+
Serial.println("OK.");
60+
delay(500);
61+
62+
Serial.print("Engaging ...... ");
63+
Braccio.get(id).engage();
64+
Serial.println("OK.");
65+
delay(500);
66+
67+
/* Drive to the position for assembling the servo horn. */
68+
auto const start = millis();
69+
auto isTimeout = [start]() -> bool { return ((millis() - start) > 5000); };
70+
auto isTargetAngleReached = [target_angle, id](float const epsilon) -> bool { return (fabs(Braccio.get(id).position() - target_angle) <= epsilon); };
71+
72+
static float constexpr EPSILON = 2.0f;
73+
74+
for ( float current_angle = Braccio.get(id).position();
75+
!isTargetAngleReached(EPSILON) && !isTimeout();)
76+
{
77+
Braccio.get(id).move().to(target_angle).in(200ms);
78+
delay(250);
79+
80+
char msg[64] = {0};
81+
snprintf(msg, sizeof(msg), "Angle (Target | Current) = %.2f | %.2f", target_angle, Braccio.get(id).position());
82+
Serial.println(msg);
83+
}
84+
85+
if (!isTargetAngleReached(EPSILON)) {
86+
Serial.println("Servo did not reach target angle.");
87+
return false;
88+
}
89+
90+
if (isTimeout()) {
91+
Serial.println("Timeout error.");
92+
return false;
93+
}
94+
95+
return true;
96+
}
97+
98+
/**************************************************************************************
99+
* SETUP/LOOP
100+
**************************************************************************************/
101+
102+
void setup()
103+
{
104+
Serial.begin(115200);
105+
while(!Serial) { }
106+
107+
Braccio.begin();
108+
Braccio.disengage();
109+
110+
for (auto & servo : INITIAL_SERVO_POSITION)
111+
{
112+
Serial.print("Servo ");
113+
Serial.print(servo.id());
114+
Serial.print(": Target Angle = ");
115+
Serial.print(servo.angle());
116+
Serial.print(" °");
117+
Serial.println();
118+
119+
if (!set_initial_servo_position(servo.id(), servo.angle())) {
120+
Serial.println("ERROR.");
121+
return;
122+
}
123+
}
124+
125+
Serial.println("SUCCESS : all servos are set to their initial position.");
126+
}
127+
128+
void loop()
129+
{
130+
131+
}

0 commit comments

Comments
 (0)