Curso Fundamentos de Desarrollo de Hardware con Arduino

Programación de Funciones de Control de Movimiento en Arduino

Curso Fundamentos de Desarrollo de Hardware con Arduino

Contenido del curso

Introducción al hardware libre

Manos a la obra

Programación de Funciones de Control de Movimiento en 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.