joy stick
This commit is contained in:
parent
880e52df5c
commit
8bbdef87ec
@ -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"
|
||||
|
||||
99
src/core/joystick/joystick.cpp
Normal file
99
src/core/joystick/joystick.cpp
Normal 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; // мёртвая зона
|
||||
}
|
||||
15
src/core/joystick/joystick.h
Normal file
15
src/core/joystick/joystick.h
Normal 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();
|
||||
@ -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();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user