Programación de Funciones de Control de Movimiento en Arduino

Clase 37 de 38Curso Fundamentos de Desarrollo de Hardware con Arduino

Resumen

Controla un robot móvil con confianza: aprende a crear funciones void para mover motores, configurar pines HIGH/LOW, leer un sensor con digitalRead y aplicar velocidad con analogWrite. Verás cómo estructurar la lógica mínima (MVP) para avanzar o girar al detectar obstáculos, con prácticas de depuración sobre la marcha.

¿Qué aprenderás sobre funciones y movimiento en Arduino?

Crearás funciones globales para mover el robot: avanzar (derecho), girar a la izquierda (giroizquierda) y girar a la derecha (giroderecha). Estas funciones no van en setup ni en loop: se declaran de forma global, debajo de las variables. Se usan como procedimientos que cambian estados de pines, por eso se definen con tipo void y sin argumentos.

  • Declarar funciones fuera de setup y loop evita errores de alcance.
  • Usar HIGH/LOW define el sentido de giro por motor.
  • El giro más rápido se logra invirtiendo el sentido de una llanta mientras la otra sigue hacia adelante.

¿Cómo declarar funciones void fuera de setup y loop?

  • Escribe: tipo de retorno, nombre y paréntesis vacíos.
  • Dentro de llaves, configura pines con digitalWrite.

Ejemplo:

void derecho() {
  digitalWrite(MOTOR1A, HIGH);
  digitalWrite(MOTOR1B, LOW);
  digitalWrite(MOTOR2A, LOW);
  digitalWrite(MOTOR2B, HIGH);
}

¿Cómo se controla cada motor con HIGH/LOW?

  • Motor derecho: un pin en HIGH y el opuesto en LOW para avanzar.
  • Motor izquierdo: igual, pero invirtiendo para reversa.
  • Al girar a la izquierda, la llanta derecha sigue adelante y la izquierda va en reversa.
void giroizquierda() { // invierte el motor izquierdo
  digitalWrite(MOTOR1A, LOW);
  digitalWrite(MOTOR1B, HIGH);
  digitalWrite(MOTOR2A, LOW);
  digitalWrite(MOTOR2B, HIGH);
}

void giroderecha() { // invierte el motor derecho
  digitalWrite(MOTOR1A, HIGH);
  digitalWrite(MOTOR1B, LOW);
  digitalWrite(MOTOR2A, HIGH);
  digitalWrite(MOTOR2B, LOW);
}

¿Cómo se gira a la izquierda o derecha invirtiendo un motor?

  • Izquierda: invierte el motor izquierdo y mantiene el derecho hacia adelante.
  • Derecha: invierte el motor derecho y mantiene el izquierdo hacia adelante.
  • Así, el prototipo gira sobre su eje con rapidez.

¿Cómo se implementa la lógica MVP con el sensor y PWM?

Se plantea una lógica simple: si el sensor no detecta, el robot avanza; si detecta, gira a la izquierda. Para ello, se lee el estado con digitalRead en una variable entera y se decide con if/else. La velocidad se fija con analogWrite a un valor medio, por ejemplo 127, en ambos pines PWM.

  • Variable para el estado: int sensor_uno_state = 0;.
  • Lectura: sensor_uno_state = digitalRead(SENSOR1);.
  • Decisión: si es HIGH, avanzar; si no, girar.
  • Velocidad uniforme: analogWrite(PWM1, 127); analogWrite(PWM2, 127);.

Ejemplo:

int sensor_uno_state = 0;

void loop() {
  sensor_uno_state = digitalRead(SENSOR1);

  if (sensor_uno_state == HIGH) { // no detecta obstáculo
    derecho();
  } else { // detecta obstáculo
    giroizquierda();
  }

  analogWrite(PWM1, 127);
  analogWrite(PWM2, 127);
}

¿Qué significa HIGH y LOW en Arduino?

  • Representan lógicos 1 y 0, respectivamente.
  • El sensor entrega HIGH cuando no detecta y LOW cuando detecta.
  • Úsalos en comparaciones en lugar de 1 y 0.

¿Por qué usar else en lugar de else if?

  • El sensor tiene dos estados: basta con if y else.
  • Reduce complejidad y errores.

¿Cómo asignar velocidad media con analogWrite?

  • analogWrite(pinPWM, 127) define un ciclo de trabajo medio.
  • Aplica el mismo valor a los dos PWM para que ambas llantas coincidan en velocidad.

¿Qué buenas prácticas y depuración del sketch conviene aplicar?

Conviene compilar y verificar frecuentemente mientras avanzas. Se detectaron errores de nombres como giro deeecha o giro izquiera, que se corrigieron a giroderecha y giroizquierda. También se puede cargar el sketch aunque no haya conexiones, para validar que compila sin fallos antes de pasar al cableado en el protoboard.

  • Declara funciones de control como globales.
  • Usa nombres consistentes en funciones y variables.
  • Verifica el sketch con frecuencia.
  • Mantén una versión MVP: avanza si no detecta, gira si detecta.
  • Ajusta PWM según necesites estabilidad o respuesta.

¿Tienes dudas sobre la lógica o quieres proponer otra estrategia de giro? Cuéntalo en los comentarios y comparte tu enfoque.