Declaración de variables y definición de constantes
Hdu21838VcTrabajo1 de Julio de 2025
1.356 Palabras (6 Páginas)22 Visitas
Declaración de Variables y Definición de Constantes
Variables
cpp
Copiar código
byte SD = 27;
byte SC = 29;
byte SI = 31;
byte Derecha, centro, izquierda;
byte PinEcoA = 3;
byte PinDisparoA = 2;
byte PinDisparoT = 13;
byte PinEcoT = 4;
long tiempoMs;
int distA;
int distT;
- SD,: Representan los pines del Arduino a los que están conectados los sensores de línea. SD es el sensor derecho, SC es el sensor central, e SI es el sensor izquierdo.
- Derecha, centro, izquierda: Variables que almacenarán los valores leídos de los sensores de línea.
- PinEcoA, PinDisparoA, PinDisparoT, PinEcoT: Pines conectados a los sensores de ultrasonido. PinEcoA y PinEcoT reciben la señal de eco, mientras que PinDisparoA y PinDisparoT envían la señal de disparo.
- tiempoMs: Almacena el tiempo medido por el sensor de ultrasonido.
- distA, distT: Almacenan las distancias calculadas a partir de las mediciones de los sensores de ultrasonido.
Constantes
cpp
Copiar código
#define linea 0
#define nolinea 1
#define m1r 12
#define m1a 11
#define m2r 10
#define m2a 9
#define m3r 8
#define m3a 7
#define m4r 6
#define m4a 5
- linea y nolinea: Representan los estados de los sensores de línea. linea indica que se detecta una línea (valor 0), mientras que nolinea indica que no se detecta una línea (valor 1).
- m1r, m1a, m2r, m2a, m3r, m3a, m4r, m4a: Pines conectados a los motores del robot. Cada motor tiene dos pines: uno para avanzar (anterior, a) y otro para retroceder (retroceso, r).
2. Función setup()
La función setup() se ejecuta una vez al inicio del programa para configurar los pines y preparar los componentes para su uso.
cpp
Copiar código
void setup() {
pinMode(SD, INPUT);
pinMode(SC, INPUT);
pinMode(SI, INPUT);
pinMode(PinEcoA, INPUT);
pinMode(PinDisparoA, OUTPUT);
pinMode(PinEcoT, INPUT);
pinMode(PinDisparoT, OUTPUT);
}
- pinMode(SD, INPUT), pinMode(SC, INPUT), pinMode(SI, INPUT): Configuran los pines de los sensores de línea (SD, SC, SI) como entradas, ya que el Arduino leerá su estado.
- pinMode(PinEcoA, INPUT), pinMode(PinEcoT, INPUT): Configuran los pines de eco de los sensores de ultrasonido como entradas para recibir las señales de eco.
- pinMode(PinDisparoA, OUTPUT), pinMode(PinDisparoT, OUTPUT): Configuran los pines de disparo de los sensores de ultrasonido como salidas para enviar las señales de disparo.
3. Función loop()
La función loop() se ejecuta repetidamente, ejecutando la lógica principal del programa. Aquí se leen los sensores, se calculan distancias, y se toman decisiones para mover el robot.
Lectura de Sensores
cpp
Copiar código
void loop() {
Derecha = digitalRead(SD);
centro = digitalRead(SC);
izquierda = digitalRead(SI);
- Derecha = digitalRead(SD), centro = digitalRead(SC), izquierda = digitalRead(SI): Lee los valores de los sensores de línea y los almacena en las variables correspondientes. digitalRead() devuelve HIGH (1) o LOW (0).
Medición de Distancia
cpp
Copiar código
IniciarDisparo();
tiempoMs = pulseIn(PinEcoA, HIGH);
distA = tiempoMs * 0.01715;
tiempoMs = pulseIn(PinEcoT, HIGH);
distT = tiempoMs * 0.01715;
- IniciarDisparo(): Llama a una función para enviar una señal de disparo a los sensores de ultrasonido.
- tiempoMs = pulseIn(PinEcoA, HIGH): Mide el tiempo que tarda en llegar la señal de eco en microsegundos para el sensor A.
- distA = tiempoMs * 0.01715: Calcula la distancia en centímetros usando el tiempo medido. El factor 0.01715 convierte el tiempo en distancia.
- tiempoMs = pulseIn(PinEcoT, HIGH), distT = tiempoMs * 0.01715: Realiza el mismo proceso para el sensor T.
Lógica de Movimiento
La lógica de movimiento del robot se basa en las distancias medidas y los estados de los sensores de línea. Dependiendo de estas condiciones, el robot puede avanzar, girar o retroceder. A continuación, se detallan algunos bloques de esta lógica.
Condición General
if (distA >= 105 && distT >= 105) {
if (Derecha == nolinea && centro == linea && izquierda == nolinea) {
adelante(120);
}
// Otras condiciones...
}
- if (distA >= 105 && distT >= 105): Esta condición se verifica si ambas distancias medidas son mayores o iguales a 105 cm.
- if (Derecha == nolinea && centro == linea && izquierda == nolinea): Si el sensor derecho e izquierdo no detectan línea y el sensor central sí lo hace, se llama a adelante(120) para mover el robot hacia adelante a una velocidad de 120.
Más Condiciones
Cada bloque if verifica diferentes combinaciones de distancias y estados de sensores de línea para tomar decisiones de movimiento. Aquí hay algunos ejemplos:
cpp
Copiar código
if (distA >= 105 && 50 < distT < 105) {
if (Derecha == nolinea && centro == linea && izquierda == nolinea) {
adelante(135);
}
// Otras condiciones...
}
if (distA >= 105 && distT <= 50) {
if (Derecha == nolinea && centro == linea && izquierda == nolinea) {
adelante(150);
}
// Otras condiciones...
}
- Cada bloque de condiciones sigue una estructura similar: primero verifica las distancias (distA, distT) y luego los estados de los sensores (Derecha, centro, izquierda).
- Dependiendo de estas condiciones, llama a funciones específicas para mover el robot (adelante(), vueltaderecha(), vueltaizquierda(), reversa()), con diferentes velocidades.
Funciones de Movimiento
Estas funciones controlan los motores del robot para realizar diferentes movimientos.
Mover Adelante
cpp
Copiar código
void adelante(byte vel) {
analogWrite(m1r, 0);
analogWrite(m2r, 0);
analogWrite(m3r, 0);
analogWrite(m4r, 0);
analogWrite(m1a, vel);
analogWrite(m2a, vel);
analogWrite(m3a, vel);
...