#include "Arduino.h"
// Definir pines
const int servoPin1 = 18; // Servo 1
const int servoPin2 = 19; // Servo 2
const int potPin1 = 34; // Potenciómetro 1
const int potPin2 = 35; // Potenciómetro 2
const int motorPin1 = 32; // Pin para el motor (H-Bridge A)
const int motorPin2 = 33; // Pin para el motor (H-Bridge B)
const int buttonPin = 25; // Pin del botón para controlar la dirección del motor (cambia el pin del botón)
// Dirección del motor (false = adelante, true = atrás)
bool motorDirection = false;
void setup() {
Serial.begin(115200);
// Configurar pines de servos, motor y botón
pinMode(servoPin1, OUTPUT);
pinMode(servoPin2, OUTPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Configurar el botón con resistencia pull-up interna
}
void loop() {
// Leer valores de los potenciómetros
int potValue1 = analogRead(potPin1);
int potValue2 = analogRead(potPin2);
// Definir el valor central del joystick y el umbral para considerar apagado
int middleValue = 2047; // Valor en el centro de 0-4095
int threshold = 500; // Rango alrededor del centro considerado como apagado
// Convertir valores de los potenciómetros a ángulos (0° a 180°)
int angle1 = map(potValue1, 0, 4095, 0, 180);
int angle2 = map(potValue2, 0, 4095, 0, 180);
// Definir la señal PWM para el servo 1
int pulseWidth1 = 0;
if (potValue1 < (middleValue - threshold) || potValue1 > (middleValue + threshold)) {
// Si el potenciómetro está fuera del rango central, encender el servo
pulseWidth1 = map(angle1, 0, 180, 500, 2400);
} else {
// Si está en el centro, apagar el servo
pulseWidth1 = 0;
}
// Definir la señal PWM para el servo 2
int pulseWidth2 = 0;
if (potValue2 < (middleValue - threshold) || potValue2 > (middleValue + threshold)) {
// Si el potenciómetro está fuera del rango central, encender el servo
pulseWidth2 = map(angle2, 0, 180, 500, 2400);
} else {
// Si está en el centro, apagar el servo
pulseWidth2 = 0;
}
// Enviar señal PWM manualmente a los servos
moveServo(servoPin1, pulseWidth1);
moveServo(servoPin2, pulseWidth2);
// Leer el estado del botón
static bool lastButtonState = HIGH;
bool currentButtonState = digitalRead(buttonPin);
// Detectar el cambio de estado del botón
if (lastButtonState == HIGH && currentButtonState == LOW) {
motorDirection = !motorDirection; // Cambiar dirección del motor
delay(200); // Debounce del botón (evitar múltiples lecturas por un solo toque)
}
lastButtonState = currentButtonState;
// Controlar la dirección del motor y velocidad
int motorSpeed = map(potValue1, 0, 4095, 0, 255); // Ajustar velocidad según potenciómetro 1 (0 a 255)
if (motorDirection) {
// Motor en dirección contraria
analogWrite(motorPin1, 0);
analogWrite(motorPin2, motorSpeed);
} else {
// Motor en dirección hacia adelante
analogWrite(motorPin1, motorSpeed);
analogWrite(motorPin2, 0);
}
delay(20);
}
// Generar señal PWM manualmente para los servos
void moveServo(int pin, int pulseWidth) {
digitalWrite(pin, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(pin, LOW);
delayMicroseconds(20000 - pulseWidth); // Periodo de 20ms
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
servo1:GND
servo1:V+
servo1:PWM
servo2:GND
servo2:V+
servo2:PWM
joystick1:VCC
joystick1:VERT
joystick1:HORZ
joystick1:SEL
joystick1:GND
led1:A
led1:C
r1:1
r1:2
r2:1
r2:2
led2:A
led2:C