🧽 Makes servo testing and calibration easier

This commit is contained in:
Rune Harlyk
2024-11-26 20:50:11 +01:00
parent 15ec137edb
commit da0c1de47d
2 changed files with 27 additions and 10 deletions
@@ -41,10 +41,11 @@
<SettingsCard collapsible={false}>
<MotorOutline slot="icon" class="lex-shrink-0 mr-2 h-6 w-6 self-end" />
<span slot="title">Servo</span>
{pwm}
<input
type="range"
min="200"
max="400"
min="120"
max="600"
bind:value={pwm}
on:input={updatePWM}
class="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
@@ -56,7 +57,8 @@
<div class="flex flex-col">
<h2 class="text-lg">General servo configuration</h2>
<span class="flex items-center gap-2">
<label for="servoId">Servo active{servoId}</label>
<label for="servoId">Servo active {servoId}</label>
<input type="range" min="0" max="11" step="1" bind:value={servoId} />
<input
type="checkbox"
class="toggle"
@@ -23,6 +23,8 @@
#define EVENT_SERVO_CONFIGURATION_SETTINGS "servoPWM"
#define EVENT_SERVO_STATE "servoState"
enum class SERVO_CONTROL_STATE { DEACTIVATED, PWM, ANGLE };
class ServoController : public StatefulService<ServoSettings> {
public:
ServoController()
@@ -35,10 +37,7 @@ class ServoController : public StatefulService<ServoSettings> {
socket.onEvent(EVENT_SERVO_STATE, [&](JsonObject &root, int originId) { stateUpdate(root, originId); });
_persistence.readFromFS();
_pca.begin();
_pca.setPWMFreq(FACTORY_SERVO_PWM_FREQUENCY);
_pca.setOscillatorFrequency(FACTORY_SERVO_OSCILLATOR_FREQUENCY);
_pca.sleep();
initializePCA();
socket.onEvent(EVENT_SERVO_STATE, [&](JsonObject &root, int originId) {
is_active = root["active"] | false;
is_active ? activate() : deactivate();
@@ -55,6 +54,7 @@ class ServoController : public StatefulService<ServoSettings> {
void activate() {
if (is_active) return;
control_state = SERVO_CONTROL_STATE::ANGLE;
is_active = true;
_pca.wakeup();
}
@@ -62,6 +62,7 @@ class ServoController : public StatefulService<ServoSettings> {
void deactivate() {
if (!is_active) return;
is_active = false;
control_state = SERVO_CONTROL_STATE::DEACTIVATED;
_pca.sleep();
}
@@ -72,8 +73,10 @@ class ServoController : public StatefulService<ServoSettings> {
}
void servoEvent(JsonObject &root, int originId) {
control_state = SERVO_CONTROL_STATE::PWM;
uint8_t servo_id = root["servo_id"];
uint16_t pwm = root["pwm"];
int pwm = root["pwm"].as<int>();
pcaWrite(servo_id, pwm);
ESP_LOGI("SERVO_CONTROLLER", "Setting servo %d to %d", servo_id, pwm);
}
@@ -88,12 +91,13 @@ class ServoController : public StatefulService<ServoSettings> {
void updateActiveState() { is_active ? activate() : deactivate(); }
void setAngles(float new_angles[12]) {
control_state = SERVO_CONTROL_STATE::ANGLE;
for (int i = 0; i < 12; i++) {
target_angles[i] = new_angles[i];
}
}
void updateServoState() {
void calculatePWM() {
for (int i = 0; i < 12; i++) {
angles[i] = lerp(angles[i], target_angles[i], 0.2);
auto &servo = state().servos[i];
@@ -107,13 +111,24 @@ class ServoController : public StatefulService<ServoSettings> {
}
}
void updateServoState() {
if (control_state == SERVO_CONTROL_STATE::ANGLE) calculatePWM();
}
StatefulHttpEndpoint<ServoSettings> endpoint;
private:
void initializePCA() {
_pca.begin();
_pca.setPWMFreq(FACTORY_SERVO_PWM_FREQUENCY);
_pca.setOscillatorFrequency(FACTORY_SERVO_OSCILLATOR_FREQUENCY);
_pca.sleep();
}
FSPersistence<ServoSettings> _persistence;
Adafruit_PWMServoDriver _pca;
uint16_t pwm[16] = {0};
SERVO_CONTROL_STATE control_state = SERVO_CONTROL_STATE::DEACTIVATED;
bool is_active {false};
float angles[12] = {0, 90, -145, 0, 90, -145, 0, 90, -145, 0, 90, -145};