En el vasto universo de la electrónica y la robótica, la capacidad de medir la orientación y el movimiento con precisión es fundamental. Este proyecto se centra en la construcción de un sistema compacto y eficiente capaz de capturar la rotación tridimensional de un objeto y mostrar los datos en tiempo real. Utilizaremos el popular microcontrolador Arduino Uno como cerebro, el avanzado módulo MPU-6050 para la detección de movimiento y una pantalla OLED de 128×32 píxeles para la visualización de los ángulos de rotación (roll, pitch y yaw).
El MPU-6050 es un dispositivo 6-DOF (Grados de Libertad) que combina un giroscopio de 3 ejes y un acelerómetro de 3 ejes. Aunque podemos obtener los datos brutos de rotación (velocidad angular) con el giroscopio, para obtener un ángulo de orientación estable y fiable (como lo que se conoce como ángulo de Euler), es necesario aplicar técnicas de filtrado (como el Filtro Complementario o el Filtro de Kalman) sobre los datos combinados del giroscopio y el acelerómetro. En este artículo, nos centraremos en obtener una estimación de ángulo utilizable, a menudo proporcionada por librerías específicas que manejan la fusión de datos internos.
🔩Funcionamiento
El Cerebro del Sistema: Arduino UNO
El Arduino UNO utiliza el microcontrolador ATmega328P de Atmel (ahora Microchip). Este chip opera típicamente a 16 MHz y ofrece una arquitectura sencilla pero potente con 32 KB de memoria Flash para el código.
I2C es un protocolo de comunicación serial que permite que un microcontrolador (el Maestro) se comunique con múltiples periféricos (los Esclavos) usando solo dos cables de señal, además de la alimentación.
Los modelos más modernos de Arduino (como el Uno R3, el Mega, o el Leonardo) también tienen pines I2C dedicados cerca del pin AREF, pero internamente, en el Uno, están conectados a A4 y A5. Por compatibilidad, siempre se recomienda usar A4 y A5.
La Comunicación I2C y la Pantalla OLED
La pantalla OLED (Organic Light-Emitting Diode) es ideal por su alto contraste, bajo consumo de energía y tamaño compacto. La mayoría de los módulos de 128 x 32 píxeles utilizan el chip controlador SSD1306 o SSH1106 y se comunican a través del bus I2C.
- Protocolo de Dos Hilos: I2C es un bus de comunicación serial que, de manera inteligente, requiere solo dos líneas para transferir datos entre el maestro (Arduino) y los esclavos (la pantalla):
- SDA (Serial Data Line): Línea de datos.
- SCL (Serial Clock Line): Línea de sincronización del reloj.
PINES del OLED 128×32(SSD1306)
| Pin OLED 128×32(I2C) | Protocolo | Notas Importantes |
|---|---|---|
| VCC | Alimentación | Uso de 5V. |
| GND | Tierra | Conexión de referencia. |
| SCL | I2C | Línea de Reloj Serial. |
| SDA | I2C | Línea de Datos Serial. |
Principio de Funcionamiento del MPU-6050
El MPU-6050 es la pieza central de este proyecto.
- Acelerómetro: Mide la aceleración lineal en los ejes X, Y y Z. La aceleración debida a la gravedad (9.81 m/s2) siempre está presente y puede usarse para determinar la inclinación estática del sensor con respecto al plano horizontal.
- Giroscopio: Mide la velocidad angular (Ω) alrededor de los ejes X, Y y Z (roll, pitch y yaw). Integrando la velocidad angular con respecto al tiempo, podemos obtener el cambio de ángulo. Sin embargo, esta integración sufre de “deriva” (drift), donde pequeños errores se acumulan con el tiempo.
- DMP (Digital Motion Processor): El MPU-6050 incluye un procesador interno que puede realizar el cálculo de fusión de sensores (acelerómetro + giroscopio) a nivel de hardware, proporcionando datos de orientación (como Cuaterniones o Ángulos de Euler) mucho más estables. Para este proyecto avanzado, utilizaremos una librería que aproveche el DMP.
PINES del Giroscopio MPU-6050
| Pin OLED 128×32(I2C) | Protocolo | Notas Importantes |
|---|---|---|
| VCC | Alimentación | Uso de 5V. |
| GND | Tierra | Conexión de referencia. |
| SCL | I2C | Línea de Datos Serial. |
| SDA | I2C | Línea de Reloj Serial. |
| XDA | I2C Auxiliar | Pin de datos I2C auxiliar |
| XCL | I2C Auxiliar | Pin de reloj I2C auxiliar. |
| AD0 | I2C (Configuración) | Dirección I2C del módulo. |
| INT | Digital (Interrupción) | Pin de interrupción |
🔨Componentes
| Componente | Cantidad | Especificación | Función |
|---|---|---|---|
| Placa Arduino | 1 | Arduino Uno, Nano, etc. | Control de componentes(cerebro) |
| Pantalla OLED | 1 | 128×32 (SSD1306) | Mostrar información |
| Giroscópio | 1 | MPU-6050 | Obtener ángulos |
| Cables de conexión | n | Unir los componentes |
🔌Conexiones
Conexión OLED 128×32(SSD1306)
| OLED 128×32(I2C) Pin | Arduino Pin |
|---|---|
| GND | GND |
| VCC | 5V |
| SCL | A5 |
| SDA | A4 |
Conexión del Giroscopio MPU-6050
| MPU-6050 Pin | Arduino Pin |
|---|---|
| GND | GND |
| VCC | 5V |
| SCL | A5 |
| SDA | A4 |
0️⃣Código
Asegúrate de instalar las librerías necesarias desde el Gestor de Librerías del IDE de Arduino:
- Adafruit GFX Library (librería gráfica principal)
- Adafruit SSD1306 (driver específico para la pantalla)
- MPU6050_tockn(librería para a para el giroscopio)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <Arduino.h> #include <Wire.h> #include <MPU6050_tockn.h> // Librería para el MPU-6050 y el procesamiento de ángulos #include <Adafruit_GFX.h> // Librería base para gráficos #include <Adafruit_SSD1306.h> // Librería específica para la pantalla SSD1306 (OLED) // --- CONFIGURACIÓN DE LA PANTALLA OLED --- // Define la dirección I2C de la pantalla (0x3C o 0x3D) #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C // Dirección I2C común (puedes verificarla con un escáner I2C si falla) Adafruit_SSD1306 display(128, 32, &Wire, OLED_RESET); // Objeto display (128x32) // --- CONFIGURACIÓN DEL MPU-6050 --- MPU6050 mpu6050(Wire); // Objeto MPU6050 // Variables para el tiempo de ciclo (esencial para la integración del giroscopio/DMP) long timer = 0; void setup() { Serial.begin(9600); // Inicialización del Bus I2C Wire.begin(); // Inicialización de la pantalla OLED if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("FALLA: SSD1306 no encontrado")); for(;;); // Bucle infinito si falla la inicialización } // Configuración inicial de la pantalla display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println("Iniciando MPU-6050..."); display.display(); delay(2000); // Inicialización del MPU-6050 mpu6050.begin(); display.clearDisplay(); display.setCursor(0,0); display.println("Calibrando... "); display.println("NO MOVER"); display.display(); // Calibración del MPU (esto puede tomar unos segundos) //mpu6050.calcOffsets(true,true); mpu6050.calcGyroOffsets(true); display.clearDisplay(); display.setCursor(0,0); display.println("CALIBRACION COMPLETA"); display.display(); delay(1000); timer = micros(); // Inicia el contador de tiempo para el bucle } void loop() { // 1. Lectura de Datos del MPU-6050 // La función update() realiza la lectura de todos los datos y el cálculo del ángulo mpu6050.update(); // 2. Limpieza de Pantalla display.clearDisplay(); // 3. Configuración del Texto display.setTextSize(1); display.setTextColor(SSD1306_WHITE); // 4. Muestra del Título display.setCursor(0, 0); display.println("-- ANGULOS MPU-6050 --"); // 5. Presentación del Ángulo de ROLL (Rotación sobre el eje X) display.setTextSize(1); display.setCursor(0, 10); display.print("X: "); display.print(mpu6050.getAngleX(), 1); // getAngleX() es el ROLL display.print((char)248); // Símbolo de Grado // 6. Presentación del Ángulo de PITCH (Rotación sobre el eje Y) display.setTextSize(1); display.setCursor(64, 10); display.print("Y: "); display.print(mpu6050.getAngleY(), 1); // getAngleY() es el PITCH display.print((char)248); // Símbolo de Grado // 7. Presentación del Ángulo de YAW (Rotación sobre el eje Z) display.setTextSize(1); display.setCursor(0, 24); display.print("Z: "); display.print(mpu6050.getAngleZ(), 1); // getAngleZ() es el YAW display.print((char)248); // Símbolo de Grado // 8. Actualización de la Pantalla display.display(); // Relleno: Mostrar los datos también por el Monitor Serial para depuración // Esto es muy útil si la pantalla no funciona de inmediato Serial.print("Roll: "); Serial.print(mpu6050.getAngleX()); Serial.print(" | Pitch: "); Serial.print(mpu6050.getAngleY()); Serial.print(" | Yaw: "); Serial.println(mpu6050.getAngleZ()); // Control de la Tasa de Actualización: Esperar hasta el siguiente ciclo // No queremos abrumar la comunicación I2C ni la pantalla. while(micros() - timer < 10000); // Esperar hasta que hayan pasado 10 ms (100 Hz de actualización) timer = micros(); } |
🖌️Diseños

