Cuando uno empieza con Arduino, todo parece magia. Conectas el USB, subes un par de líneas de código y ¡pum!, ya tienes un LED parpadeando.
Pero la magia dura hasta que te metes a un proyecto “de verdad” con varios sensores, motores, relés, fuentes de alimentación… y ahí empiezan los dolores de cabeza.
En mis propias aventuras (cableando y programando máquinas serigráficas, nada menos), me di de frente con problemas que no te vienen en ningún tutorial. Aquí te comparto lo que aprendí, para que no repitas mis tropiezos.
1. La resistencia interna no siempre es suficiente
El pinMode con INPUT_PULLUP es muy tentador. Lo activas y ya tienes una resistencia integrada.
const byte pin_s1 = A0; // Pin análogo 0
void setup(){
pinMode(pin_s1, INPUT_PULLUP);
}
Pero… si intentas leer varios sensores al mismo tiempo las cosas se empiezan a volver locas. Lecturas falsas y valores que saltan de la nada.
Me pasó justo con sensores de límite: todo funcionaba con uno o dos, pero cuando conecté varios, las lecturas parecían de Ouija.
La solución fue simple pero clave: usar resistencias externas (de 10kΩ, por ejemplo) en cada sensor. Desde que hice ese cambio, las lecturas se volvieron estables.
En mi caso si pude aprovechar el pinMode con INPUT_PULLUP para el botón de activación, entonces, después de agregar sus debidas resistencias a los sensores el código se vería así:
const byte pin_button = 13, // Pin digital 13
pin_s4 = A3, // Pin análogo 3
pin_s3 = A2, // Pin análogo 2
pin_s2 = A1, // Pin análogo 1
pin_s1 = A0; // Pin análogo 0
void setup(){
pinMode(pin_button,INPUT_PULLUP);
pinMode(pin_s4,INPUT);
pinMode(pin_s3,INPUT);
pinMode(pin_s2,INPUT);
pinMode(pin_s1,INPUT);
}
Nota: En mi cableado tuve que hacer uso de los pines análogos del Arduino ya que tenía usados todos los demás pines digitales en otras funciones del proyecto
2. No subestimes la alimentación de los relés
Al principio conecté un módulo de relés directamente al pin de 5V del Arduino. Total, “es solo un módulo”… ¡grave error!
El consumo de un módulo de 8 relés puede superar fácilmente lo que el Arduino puede dar y lo que pasa es que los relés fallan en su funcionamiento o, peor aún, el Arduino se reinicia cada vez que activas varios a la vez.
Lo aprendí a golpes, la solución es alimentarlos con una fuente aparte. Una de 12V y al menos 5A me salvó la vida en mi proyecto.
3. Varias fuentes = tierras vinculadas
Suena obvio… hasta que no lo haces.
Yo tenía una fuente para el Arduino de 5V a 500mah y otra para los relés de 12V a 5A. Todo parecía conectado “bonito”, pero nada funcionaba bien: sensores que daban lecturas fantasmas, relés que no respondían, ruido por todos lados.
El truco fue vincular las tierras, osea un pin GND del Arduino unirlo con el GND de la fuente de 12V. En cuanto hice la unión común, los problemas desaparecieron. A veces un cablecito extra vale oro.
4. Ruido eléctrico y relés mecánicos traicioneros
Otra lección dura. Estaba feliz con mi módulo de relés “barato”, pero cada vez que una electrovalvula se activaba un sensor cercano daba lecturas erróneas y después de mucho romperme la cabeza, entendí el problema, los relés mecánicos (más las electrovalvulas) generan ruido eléctrico cuando abren y cierran.
La solución que encontré fue agregar Diodos en las salidas de los Relay para absorver el flujo de regreso. Con esto logré amortiguar la inestabilidad.
El Relay mecánico traicionero
Otro punto importante que también me dió problemas fue un motor electrico que funciona a corriente alterna. En un principio este pasaba su activación por un relay del modulo de Relays y de ahí llegaba al controlador del motor pero esto disparaba muchos bloqueos en el Arduino, lo dejaba congelado y era necesario un reinicio manual.
La solución fue cambiar a Solid State Relays (SSR). Absorben la inestabilidad y de paso son más silenciosos y duraderos. Fue como pasar de andar en bicicleta a usar un coche automático.
5. delay() es el enemigo oculto
Los tutoriales de Arduino te enseñan a usar delay() para todo: esperar entre lecturas, hacer parpadear un LED, etc. Y sí, al inicio funciona.
Pero en proyectos grandes, delay() se vuelve un asesino silencioso. Yo lo descubrí después de dejar la máquina corriendo un buen rato: de repente, todo se congelaba. La única solución era reiniciar el Arduino manualmente.
La alternativa es usar millis() para programar tus tiempos. Así no detienes el programa completo y tu Arduino puede seguir atendiendo sensores, motores y todo lo demás. Me costó aceptarlo, pero una vez que lo dominas, ya no quieres volver a delay(). Además, si no es necesario que implementes delay() hay que prescindir de su uso, buscar alternativas, programar distinto y más eficiente.
6. Arduino es muy quisquilloso con la red eléctrica
Este fue un “WTF” en toda regla. Tenía mi proyecto corriendo bien, hasta que alguien encendió un ventilador conectado en la misma red eléctrica del taller… ¡y mi Arduino empezó a disparar ciclos de impresión solo!
Resulta que los picos e interferencias en la red pueden afectar mucho al microcontrolador.
La solución pasa por usar fuentes conmutadas de buena calidad, filtros y, si es posible, aislar el circuito crítico. No es el consejo más sexy, pero créeme te puede ahorrar horas de depuración absurda.
Consejos extra
Documenta tu wiring desde el inicio
No es un error eléctrico, pero vaya que te salva la vida. Cuando tienes 20 cables de colores cruzándose, al segundo día ya no recuerdas cuál iba en qué pin.
Yo aprendí a tomar fotos, hacer diagramas rápidos en Fritzing o incluso anotar en un Excel. Nada glamuroso, pero muy efectivo.
No te olvides del debounce
Aprendí por prueba y error que al presionar un botón este puede pasar por un proceso de presionado/suelto en lo que los contactos internos terminan de hacer un contacto estable, lo que Arduino interpreta como multiples lecturas de cambios de estado.
En apariencia tu haz presionado el botón una vez pero Arduino ha leído 5 veces que presionaste el botón.
Para solucionar el problema por debounce te recomiendo usar librerías como Button por Michael D K Adams, su uso es muy sencillo y aquí te dejo un ejemplo:
#include <Button.h>
const byte pin_button = 13; // Pin digital 13
Button button(pin_button); // Connect button between pin and GND
void setup(){
pinMode(pin_button,INPUT_PULLUP);
button.begin();
}
void loop(){
if( button.pressed() ){ // Detecta estado presionado
// Aquí va tu lógica
}
}
Nota importante: Si utilizas resistencia externa la lógica de Button en el código se invierte, cito la información oficial:
La forma más sencilla de conectar un interruptor en un Arduino es conectarlo entre un pin de entrada y tierra, y usar la resistencia pullup interna para asegurar que no flote. Esto es muy práctico, pero puede resultar un poco confuso, ya que un botón "presionado" tiene un nivel lógico bajo (low), mientras que uno "soltado" tiene un nivel lógico alto (high).
Para que quede más claro, puedes usar un par de atajos útiles: Button::PRESSED y Button::RELEASED, que corresponden a los valores esperados.
Conclusión
Arduino es una plataforma increíble para aprender electrónica y programación pero los proyectos reales te ponen a prueba de verdad.
Los detalles que al inicio parecen insignificantes (como una resistencia extra o un cable de tierra) marcan la diferencia entre un sistema confiable y una máquina que falla cuando más la necesitas.
Yo aprendí estas lecciones en mis propias andadas, y créeme que te ahorrarás muchos dolores de cabeza si las tomas en cuenta desde el inicio.