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.
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.
voidgiroizquierda(){// invierte el motor izquierdodigitalWrite(MOTOR1A, LOW);digitalWrite(MOTOR1B, HIGH);digitalWrite(MOTOR2A, LOW);digitalWrite(MOTOR2B, HIGH);}voidgiroderecha(){// invierte el motor derechodigitalWrite(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;.
int sensor_uno_state =0;voidloop(){ sensor_uno_state =digitalRead(SENSOR1);if(sensor_uno_state == HIGH){// no detecta obstáculoderecho();}else{// detecta obstáculogiroizquierda();}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.
Programación de Funciones de Control de Movimiento en Arduino
Programación de Funciones de Control de Movimiento en Arduino
Yo estoy trabajando en un proyecto parecido, y en vez de utilizar una funcion para cada movimiento, lo ideal seria mandarlos por parametros de esta manera.
voidmotion(int R_FWD, int R_BWD, int L_FWD, int L_BWD){digitalWrite(PIN_MOTOR_R_FWD,R_FWD);digitalWrite(PIN_MOTOR_R_BWD,R_BWD);digitalWrite(PIN_MOTOR_L_FWD,L_FWD);digitalWrite(PIN_MOTOR_L_BWD,L_BWD);}
Y ejemplos de moviemientos serian:
Para adelante :
motion(HIGH,LOW,HIGH,LOW);
Para la derecha :
motion(LOW,HIGH,HIGH,LOW);
Y asi, ya que el arduino no posee mucha memoria, es mejor ahorrarse algunas lineas de esta manera
hola! lo primero que toca hacer es que desconectes los 2 motoes ya sea los 2 de enfrente o los 2 de atras, hagamos primero funcionar un par, pasame una foto cuando hayas desconectado esos motores pls =)
para “debuggear” hardware muchas veces hay que deshacer todas las conexiones y volver a comenzar, podriamos hacer eso, primero hagamos lo de arriba y vamos paso a paso.
Es correcto el funcionamiento, debes de activar la resistencia de Pull Up, en caso que no lo hagas se hace un corto al oprimir el botón y el Arduino deja de funcionar.
por lo regular si estamos en estos cursos es porque de menos tenemos una ingenieria, asi que los conceptos como el de "Puente H" ya los debemos tener claros, y si no pues tenemos google bien podemos ir de rapido y buscar que es y para que sirve, no se nos va a servir todo en bandeja de plata estimados amigos...
Hola a todos,… Les agradecería a los más expertos que me recomendaran algunos links donde pueda encontrar librerías de proyectos de ejemplo para experimentar con Arduino, con la idea de ampliar mis conocimientos y habilidades en programación. Mil gracias
Puedes utilizar un auto de juguete a pilas que este en desuso, en la tienda china uno puede encontrar juguetes electrónicos bien económicos que se pueden desarmar y añadirles un Arduino con los drivers que indico Ricardo así le damos vida mediante la programación.
Qué métodos hay actualmente para poder manejar la placa a través de un móvil o tablet? Cuales son las ventajas e inconvenientes de cada método? Imagino que se podrá via wifi, via bluetooth, infrarrojos… quizás esas tarjetas x-bee… Dónde puedo ver info actualizada para elegir el modo que mejor se adapta a mis proyectos? Mil gracias!
Hola Jorgens! cuéntame sobre tu proyecto y aquí te ayudamos a elegir la placa ideal!!! para comunicarte yo te recomiendo el hc-05 es muuuy barato y fácil de configurar además de que ya hay apps que lo utilizan entonces lo puedes implementar muy rápido (te puedo ayudar haciendo un turorial de eso )
}
void loop() {
if (BT.available())
Serial.write(BT.read());
if (Serial.available())
BT.write(Serial.read());
// put your main code here, to run repeatedly:
Serial.println(MedirDistacia(Direccion));
for(i=1; i<4; i++)
{
if (MedirDistacia(i) < DistanciaMinima)
{
Girar(i);
delay(50);
Atras();
}
else
{
Adelante(Velocidad);
}
}
}