🎬Videos
📑Conclusión
Este proyecto ha demostrado con éxito la integración y funcionalidad de tres componentes clave de la electrónica moderna: el microcontrolador Arduino Uno, el sensor de movimiento MPU-6050 y la pantalla OLED 128×32, unidos por el eficiente protocolo de comunicación I2C.
Logros Clave
- Adquisición de Datos Complejos: Logramos obtener las estimaciones angulares de Roll y Pitch (inclinación lateral y frontal/trasera) de manera estable, utilizando la fusión de sensores (giroscopio y acelerómetro) implementada en la librería.
- Visualización Compacta: La pantalla OLED, a pesar de su pequeño tamaño, resultó ser un medio efectivo y de bajo consumo para presentar datos en tiempo real de forma clara y concisa al usuario.
- Dominio del I2C: La comunicación se realizó eficientemente a través de los pines A4 y A5 del Arduino Uno, validando el uso del bus I2C para interconectar múltiples dispositivos con un cableado mínimo.
Reflexiones Técnicas y Limitaciones
La principal conclusión técnica se centra en el ángulo de Yaw (rotación sobre el eje Z). Aunque el sistema pudo medir la velocidad angular del Yaw, la falta de un sensor de referencia absoluta (como un magnetómetro) en el MPU-6050 puro resultó en la conocida deriva angular. Esto subraya la necesidad de un sistema 9-DOF (como el MPU-9250) si se requiere una medición de rumbo absoluto estable y sin acumulación de error en el eje de rotación horizontal.
Proyección y Futuro
Este proyecto sienta una base sólida. Las aplicaciones futuras podrían incluir:
- Estabilización: Usar los datos de ángulo para controlar servomotores y mantener una plataforma nivelada (por ejemplo, en un cardán o un robot balancín).
- Interfaz Gráfica: Mejorar la visualización OLED con gráficos de barra o pequeños iconos que muestren la orientación de forma más intuitiva.
- Registro de Datos: Enviar los datos angulares de forma inalámbrica (vía Bluetooth o Wi-Fi) o guardarlos en una tarjeta SD.
En resumen, el proyecto fue un éxito al combinar la potencia de procesamiento del Arduino con la precisión del MPU-6050, proporcionando un sistema de medición de orientación portátil y visual que es fundamental en el estudio de la robótica y la inercia.

