.. note:: ¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirse?** - **Soporte de Expertos**: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprende y Comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades. - **Avances Exclusivos**: Obtén acceso temprano a nuevos anuncios de productos y adelantos. - **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos. - **Promociones y Sorteos Festivos**: Participa en sorteos y promociones festivas. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo! .. _2.2.9_c: 2.2.9 Módulo MPU6050 ============================= Introducción --------------- El MPU-6050 es el primer y único dispositivo de seguimiento de movimiento de 6 ejes del mundo (Giroscopio de 3 ejes y Acelerómetro de 3 ejes) diseñado para teléfonos inteligentes, tabletas y sensores portátiles que tienen estas características, incluyendo requisitos de bajo consumo, bajo costo y alto rendimiento. En este experimento, utilizaremos I2C para obtener los valores del sensor de aceleración de tres ejes y el giroscopio de tres ejes del MPU6050 y mostrarlos en la pantalla. Componentes Necesarios ------------------------------ En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/list_2.2.6.png Es definitivamente conveniente comprar un kit completo, aquí está el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - ARTÍCULOS EN ESTE KIT - ENLACE * - Kit Raphael - 337 - |link_Raphael_kit| También puedes comprarlos por separado en los enlaces a continuación. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCCIÓN DE COMPONENTES - ENLACE DE COMPRA * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_mpu6050` - |link_mpu6050_buy| Diagrama Esquemático -------------------------- El MPU6050 se comunica con el microcontrolador a través de la interfaz de bus I2C. El SDA1 y SCL1 deben estar conectados al pin correspondiente. .. image:: ../img/image330.png Procedimientos Experimentales ---------------------------------- **Paso 1:** Construir el circuito. .. image:: ../img/image227.png **Paso 2**: Configurar I2C (ver Apéndice :ref:`i2c_config`. Si ya has configurado I2C, omite este paso.) **Paso 3:** Ir a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/c/2.2.9/ **Paso 4:** Compilar el código. .. raw:: html .. code-block:: gcc 2.2.9_mpu6050.c -lwiringPi -lm **Paso 5:** Ejecutar el archivo ejecutable. .. raw:: html .. code-block:: sudo ./a.out Con el código ejecutándose, el ángulo de deflexión del eje x, el eje y y la aceleración, la velocidad angular en cada eje leída por el MPU6050 se imprimirá en la pantalla después de ser calculada. .. note:: * Si aparece el mensaje de error ``wiringPi.h: No such file or directory``, por favor consulta :ref:`install_wiringpi`. * Si obtienes el error ``Unable to open I2C device: No such file or directory``, necesitas consultar :ref:`i2c_config` para habilitar I2C y verificar si el cableado es correcto. **Código** .. code-block:: c #include #include #include #include int fd; int acclX, acclY, acclZ; int gyroX, gyroY, gyroZ; double acclX_scaled, acclY_scaled, acclZ_scaled; double gyroX_scaled, gyroY_scaled, gyroZ_scaled; int read_word_2c(int addr) { int val; val = wiringPiI2CReadReg8(fd, addr); val = val << 8; val += wiringPiI2CReadReg8(fd, addr+1); if (val >= 0x8000) val = -(65536 - val); return val; } double dist(double a, double b) { return sqrt((a*a) + (b*b)); } double get_y_rotation(double x, double y, double z) { double radians; radians = atan2(x, dist(y, z)); return -(radians * (180.0 / M_PI)); } double get_x_rotation(double x, double y, double z) { double radians; radians = atan2(y, dist(x, z)); return (radians * (180.0 / M_PI)); } int main() { fd = wiringPiI2CSetup (0x68); wiringPiI2CWriteReg8 (fd,0x6B,0x00);//disable sleep mode printf("set 0x6B=%X\n",wiringPiI2CReadReg8 (fd,0x6B)); while(1) { gyroX = read_word_2c(0x43); gyroY = read_word_2c(0x45); gyroZ = read_word_2c(0x47); gyroX_scaled = gyroX / 131.0; gyroY_scaled = gyroY / 131.0; gyroZ_scaled = gyroZ / 131.0; //Print values for the X, Y, and Z axes of the gyroscope sensor. printf("My gyroX_scaled: %f\n", gyroY X_scaled); printf("My gyroY_scaled: %f\n", gyroY Y_scaled); printf("My gyroZ_scaled: %f\n", gyroY Z_scaled); acclX = read_word_2c(0x3B); acclY = read_word_2c(0x3D); acclZ = read_word_2c(0x3F); acclX_scaled = acclX / 16384.0; acclY_scaled = acclY / 16384.0; acclZ_scaled = acclZ / 16384.0; //Print the X, Y, and Z values of the acceleration sensor. printf("My acclX_scaled: %f\n", acclX_scaled); printf("My acclY_scaled: %f\n", acclY_scaled); printf("My acclZ_scaled: %f\n", acclZ_scaled); printf("My X rotation: %f\n", get_x_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); printf("My Y rotation: %f\n", get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); delay(100); } return 0; } **Explicación del Código** .. code-block:: c int read_word_2c(int addr) { int val; val = wiringPiI2CReadReg8(fd, addr); val = val << 8; val += wiringPiI2CReadReg8(fd, addr+1); if (val >= 0x8000) val = -(65536 - val); return val; } Leer datos del sensor enviados desde el MPU6050. .. code-block:: c double get_y_rotation(double x, double y, double z) { double radians; radians = atan2(x, dist(y, z)); return -(radians * (180.0 / M_PI)); } Obtenemos el ángulo de deflexión en el eje Y. .. code-block:: c double get_x_rotation(double x, double y, double z) { double radians; radians = atan2(y, dist(x, z)); return (radians * (180.0 / M_PI)); } Calcular el ángulo de deflexión del eje X. .. code-block:: c gyroX = read_word_2c(0x43); gyroY = read_word_2c(0x45); gyroZ = read_word_2c(0x47); gyroX_scaled = gyroX / 131.0; gyroY_scaled = gyroY / 131.0; gyroZ_scaled = gyroZ / 131.0; //Print values for the X, Y, and Z axes of the gyroscope sensor. printf("My gyroX_scaled: %f\n", gyroY X_scaled); printf("My gyroY_scaled: %f\n", gyroY Y_scaled); printf("My gyroZ_scaled: %f\n", gyroY Z_scaled); Leer los valores de los ejes x, y y z en el sensor de giroscopio, convertir los metadatos en valores de velocidad angular y luego imprimirlos. .. code-block:: c acclX = read_word_2c(0x3B); acclY = read_word_2c(0x3D); acclZ = read_word_2c(0x3F); acclX_scaled = acclX / 16384.0; acclY_scaled = acclY / 16384.0; acclZ_scaled = acclZ / 16384.0; //Print the X, Y, and Z values of the acceleration sensor. printf("My acclX_scaled: %f\n", acclX_scaled); printf("My acclY_scaled: %f\n", acclY_scaled); printf("My acclZ_scaled: %f\n", acclZ_scaled); Leer los valores de los ejes x, y y z en el sensor de aceleración, convertir los metadatos en valores de velocidad acelerada (unidad de gravedad) y luego imprimirlos. .. code-block:: c printf("My X rotation: %f\n", get_x_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); printf("My Y rotation: %f\n", get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); Imprimir los ángulos de deflexión de los ejes x e y. Imagen del Fenómeno ------------------------ .. image:: ../img/image228.jpeg