ArduinoMega2560_SPI 1.0
Cargando...
Buscando...
Nada coincide
motorStep.cpp
Ir a la documentación de este archivo.
1#include "motorStep.h"
2
3//
4// =============================================================
5// CONSTRUCTOR
6// =============================================================
7//
8
9/**
10 * @brief Inicializa el motor paso a paso configurando los pines y el estado inicial.
11 */
12MotorPaso::MotorPaso(uint8_t pinA, uint8_t pinB, uint8_t pinC, uint8_t pinD)
17{
18 pinMode(pinA, OUTPUT);
19 pinMode(pinB, OUTPUT);
20 pinMode(pinC, OUTPUT);
21 pinMode(pinD, OUTPUT);
22}
23
24//
25// =============================================================
26// CONFIGURACIÓN GENERAL
27// =============================================================
28//
29
30/**
31 * @brief Establece la velocidad del motor en RPM calculando el retardo entre pasos.
32 */
34 this->retardoPaso = (60.0 * 1000000.0) / (rpm * this->pasosPorVuelta);
35 this->rpm = rpm;
36}
37
38//
39// =============================================================
40// CONTROL BÁSICO DE PASOS (SECUENCIA 0–7)
41// =============================================================
42//
43
44/**
45 * @brief Avanza un paso en la secuencia del motor.
46 */
48 this->pasoActual++;
49 if (this->pasoActual > 7) this->pasoActual = 0;
50
51 this->aplicarPaso(this->pasoActual);
52 delayMicroseconds(this->retardoPaso);
53}
54
55/**
56 * @brief Retrocede un paso en la secuencia del motor.
57 */
59 this->pasoActual--;
60 if (this->pasoActual < 0) this->pasoActual = 7;
61
62 this->aplicarPaso(this->pasoActual);
63 delayMicroseconds(this->retardoPaso);
64}
65
66/**
67 * @brief Activa las bobinas según el índice de paso (0–7).
68 */
70 switch (i) {
71 case 0: digitalWrite(pinA, HIGH); digitalWrite(pinB, LOW); digitalWrite(pinC, LOW); digitalWrite(pinD, LOW); break;
72 case 1: digitalWrite(pinA, HIGH); digitalWrite(pinB, HIGH); digitalWrite(pinC, LOW); digitalWrite(pinD, LOW); break;
73 case 2: digitalWrite(pinA, LOW); digitalWrite(pinB, HIGH); digitalWrite(pinC, LOW); digitalWrite(pinD, LOW); break;
74 case 3: digitalWrite(pinA, LOW); digitalWrite(pinB, HIGH); digitalWrite(pinC, HIGH); digitalWrite(pinD, LOW); break;
75 case 4: digitalWrite(pinA, LOW); digitalWrite(pinB, LOW); digitalWrite(pinC, HIGH); digitalWrite(pinD, LOW); break;
76 case 5: digitalWrite(pinA, LOW); digitalWrite(pinB, LOW); digitalWrite(pinC, HIGH); digitalWrite(pinD, HIGH); break;
77 case 6: digitalWrite(pinA, LOW); digitalWrite(pinB, LOW); digitalWrite(pinC, LOW); digitalWrite(pinD, HIGH); break;
78 case 7: digitalWrite(pinA, HIGH); digitalWrite(pinB, LOW); digitalWrite(pinC, LOW); digitalWrite(pinD, HIGH); break;
79 }
80}
81
82//
83// =============================================================
84// MOVIMIENTO CONTINUO
85// =============================================================
86//
87
88/**
89 * @brief Ejecuta movimiento continuo según la velocidad configurada.
90 */
92 unsigned long ahora = micros();
93
94 if (ahora - this->tiempoUltimoPaso >= this->retardoPaso) {
95 this->tiempoUltimoPaso = ahora;
96 this->pasoAdelante();
97 }
98}
99
100//
101// =============================================================
102// MOVIMIENTO RELATIVO (ÁNGULOS)
103// =============================================================
104//
105
106/**
107 * @brief Mueve el motor hacia un ángulo relativo usando el camino más corto.
108 */
109void MotorPaso::movimientoPosicionRelativo(float grados, bool debugMSG) {
110
111 this->diferencia = this->diferenciaCircular(this->gradoActual, grados);
112 this->pasos = convertirGradosAPasos(abs(this->diferencia));
113
114 this->direccionAdelante = (this->diferencia > 0);
115 this->direccionAtras = (this->diferencia < 0);
116
117 if (this->direccionAtras) {
118 for (int i = 0; i < this->pasos; i++) {
119 this->pasoAtras();
121 if (debugMSG) debugMovimientoRelativo(i);
122 }
123 }
124
125 if (this->direccionAdelante) {
126 for (int i = 0; i < this->pasos; i++) {
127 this->pasoAdelante();
129 if (debugMSG) debugMovimientoRelativo(i);
130 }
131 }
132
133 this->gradoActual = normalizarGrados(grados);
134}
135
136//
137// =============================================================
138// PROGRESO DURANTE EL MOVIMIENTO
139// =============================================================
140//
141
142/**
143 * @brief Actualiza y devuelve los grados recorridos durante el movimiento.
144 */
146 this->gradosCorriendo = convertirPasosAGrados(movimientoPasos);
147 return this->gradosCorriendo;
148}
149
150//
151// =============================================================
152// MATEMÁTICAS DE ÁNGULOS Y PASOS
153// =============================================================
154//
155
156/**
157 * @brief Convierte grados a pasos del motor.
158 */
160 return (int)(abs(grados) * this->pasosPorVuelta / 360.0f);
161}
162
163/**
164 * @brief Convierte pasos del motor a grados.
165 */
167 return (float)pasos * 360.0f / this->pasosPorVuelta;
168}
169
170/**
171 * @brief Calcula la diferencia circular entre dos ángulos.
172 */
173float MotorPaso::diferenciaCircular(float actual, float objetivo) {
174 float diff = objetivo - actual;
175
176 if (diff > 180.0f) diff -= 360.0f;
177 if (diff < -180.0f) diff += 360.0f;
178
179 return diff;
180}
181
182/**
183 * @brief Normaliza un ángulo al rango 0–360 grados.
184 */
185float MotorPaso::normalizarGrados(float grados) {
186 float g = fmod(grados, 360.0f);
187 return (g < 0) ? g + 360.0f : g;
188}
189
190//
191// =============================================================
192// DEPURACIÓN
193// =============================================================
194//
195
196/**
197 * @brief Imprime información detallada del movimiento relativo.
198 */
199void MotorPaso::debugMovimientoRelativo(int pasoActualDelBucle) {
200
201 Serial.println("====================================");
202 Serial.print("Paso actual: ");
203 Serial.print(pasoActualDelBucle);
204 Serial.print(" / ");
205 Serial.println(this->pasos);
206
207 Serial.print("Diferencia circular: ");
208 Serial.print(this->diferencia);
209 Serial.println(" grados");
210
211 Serial.print("Pasos totales calculados: ");
212 Serial.println(this->pasos);
213
214 Serial.print("Dirección: ");
215 if (this->direccionAdelante) Serial.println("Adelante (+)");
216 else if (this->direccionAtras) Serial.println("Atrás (–)");
217 else Serial.println("Sin movimiento");
218
219 Serial.print("Grados recorridos hasta ahora: ");
220 Serial.print(this->gradosCorriendo);
221 Serial.println(" grados");
222
223 Serial.print("Grado actual (antes de normalizar): ");
224 Serial.println(this->gradoActual);
225
226 Serial.println("====================================");
227}
uint8_t pinD
Bobina D.
Definition motorStep.h:151
float gradosCorriendo
Ángulo recorrido durante el movimiento (progreso).
Definition motorStep.h:175
void movimientoPosicionRelativo(float grados, bool debugMSG=false)
Mueve el motor hacia un ángulo relativo usando el camino más corto.
int pasos
Pasos totales a ejecutar en el movimiento actual.
Definition motorStep.h:172
int pasoActual
Índice de la secuencia (0–7).
Definition motorStep.h:165
uint8_t pinB
Bobina B.
Definition motorStep.h:149
float diferenciaCircular(float gradosActuales, float gradosObjetivo)
Calcula la diferencia circular entre dos ángulos.
float gradoActual
Ángulo actual del motor (0–360 normalizado).
Definition motorStep.h:173
void pasoAtras()
Retrocede un paso en la secuencia del motor.
Definition motorStep.cpp:58
bool direccionAdelante
Dirección: true = adelante.
Definition motorStep.h:177
void movimientoContinuo()
Ejecuta movimiento continuo según la velocidad configurada.
Definition motorStep.cpp:91
uint8_t pinA
Bobina A.
Definition motorStep.h:148
int convertirGradosAPasos(float grados)
Convierte grados a pasos del motor.
float movimientoDePosicionGradosCorriendo(int movimientoPasos)
Actualiza y devuelve los grados recorridos durante el movimiento.
unsigned long retardoPaso
Microsegundos entre pasos (determina la velocidad).
Definition motorStep.h:157
MotorPaso(uint8_t pinA, uint8_t pinB, uint8_t pinC, uint8_t pinD)
Constructor del motor paso a paso.
Definition motorStep.cpp:12
float convertirPasosAGrados(int pasos)
Convierte pasos del motor a grados.
void aplicarPaso(int indicePaso)
Aplica un paso específico de la secuencia (0–7).
Definition motorStep.cpp:69
bool direccionAtras
Dirección: true = atrás.
Definition motorStep.h:178
int pasosPorVuelta
Pasos necesarios para 360°
Definition motorStep.h:166
unsigned long tiempoUltimoPaso
Marca temporal del último paso ejecutado.
Definition motorStep.h:158
uint8_t pinC
Bobina C.
Definition motorStep.h:150
void fijarVelocidad(float rpm)
Establece la velocidad del motor en RPM.
Definition motorStep.cpp:33
void pasoAdelante()
Avanza un paso en la secuencia del motor.
Definition motorStep.cpp:47
float diferencia
Diferencia circular entre gradoActual y gradosObjetivo (–180 a +180).
Definition motorStep.h:176
void debugMovimientoRelativo(int pasoActualDelBucle)
Imprime información detallada del movimiento relativo.
short rpm
Velocidad configurada en RPM.
Definition motorStep.h:159
float normalizarGrados(float grados)
Normaliza un ángulo al rango 0–360 grados.
float gradosObjetivo
Ángulo objetivo solicitado.
Definition motorStep.h:174