joy stick

This commit is contained in:
cheykrym 2026-03-30 02:44:06 +03:00
parent 880e52df5c
commit 8bbdef87ec
4 changed files with 123 additions and 0 deletions

View File

@ -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"

View File

@ -0,0 +1,99 @@
#include <Arduino.h>
#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; // мёртвая зона
}

View File

@ -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();

View File

@ -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();
}