Este tutorial detalla el proceso para establecer una conexión directa entre un Arduino y una base de datos MySQL, eliminando la necesidad de intermediarios como PHP. Se enfoca en el uso de la biblioteca MySQL Connector/Arduino, permitiendo a los proyectos de Arduino almacenar y recuperar datos directamente desde un servidor MySQL.

Introducción a MySQL Connector/Arduino
El proyecto MySQL Connector/Arduino es una herramienta de código abierto, licenciada bajo GPLv2 y propiedad de Oracle Corporation. Desarrollada por el Dr. Charles Bell, esta biblioteca facilita la interacción de microcontroladores con bases de datos MySQL o MariaDB. Originalmente, se pensaba que no existía una biblioteca que ofreciera una interfaz lista para consultar bases de datos MySQL, pero el trabajo del Dr. Bell ha simplificado enormemente este proceso. La biblioteca es compatible con placas como el Arduino UNO, Arduino Mega y el ESP32, aunque se recomienda el uso de un Arduino Mega para implementaciones más complejas debido a sus limitaciones de memoria en el UNO.
Para utilizar esta biblioteca, es indispensable contar con un Ethernet Shield o un módulo WiFi. Si bien este tutorial se centra en la conexión Ethernet, la compatibilidad con WiFi abre puertas a proyectos inalámbricos.
Requisitos del Sistema y Software
Para llevar a cabo este tutorial, se necesita una configuración específica tanto en hardware como en software:
Hardware Necesario
- Placa Arduino: Se recomienda un Arduino Mega por su mayor memoria, aunque un Arduino UNO puede ser suficiente para ejemplos básicos.
- Ethernet Shield: Imprescindible para la comunicación por red. Alternativamente, se puede utilizar un módulo WiFi.
- Módulo Lector de Tarjetas RFID RDM6300 (125KHz): Utilizado en el ejemplo para leer identificadores únicos. Cualquier otro módulo de lectura de tarjetas o sensor que genere datos puede ser adaptado.
- LEDs: Dos LEDs (uno verde y uno rojo) para indicar el estado de las operaciones.
- Pulsador: Un botón para activar el modo de registro de nuevas tarjetas.
- Resistencias: Componentes pasivos necesarios para los LEDs y el pulsador.
- Cables de Conexión: Para ensamblar los componentes.

Software y Configuración de Base de Datos
- Servidor MySQL o MariaDB: Es fundamental tener una instancia de base de datos operativa.
- En GNU/Linux: Se puede instalar fácilmente a través de gestores de paquetes como
apt,yum,pacmano utilizando Docker. - En Windows: Se pueden emplear soluciones como XAMPP o similares.
- Servicios Online: Existe la opción de utilizar servicios gratuitos de prueba online, aunque esto requerirá la modificación del ejemplo para usar
dnsclient.
- En GNU/Linux: Se puede instalar fácilmente a través de gestores de paquetes como
- Configuración de Acceso Remoto a la Base de Datos: Es crucial configurar el servidor MySQL para permitir conexiones remotas. Este tutorial asume que dicha configuración ya ha sido realizada y no se detalla en profundidad.
- Herramientas de Gestión de Bases de Datos: Se recomiendan phpMyAdmin o DBeaver para administrar la base de datos si no se tiene experiencia previa.
- Entorno de Desarrollo: Se utilizó PlatformIO para el desarrollo del código, pero el Arduino IDE también es compatible sin necesidad de cambios en el código.
Instalación y Configuración del Servidor MySQL
El primer paso consiste en preparar el entorno del servidor MySQL para que el Arduino pueda establecer una conexión.
Instalación en Linux
En una consola de comandos de Linux, se procede con la instalación:
sudo apt updatesudo apt install mysql-serverDurante la instalación, se solicitará establecer una contraseña para el usuario root de MySQL. Es importante diferenciar este usuario del root de Linux; el usuario root de MySQL posee privilegios de administración sobre el servidor de base de datos.
Una vez completada la instalación, se realiza una prueba para verificar el correcto funcionamiento. Si se utiliza un entorno LAMP (Linux, Apache, MySQL, PHP), se le preguntará qué servidor web está utilizando y se elegirá Apache2.
Creación de Usuarios y Permisos
Para que el Arduino pueda conectarse, es necesario preparar adecuadamente el servidor MySQL. Se debe crear un usuario específico para la conexión desde el Arduino, asegurándose de que tenga los permisos necesarios, incluyendo acceso remoto y acceso a través de la dirección IP del servidor MySQL.
Se pueden crear múltiples usuarios con los mismos privilegios. Por ejemplo, se pueden crear tres usuarios idénticos con los mismos permisos.
Es vital verificar que el usuario creado tenga tanto acceso remoto como acceso vía Ethernet a través de la dirección IP del servidor MySQL.
Configuración para Conexiones Remotas
Un problema común es que el servidor MySQL esté configurado para aceptar únicamente conexiones locales. Para resolver esto, se debe acceder al archivo de configuración del servidor MySQL.
- Navegue hasta el directorio de configuración de MySQL en la consola:
bashcd ..cd etc/mysql/ - Edite el archivo de configuración principal (el nombre exacto puede variar según la distribución y versión de MySQL, pero comúnmente es
my.cnfomysqld.cnf). - Busque la línea que especifica
bind-address. Si está configurada como127.0.0.1, cámbiela a0.0.0.0para permitir conexiones desde cualquier dirección IP, o especifique la dirección IP de la interfaz de red que desea utilizar.# bind-address = 127.0.0.1 # Comentar o modificar esta líneabind-address = 0.0.0.0 # Permitir conexiones desde cualquier IP - Guarde los cambios y reinicie el servicio MySQL para que surtan efecto:
bashsudo systemctl restart mysql

