🧽 Makes servo testing and calibration easier
This commit is contained in:
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user