diff --git a/src/config.h b/src/config.h index c586a0b..8946a49 100644 --- a/src/config.h +++ b/src/config.h @@ -2,8 +2,14 @@ // ===== Robot Info ===== #define ROBOT_NAME "OLEG-02" +#define FIRMWARE_NAME "ESP32 Robot" #define FIRMWARE_VERSION "1.0.0" +// ===== Joystick (PS2 analog) ===== +#define JOY_X_PIN 34 // VRX → ADC1_CH6 +#define JOY_Y_PIN 35 // VRY → ADC1_CH7 +#define JOY_SW_PIN 14 // SW → кнопка + // ===== Wi-Fi ===== #define WIFI_SSID "Capybara" #define WIFI_PASS "qq1234567890" diff --git a/src/core/joystick/joystick.cpp b/src/core/joystick/joystick.cpp new file mode 100644 index 0000000..b85f626 --- /dev/null +++ b/src/core/joystick/joystick.cpp @@ -0,0 +1,99 @@ +#include +#include "joystick.h" +#include "../../config.h" + +// ===== ADC CONFIG ===== +// ADC1: 12 бит (0-4095) +// Центр джойстика ≈ 2048 (но может отличаться) + +#define ADC_CENTER_X 1870 // калибровка X (подбирается опытно) +#define ADC_CENTER_Y 1850 // калибровка Y (подбирается опытно) +#define ADC_DEADZONE 150 // мёртвая зона +#define ADC_MIN 0 +#define ADC_MAX 4095 + +// Нормализованные значения +#define NORM_MIN -100 +#define NORM_MAX 100 + +// Порог логирования (чтобы не шумело) +#define LOG_THRESHOLD 10 // минимальное изменение для лога + +static int joyX = 0; +static int joyY = 0; +static bool swPressed = false; +static int lastLoggedXNorm = 0; +static int lastLoggedYNorm = 0; +static bool lastLoggedSw = false; + +void joyInit() { + pinMode(JOY_SW_PIN, INPUT_PULLUP); + + // ADC1 каналы (пины 34, 35) + analogReadResolution(12); // 12 бит (0-4095) + analogSetAttenuation(ADC_11db); // 0-3.3V + + Serial.println("Joystick initialized"); + Serial.printf(" VRX → GPIO%d (ADC1_CH6)\n", JOY_X_PIN); + Serial.printf(" VRY → GPIO%d (ADC1_CH7)\n", JOY_Y_PIN); + Serial.printf(" SW → GPIO%d\n", JOY_SW_PIN); + Serial.printf(" Center: X=%d, Y=%d\n", ADC_CENTER_X, ADC_CENTER_Y); + Serial.println(" Move stick to calibrate if needed"); +} + +void joyUpdate() { + joyX = analogRead(JOY_X_PIN); + joyY = analogRead(JOY_Y_PIN); + swPressed = (digitalRead(JOY_SW_PIN) == LOW); // LOW = нажата + + // Логирование только при значимых изменениях + int xNorm = joyGetXNormalized(); + int yNorm = joyGetYNormalized(); + + bool xChanged = abs(xNorm - lastLoggedXNorm) >= LOG_THRESHOLD; + bool yChanged = abs(yNorm - lastLoggedYNorm) >= LOG_THRESHOLD; + bool swChanged = (swPressed != lastLoggedSw); + + if (xChanged || yChanged || swChanged) { + Serial.printf("[JOY] X=%4d (%4d) | Y=%4d (%4d) | SW=%s\n", + joyX, xNorm, joyY, yNorm, swPressed ? "PRESSED" : "released"); + + lastLoggedXNorm = xNorm; + lastLoggedYNorm = yNorm; + lastLoggedSw = swPressed; + } +} + +int joyGetX() { + return joyX; +} + +int joyGetY() { + return joyY; +} + +bool joyIsPressed() { + return swPressed; +} + +int joyGetXNormalized() { + if (joyX < ADC_CENTER_X - ADC_DEADZONE) { + // влево + return map(joyX, ADC_MIN, ADC_CENTER_X - ADC_DEADZONE, NORM_MIN, 0); + } else if (joyX > ADC_CENTER_X + ADC_DEADZONE) { + // вправо + return map(joyX, ADC_CENTER_X + ADC_DEADZONE, ADC_MAX, 0, NORM_MAX); + } + return 0; // мёртвая зона +} + +int joyGetYNormalized() { + if (joyY < ADC_CENTER_Y - ADC_DEADZONE) { + // вверх (инвертировано) + return map(joyY, ADC_MIN, ADC_CENTER_Y - ADC_DEADZONE, NORM_MAX, 0); + } else if (joyY > ADC_CENTER_Y + ADC_DEADZONE) { + // вниз + return map(joyY, ADC_CENTER_Y + ADC_DEADZONE, ADC_MAX, 0, NORM_MIN); + } + return 0; // мёртвая зона +} diff --git a/src/core/joystick/joystick.h b/src/core/joystick/joystick.h new file mode 100644 index 0000000..5cb1795 --- /dev/null +++ b/src/core/joystick/joystick.h @@ -0,0 +1,15 @@ +#pragma once + +void joyInit(); +void joyUpdate(); + +// возвращает значения 0-4095 +int joyGetX(); +int joyGetY(); + +// возвращает true, если кнопка нажата +bool joyIsPressed(); + +// возвращает нормализованные значения -100..100 +int joyGetXNormalized(); +int joyGetYNormalized(); diff --git a/src/main.cpp b/src/main.cpp index 0f79ea4..2150203 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include "core/ultrasonic/ultrasonic.h" #include "core/display/face/face.h" #include "core/robot_state/robot_state.h" +#include "core/joystick/joystick.h" #include "core/actuators/actuators.h" #include "server/web_server.h" @@ -18,6 +19,7 @@ void setup() { oledInit(); servoInit(); ultrasonicInit(); + joyInit(); // faceInit(); actuatorsInit(); webServerInit(); @@ -30,6 +32,7 @@ void setup() { void loop() { webServerLoop(); wsLoop(); + joyUpdate(); controllerUpdate(); // irPoll(); }