Prueba de Conexión
Después de realizar los cambios, es importante probar la conexión a la base de datos desde el usuario creado para el Arduino. La conexión debe ser exitosa ingresando a través de la dirección IP de la tarjeta de red del PC (Ethernet o inalámbrica).
Para verificar la dirección IP de su PC en la consola, utilice el comando ipconfig (en Windows) o ifconfig / ip addr (en Linux).
Si la configuración es correcta, debería aparecer el mensaje de conexión exitosa.
mysql remoto |usuario remoto mysql| configurar mysql para acceso remoto |mysql linux
Estructura de la Base de Datos
Para el ejemplo propuesto, se crea una base de datos llamada arduino que contiene una única tabla denominada personas. A continuación, se presenta el volcado (dump) SQL para su creación:
CREATE DATABASE `arduino`;USE `arduino`;DROP TABLE IF EXISTS `personas`;CREATE TABLE `personas` ( `id` varchar(12) NOT NULL, `nombre` varchar(50) DEFAULT NULL, `apellido` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Esta estructura permite almacenar el identificador único (id) de una tarjeta RFID, junto con el nombre y apellido de la persona asociada. Inicialmente, al registrar una nueva tarjeta, solo se guarda el id, dejando los campos nombre y apellido con valor NULL.
El Proyecto: Sistema de Control de Acceso RFID con Arduino
El ejemplo práctico consiste en un sistema de control de acceso basado en tarjetas RFID. El Arduino lee el identificador de una tarjeta, lo compara con la base de datos MySQL y, si se encuentra una coincidencia, enciende un LED verde y muestra el nombre de la persona en el Monitor Serie. Si la tarjeta no está registrada, parpadea un LED rojo.
Componentes y Conexiones
El esquema de conexión, realizado con Fritzing, detalla la interconexión de los componentes:
- El módulo RFID RDM6300 se conecta a los pines digitales 2 (Rx) y 3 (Tx) del Arduino mediante
SoftwareSerial. - Los LEDs (verde y rojo) se conectan a pines digitales específicos a través de resistencias limitadoras de corriente.
- El pulsador se conecta a otro pin digital, junto con una resistencia de pull-up o pull-down según la configuración.

Lógica de Funcionamiento
La lógica del sistema se divide en dos modos principales:
Modo Normal (Lectura de Tarjetas):
- El Arduino espera a que una tarjeta RFID sea leída por el módulo RDM6300.
- El protocolo de la tarjeta RFID transmite un código de 5 bytes en formato ASCII, que se traduce en 10 caracteres hexadecimales, más un preámbulo y un postámbulo, totalizando 14 bytes transmitidos desde el RDM6300.
- Una vez que el código de la tarjeta (
tarjeta_leida) es capturado y validado, se ejecuta una consultaSELECTen la base de datos MySQL:sqlSELECT nombre, apellido FROM arduino.personas WHERE id='tarjeta_leida' - Si la consulta devuelve resultados (nombre y apellido), el LED verde se enciende y la información se muestra en el Monitor Serie.
- Si la consulta no devuelve resultados (la tarjeta no está registrada), el LED rojo parpadea dos veces.
- Si ocurre un error durante la ejecución de la consulta, también se activa la señal de error (LED rojo parpadeando).
Modo de Registro de Nuevas Tarjetas:
- Al presionar el pulsador, se activa el modo de registro. El LED rojo se enciende para indicar que el modo está activo.
- El usuario tiene 5 segundos para pasar una nueva tarjeta por el lector.
- Si se lee una tarjeta durante este período, se ejecuta una consulta
INSERTen la base de datos:sqlINSERT INTO arduino.personas (id) VALUES ('tarjeta_leida') - Esta operación solo registra el
idde la tarjeta, dejando los camposnombreyapellidocomoNULL. Posteriormente, estos datos pueden ser completados manualmente en la base de datos o a través de otra aplicación. - Tras la lectura de la tarjeta (sea exitosa o no el registro), el temporizador de 5 segundos se interrumpe y el sistema vuelve al modo normal. Si el registro es exitoso, se enciende el LED verde; de lo contrario, el LED rojo parpadea dos veces.
El Código Fuente
El código completo del proyecto está disponible en GitLab. A continuación, se presentan extractos clave y aclaraciones sobre su funcionamiento:
Configuración de Conexión a la Base de Datos
Es esencial configurar las credenciales de acceso a la base de datos para que coincidan con su entorno:
IPAddress server_addr(192, 168, 1, 105); // Dirección IP de tu servidor MySQLconst char user[] = "root"; // Usuario de la base de datosconst char password[] = "admin"; // Contraseña del usuarioTambién se pueden descomentar y utilizar las líneas para asignar direcciones IP fijas al Arduino y al servidor DNS:
// IPAddress ip(172,17,17,200);// IPAddress myDns(172,17,17,1);Establecimiento de la Conexión
La función setup() del Arduino intenta establecer la conexión con la base de datos:
Serial.println(F("Conectando..."));if (conn.connect(server_addr, 3306, user, password)) { delay(1000);} else { Serial.println(F("No se pudo conectar")); while(true); // El programa se detiene si no se puede conectar}Si la conexión falla, el programa entra en un bucle infinito (while(true)), requiriendo un reinicio del Arduino.
Procesamiento de Lecturas RFID (Modo Normal)
Cuando se lee una tarjeta, se procede de la siguiente manera:
if(check_rfid()) { // Función que verifica si se ha leído una tarjeta MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); String query = "SELECT nombre, apellido FROM arduino.personas WHERE id='"+tarjeta_leida+"'"; if(cur_mem->execute(query.c_str())) { row_values *row = NULL; column_names *columns = cur_mem->get_columns(); // Obligatorio leer nombres de columnas row = cur_mem->get_next_row(); if (row != NULL) { Serial.print(row->values[0]); // Nombre Serial.print(", "); Serial.println(row->values[1]); // Apellido show_ok(); // Enciende LED verde while((row = cur_mem->get_next_row()) != NULL); // Consumir filas restantes } else { show_error(); // Parpadea LED rojo 2 veces } } else { show_error(); // Parpadea LED rojo 2 veces en caso de error de consulta } delete cur_mem;}Es importante notar que la línea 6 (cur_mem->get_columns()) es necesaria para leer los nombres de las columnas, incluso si no se van a utilizar. La línea 13 (while((row = cur_mem->get_next_row()) != NULL);) consume cualquier fila adicional que pueda haber sido devuelta por la consulta, evitando problemas en la ejecución.
Procesamiento de Registro de Tarjetas (Modo Registro)
Cuando se presiona el botón para registrar una nueva tarjeta:
uint32_t time_out = millis() + 5000; // Temporizador de 5 segundosdigitalWrite(led_error, HIGH); // Enciende LED rojowhile(millis() < time_out) { if(check_rfid()) { digitalWrite(led_error, LOW); // Apaga LED rojo MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); String query = "INSERT INTO arduino.personas (id) VALUES ('"+tarjeta_leida+"')"; if(cur_mem->execute(query.c_str())) { show_ok(); // Enciende LED verde } else { show_error(); // Parpadea LED rojo 2 veces } delete cur_mem; break; // Sale del bucle de registro }}digitalWrite(led_error, LOW); // Apaga LED rojo al finalizar el temporizador o registroEl código implementa un temporizador (millis()) de 5 segundos. Si se lee una tarjeta dentro de este período, se intenta insertar su ID en la base de datos y se sale del bucle. Independientemente de si el registro fue exitoso o no, o si el tiempo expiró, el LED rojo se apaga al finalizar la operación.
Limitaciones y Consideraciones Adicionales
Es importante tener en cuenta las limitaciones inherentes a esta configuración. El manual adjunto al conector MySQL/Arduino proporciona detalles exhaustivos sobre estas restricciones.
- Memoria del Arduino: El Arduino UNO tiene una memoria limitada, lo que puede ser un obstáculo para implementaciones complejas que requieran manejar grandes volúmenes de datos o consultas elaboradas. El Arduino Mega ofrece una solución a esta limitación.
- Velocidad de Conexión: La velocidad de la conexión Ethernet y la latencia del servidor MySQL pueden afectar el rendimiento general del sistema.
- Seguridad: Al permitir conexiones remotas a la base de datos, es crucial implementar medidas de seguridad adecuadas para proteger los datos. Esto incluye el uso de contraseñas fuertes, la restricción de accesos por IP y, si es posible, el uso de conexiones cifradas.
- Gestión de Errores: El código incluye manejo básico de errores, pero en aplicaciones críticas, se debería implementar un sistema de registro de errores más robusto y mecanismos de recuperación ante fallos.
Llamadas GET
Para realizar una llamada GET (comúnmente utilizada en interacciones web), es necesario colocar las variables después del nombre del script, separadas por el carácter ?, y subsecuentemente, cada variable se separa por el carácter &. Por ejemplo:
http://tu_servidor/script.php?variable1=valor1&variable2=valor2
Si bien este tutorial se enfoca en la conexión directa desde Arduino sin PHP, comprender la estructura de las llamadas GET es útil para interacciones más complejas o integraciones con aplicaciones web.
Consideraciones sobre el Protocolo de Validación de Tarjetas
En el ejemplo RFID, el tiempo dedicado a implementar el protocolo de validación de las tarjetas (leer los 14 bytes, interpretar el formato ASCII hexadecimal, calcular el checksum) fue significativamente mayor que el tiempo dedicado a la conexión y consulta a la base de datos MySQL. Esto subraya la importancia de comprender a fondo los protocolos de los periféricos utilizados.
Direcciones IP Fijas y DNS
Para asegurar una conexión estable, se recomienda asignar direcciones IP fijas tanto al Arduino como al servidor DNS (generalmente el router). Esto se puede lograr configurando el Arduino con IPAddress ip(x,x,x,x); y IPAddress myDns(x,x,x,x);, aunque estas líneas suelen estar comentadas en los ejemplos y deben ser descomentadas y configuradas según la red local.
El servidor de base de datos puede ser local (dentro de la misma red que el Arduino) o un servidor remoto en Internet. En el caso de un servidor remoto, el Arduino utilizará la red local para establecer la conexión.
Si se opta por utilizar servicios de bases de datos online gratuitos, será necesario ajustar el código para emplear la funcionalidad dnsclient de la biblioteca Ethernet Shield, permitiendo que el Arduino resuelva nombres de dominio a direcciones IP.
Al realizar todas las configuraciones correctamente, la tabla de destino (por ejemplo, una tabla variables o registros) debería empezar a recibir datos a intervalos regulares, como cada 10 segundos, demostrando la comunicación exitosa entre el Arduino y la base de datos MySQL.