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:
@@ -1,5 +1,5 @@
|
||||
// FW_VERSION solo informativo — este ESP8266 no hace OTA
|
||||
#define FW_VERSION 19
|
||||
// FW_VERSION informativo — no hace OTA, se flashea por USB
|
||||
#define FW_VERSION 20
|
||||
#include <Servo.h>
|
||||
|
||||
// ==== Pines motores ====
|
||||
@@ -24,45 +24,10 @@ int currentSpeed = 150;
|
||||
int posX = 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;
|
||||
|
||||
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() {
|
||||
// 1. Pines de motor y parada inmediata
|
||||
// 1. Motores parados inmediatamente
|
||||
pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
|
||||
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
|
||||
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
|
||||
@@ -80,8 +45,20 @@ void setup() {
|
||||
servoX.write(posX);
|
||||
servoY.write(posY);
|
||||
|
||||
// 4. Esperar señal del ESP32-CAM
|
||||
waitForReady();
|
||||
// 4. Esperar a que el ESP32-CAM termine de arrancar (~20s)
|
||||
// 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
|
||||
|
||||
Reference in New Issue
Block a user