add servo

This commit is contained in:
unknown 2026-01-23 00:35:06 +03:00
parent 8899ef314a
commit cb4d09b426
6 changed files with 95 additions and 0 deletions

View File

@ -1,6 +1,7 @@
#include "controller.h"
#include "actuators.h"
#include "config.h"
#include "servo.h"
void controllerSetMode(RobotMode m) {
robot.mode = m;
@ -37,3 +38,15 @@ void controllerUpdate() {
controllerStop();
}
}
void controllerSetServo(int angle) {
// серво разрешено двигать ТОЛЬКО в MANUAL или SERVICE
if (robot.mode != MODE_MANUAL && robot.mode != MODE_SERVICE) return;
servoSetAngle(angle);
robot.lastCmdMs = millis();
}
void controllerCenterServo() {
servoCenter();
}

View File

@ -7,3 +7,5 @@ bool controllerMove(const String& cmd);
void controllerStop();
void controllerSetSpeed(int l, int r);
void controllerUpdate();
void controllerSetServo(int angle);
void controllerCenterServo();

View File

@ -5,10 +5,12 @@
#include "controller.h"
#include "robot_state.h"
#include "ws_server.h"
#include "servo.h"
void setup() {
Serial.begin(115200);
servoInit();
actuatorsInit();
webServerInit();
wsInit();

59
src/servo.cpp Normal file
View File

@ -0,0 +1,59 @@
#include <Arduino.h>
#include "servo.h"
// ===== SERVO CONFIG =====
#define SERVO_PIN 27
#define SERVO_CH 4
const uint32_t servoFreq = 50;
const uint8_t servoRes = 16;
// PWM диапазон (у тебя уже рабочий)
const uint32_t SERVO_MIN = 1638;
const uint32_t SERVO_MAX = 8192;
// ===== OFFSET CALIBRATION =====
// ПОЛОЖИТЕЛЬНОЕ значение → вправо
// ОТРИЦАТЕЛЬНОЕ → влево
const int SERVO_OFFSET_DEG = -6; // ← подбирается опытно
// логические пределы
const int SERVO_LOGICAL_MIN = 0;
const int SERVO_LOGICAL_MAX = 180;
static int currentAngle = 90;
// угол → duty
static uint32_t angleToDuty(int logicalAngle) {
// применяем offset
int calibratedAngle = logicalAngle + SERVO_OFFSET_DEG;
// защита от выхода за пределы
calibratedAngle = constrain(calibratedAngle,
SERVO_LOGICAL_MIN,
SERVO_LOGICAL_MAX);
return map(calibratedAngle,
SERVO_LOGICAL_MIN, SERVO_LOGICAL_MAX,
SERVO_MIN, SERVO_MAX);
}
void servoInit() {
ledcSetup(SERVO_CH, servoFreq, servoRes);
ledcAttachPin(SERVO_PIN, SERVO_CH);
servoCenter();
}
void servoCenter() {
currentAngle = 90;
ledcWrite(SERVO_CH, angleToDuty(currentAngle));
}
void servoSetAngle(int angle) {
currentAngle = constrain(angle, SERVO_LOGICAL_MIN, SERVO_LOGICAL_MAX);
ledcWrite(SERVO_CH, angleToDuty(currentAngle));
}
int servoGetAngle() {
return currentAngle;
}

6
src/servo.h Normal file
View File

@ -0,0 +1,6 @@
#pragma once
void servoInit();
void servoCenter();
void servoSetAngle(int angle);
int servoGetAngle();

View File

@ -40,6 +40,19 @@ void wsEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
}
}
else if (msg.startsWith("SERVO:")) { //ws.send("SERVO:90")
Serial.println(msg);
String val = msg.substring(6);
val.toUpperCase();
if (val == "CENTER") {
controllerCenterServo();
} else {
int angle = val.toInt(); // "90" → 90
controllerSetServo(angle);
}
}
else if (msg.startsWith("SPEED:")) {
int v = msg.substring(6).toInt();
controllerSetSpeed(v, v);