Files
Arduino-Car/ESP8266/ESP8266.ino
Natxo1000 0ba2f0247c firmware: v20 — ESP8266 sin OTA/WiFi, ESP32-CAM mantiene OTA
ESP8266:
- Eliminado completamente WiFi, BearSSL, HTTPClient, ESPhttpUpdate
- Firmware pasa de 375KB a 240KB (sin stack WiFi)
- Sin interferencia de WiFi con analogWrite/PWM de motores
- Se mantiene: waitForReady(), 2 pitidos conexion, watchdog 1.5s
- Solo se actualiza por USB (el hardware cambia poco)

ESP32-CAM:
- OTA sin cambios, version -> 20
- Indicador OTA: 3 x Serial H1/H0 -> 3 flashes LED GPIO4
  (el ESP8266 estaba en waitForReady() y no procesaba Serial)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-03 17:09:28 +02:00

151 lines
4.1 KiB
C++

// FW_VERSION solo informativo — este ESP8266 no hace OTA
#define FW_VERSION 19
#include <Servo.h>
// ==== Pines motores ====
const int ENA = D1;
const int ENB = D5;
const int IN1 = D6;
const int IN2 = D7;
const int IN3 = D2;
const int IN4 = D0;
// ==== Pines servos ====
const int SERVO_X_PIN = D3;
const int SERVO_Y_PIN = D4;
// ==== Pin buzzer ====
const int buzzerPin = D8;
Servo servoX;
Servo servoY;
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
pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
stopMotors();
// 2. Serial
Serial.begin(9600);
// 3. Periféricos
analogWriteRange(255);
analogWriteFreq(1000);
servoX.attach(SERVO_X_PIN);
servoY.attach(SERVO_Y_PIN);
pinMode(buzzerPin, OUTPUT);
servoX.write(posX);
servoY.write(posY);
// 4. Esperar señal del ESP32-CAM
waitForReady();
}
// Watchdog: si no llega comando de movimiento en 1.5s → para motores
unsigned long lastMoveMs = 0;
bool motorRunning = false;
void loop() {
if (motorRunning && (millis() - lastMoveMs > 1500)) {
stopMotors();
motorRunning = false;
}
if (!Serial.available()) return;
char c = Serial.read();
if (!espReady) return;
if (c == 'F') { forward(); lastMoveMs = millis(); motorRunning = true; }
else if (c == 'B') { backward(); lastMoveMs = millis(); motorRunning = true; }
else if (c == 'L') { left(); lastMoveMs = millis(); motorRunning = true; }
else if (c == 'R') { right(); lastMoveMs = millis(); motorRunning = true; }
else if (c == 'S') { stopMotors(); motorRunning = false; }
else if (c == 'V') {
int val = Serial.parseInt();
if (val >= 0 && val <= 255) currentSpeed = val;
}
else if (c == 'X') {
int val = Serial.parseInt();
if (val >= 0 && val <= 180) { posX = val; servoX.write(posX); }
}
else if (c == 'Y') {
int val = Serial.parseInt();
if (val >= 0 && val <= 180) { posY = val; servoY.write(posY); }
}
else if (c == 'H') {
int val = Serial.parseInt();
digitalWrite(buzzerPin, val > 0 ? HIGH : LOW);
}
}
// ==== Funciones de movimiento ====
void forward() {
analogWrite(ENA, currentSpeed); analogWrite(ENB, currentSpeed);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void backward() {
analogWrite(ENA, currentSpeed); analogWrite(ENB, currentSpeed);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void left() {
analogWrite(ENA, currentSpeed); analogWrite(ENB, currentSpeed);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void right() {
analogWrite(ENA, currentSpeed); analogWrite(ENB, currentSpeed);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void stopMotors() {
analogWrite(ENA, 0); analogWrite(ENB, 0);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}