firmware: v21 — arquitectura v1 simplificada, sin handshakeTask

ESP32-CAM: eliminada handshakeTask (fragmentaba heap durante 30s
con String objects, causando inestabilidad al manejar el coche)

ESP8266: sustituido waitForReady() por delay fijo de 20s + flush
de Serial + 2 pitidos. Sin WiFi, sin String, sin tareas extra.
Arquitectura identica a v1 que funcionaba, mas watchdog 1.5s.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Natxo1000
2026-06-03 17:23:37 +02:00
parent 0ba2f0247c
commit e770520f73
4 changed files with 19 additions and 67 deletions

View File

@@ -1,5 +1,5 @@
// FW_VERSION solo informativo — este ESP8266 no hace OTA // FW_VERSION informativo — no hace OTA, se flashea por USB
#define FW_VERSION 19 #define FW_VERSION 20
#include <Servo.h> #include <Servo.h>
// ==== Pines motores ==== // ==== Pines motores ====
@@ -24,45 +24,10 @@ int currentSpeed = 150;
int posX = 90; int posX = 90;
int posY = 90; int posY = 90;
// ── Handshake: espera "GO\n" del ESP32-CAM antes de procesar comandos ──
// Descarta la basura del bootloader ROM del ESP32 (115200 baud a 9600).
bool espReady = false; bool espReady = false;
void waitForReady() {
delay(300);
while (Serial.available()) Serial.read(); // descarta basura del bootloader
unsigned long timeout = millis() + 90000UL;
String buf = "";
while (millis() < timeout) {
while (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
buf.trim();
if (buf == "GO") {
Serial.print("OK\n");
delay(50);
while (Serial.available()) Serial.read();
espReady = true;
// 2 pitidos: conexión entre placas establecida
for (int i = 0; i < 2; i++) {
digitalWrite(buzzerPin, HIGH); delay(180);
digitalWrite(buzzerPin, LOW); delay(180);
}
return;
}
buf = "";
} else if (c != '\r' && buf.length() < 8) {
buf += c;
}
}
delay(10);
}
espReady = true; // timeout: arranca igualmente
}
void setup() { void setup() {
// 1. Pines de motor y parada inmediata // 1. Motores parados inmediatamente
pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT); pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
@@ -80,8 +45,20 @@ void setup() {
servoX.write(posX); servoX.write(posX);
servoY.write(posY); servoY.write(posY);
// 4. Esperar señal del ESP32-CAM // 4. Esperar a que el ESP32-CAM termine de arrancar (~20s)
waitForReady(); // El ESP32 necesita: WiFiManager + OTA check + arrancar servidor
unsigned long elapsed = millis();
if (elapsed < 20000) delay(20000 - elapsed);
// 5. Descartar cualquier basura que haya llegado por Serial durante el arranque
while (Serial.available()) Serial.read();
// 6. Listo — 2 pitidos
for (int i = 0; i < 2; i++) {
digitalWrite(buzzerPin, HIGH); delay(180);
digitalWrite(buzzerPin, LOW); delay(180);
}
espReady = true;
} }
// Watchdog: si no llega comando de movimiento en 1.5s → para motores // Watchdog: si no llega comando de movimiento en 1.5s → para motores

View File

@@ -10,7 +10,7 @@
// ================================================================ // ================================================================
// OTA CONFIG // OTA CONFIG
// ================================================================ // ================================================================
#define FW_VERSION 20 #define FW_VERSION 21
#define GITEA_HOST "https://git.nacho.myds.me" #define GITEA_HOST "https://git.nacho.myds.me"
#define GITEA_OWNER "Natxo" #define GITEA_OWNER "Natxo"
#define GITEA_REPO "Arduino-Car" #define GITEA_REPO "Arduino-Car"
@@ -24,29 +24,6 @@ const char *password = "Suprak1llm1ndS23S";
void startCameraServer(); void startCameraServer();
void setupLedFlash(); void setupLedFlash();
static void handshakeTask(void *) {
unsigned long deadline = millis() + 30000UL;
String buf = "";
while (millis() < deadline) {
Serial.print("GO\n");
unsigned long t = millis();
while (millis() - t < 300) {
while (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
buf.trim();
if (buf == "OK") { vTaskDelete(NULL); return; }
buf = "";
} else if (c != '\r' && buf.length() < 8) {
buf += c;
}
}
vTaskDelay(pdMS_TO_TICKS(5));
}
}
vTaskDelete(NULL);
}
// ── OTA: comprueba si hay firmware nuevo y actualiza si hace falta ── // ── OTA: comprueba si hay firmware nuevo y actualiza si hace falta ──
static void checkOTA() { static void checkOTA() {
@@ -169,8 +146,6 @@ void setup() {
// ── Servidor cámara ─────────────────────────────────────────────── // ── Servidor cámara ───────────────────────────────────────────────
startCameraServer(); startCameraServer();
xTaskCreate(handshakeTask, "handshake", 4096, NULL, 1, NULL);
} }
void loop() { void loop() {

Binary file not shown.

View File

@@ -1 +1 @@
20 21