Lección anteriorInicio del tutorialSiguiente lección

Enlace de compra

Comprar en OSOYOO Comprar en EE. UU.

Contenido


1Objetivo

Este tutorial se centra en mejorar las capacidades autónomas del coche robot OSOYOO V3 utilizando el módulo MPU6050 (IMU) para mantener la dirección deseada. El MPU6050, un sensor de movimiento de 3 ejes, proporciona datos de velocidad angular (giroscopio) y aceleración lineal (acelerómetro), lo que permite al robot corregir activamente su trayectoria. Esta lección cubre las técnicas de fusión de sensores y los algoritmos de control PID para una conducción en línea recta estable.Coche robot OSOYOO V3 para Arduino con giroscopio MPU6050

2Componentes necesarios

Para esta lección, necesitas el siguiente componente. Asegúrate de tenerlo a mano antes de empezar.

N.° Imagen Dispositivo Cant. Accesorios Enlace
1 Módulo giroscopio MPU6050 de 3 ejes Giroscopio MPU6050 de 3 ejes 1 Haz clic aquí para comprar

3MPU6050: Principios de funcionamiento

El MPU6050 integra un giroscopio de 3 ejes y un acelerómetro de 3 ejes. El giroscopio mide la velocidad angular, proporcionando información sobre la velocidad de rotación del robot alrededor de sus ejes X, Y y Z. La integración de estos datos a lo largo del tiempo da como resultado el desplazamiento angular (por ejemplo, el ángulo de guiñada). Sin embargo, los datos brutos del giroscopio están sujetos a deriva, lo que significa que acumulan pequeños errores con el tiempo. El acelerómetro mide la aceleración lineal, que puede utilizarse para determinar la orientación del dispositivo respecto a la gravedad. Aunque los acelerómetros son estables a largo plazo, son muy sensibles a las vibraciones y los movimientos bruscos, lo que hace que sus datos de orientación brutos sean ruidosos.
Módulo giroscopio MPU6050 montado en el coche robot OSOYOO V3

4Instalación de hardware

Paso 1: Realiza el ensamblaje de hardware básico descrito en la lección 1 del coche robot. Si ya terminaste la lección 1, deja todo como está.

Ensamblaje del chasis básico del coche robot OSOYOO V3

Paso 2: Fija el módulo MPU6050 de forma segura en el chasis del robot como se muestra a continuación. (El MPU6050 se comunica con Arduino a través del protocolo I2C, que solo requiere dos líneas de datos: SDA (Serial Data) y SCL (Serial Clock), además de alimentación (VCC) y masa (GND).)

Diagrama de cableado del MPU6050 para el coche robot OSOYOO V3 Arduino

 

5Instalación de software

Software Arduino
de código abierto (IDE)
Logo del Arduino IDE Descarga el software aquí:
https://www.arduino.cc/en/Main/Software?setlang=en
7-Zip es una utilidad gratuita
para extraer archivos ZIP
Logo de 7-Zip Descarga 7-Zip gratis aquí:
https://www.7-zip.org/

1. Configuración del Arduino IDE: Descarga e instala la última versión del Arduino IDE desde https://www.arduino.cc/en/Main/Software?setlang=en.

Instalación del Arduino IDE
2. Descarga del código de ejemplo: Descarga el código de ejemplo para la lección 2 desde aquí. Extrae el contenido y encontrarás un archivo llamado v3car-lesson2.ino dentro de una carpeta llamada v3car-lesson2. Abre v3car-lesson2.ino en el Arduino IDE.

Abrir el código de ejemplo en el Arduino IDE

3. Instalación de librerías
Primero, descarga los archivos ZIP de las librerías desde los enlaces siguientes:
https://osoyoo.com/driver/2wd/MPU6050_light.zip
https://osoyoo.com/driver/2wd/PID.zip
No descomprimas los archivos. Abre el Arduino IDE -> Programa -> Incluir librería -> Añadir biblioteca .ZIP. Añade los archivos ZIP al Arduino IDE uno por uno.

Añadir una librería ZIP en el Arduino IDE

4. Selección de placa y puerto: Conecta la OSOYOO Basic Board (compatible con Arduino UNO) a tu ordenador mediante un cable USB (Importante: asegúrate de que el interruptor del coche robot esté apagado y la batería desconectada antes de conectar la placa al PC). Abre el Arduino IDE. Ve a Herramientas > Placa y selecciona Arduino Uno. Luego ve a Herramientas > Puerto y selecciona el puerto serie correcto. Si no estás seguro, consulta el administrador de dispositivos de tu sistema operativo.

Selección de placa y puerto en el Arduino IDE

5. Cargar el código: Haz clic en el botón “Cargar” (icono de flecha hacia la derecha) para compilar y cargar el sketch en la OSOYOO Basic Board.

Cargar el código en la placa Arduino

6. Comprobar si Arduino detecta el MPU6050

Abre el Monitor Serie (esquina superior derecha del Arduino IDE), ajusta la velocidad de transmisión a 9600 y deberías ver MPU6050 Found! como se muestra a continuación. ¡Felicidades! Arduino está detectando el MPU6050 — ya puedes probar el coche.

Monitor Serie de Arduino mostrando MPU6050 Found

Nota: Si ves “Failed to find MPU6050 chip“, hay un problema de cableado. Asegúrate de que:
1) Los pines VCC/GND/SDA/SCL del MPU6050 estén correctamente conectados al shield OSOLINK Wi-Fi/BLE I/O según nuestras instrucciones
2) Los pines A4/A5 y SDA/SCL de Arduino no tengan otros cables conectados (en proyectos de seguimiento de líneas, A4/A5 pueden estar ya en uso por el sensor de seguimiento)

6Probar el coche


Coloca el coche en el suelo y enciende la alimentación. El coche hará una breve pausa mientras Arduino inicializa el giroscopio. Luego avanzará en línea recta. Si lo empujas con el pie para desviar su trayectoria, se corregirá automáticamente volviendo a su dirección original.

7Breve explicación de los principios y el código

1) ¿Cómo controla la función Move() el movimiento y la dirección del coche?
El coche robot OSOYOO utiliza dirección diferencial. La función move(speedL, speedR) acepta dos parámetros, speedL y speedR, que representan la velocidad de rotación de las ruedas izquierda y derecha respectivamente. El valor de velocidad va de -255 a +255, donde un valor positivo indica rotación hacia adelante y un valor negativo indica rotación hacia atrás. Por ejemplo, move(-50, 100) significa que la rueda izquierda gira hacia atrás a velocidad 50 y la rueda derecha gira hacia adelante a velocidad 100, lo que provoca un giro brusco a la izquierda.
2) Introducción a la programación del MPU6050
Tras la inicialización, el giroscopio MPU6050 rastrea de forma constante la orientación del robot respecto a su dirección de partida. Cuando el coche robot se desvía de esta dirección inicial, el MPU6050 comunica la desviación a Arduino.
En nuestro código, la variable Direction representa la orientación del coche en el momento en que se coloca en el suelo (asumimos que apunta hacia adelante, por lo que establecemos Direction en 0).
Tras los cálculos de las primeras líneas de la función loop(), obtenemos la orientación actual del coche en la variable currentAngle en la línea 129.

3) Introducción al PID y al código:

a) La idea principal: ¿qué es el PID?
Imagina que estás conduciendo un coche y tu objetivo es mantenerte perfectamente en el centro de tu carril. Eso es exactamente lo que le pedimos a nuestro robot: mantenerse en la línea “recto al frente”.
El PID es un algoritmo de control que actúa como un conductor atento. Plantea continuamente tres preguntas para decidir cómo girar:
  1. P (Proporcional): ¿Qué tan lejos estoy del centro del carril ahora mismo?
  2. I (Integral): ¿He estado descentrado de forma constante los últimos instantes?
  3. D (Derivativo): ¿Estoy virando demasiado rápido hacia el centro o alejándome de él?

Al combinar las respuestas a estas tres preguntas, el controlador PID realiza una corrección de dirección suave y eficiente.

b) Cómo funciona la función PID en nuestro código
Conectemos esta teoría directamente con la librería PID_v1.h y tu código.
1. Inicialización (en setup()):
// We tell the PID controller what to watch and what to control.
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

Direction = 0; // Our TARGET is to have an angle of 0 degrees.
myPID.SetMode(AUTOMATIC); // Turn on the controller.
  • &Input: Un puntero a nuestra lectura del sensor. En nuestro código, Input es currentAngle. El controlador PID lee este valor continuamente.
  • &Output: Un puntero a nuestro resultado. El controlador PID escribe el valor de corrección calculado en la variable Output.
  • &Direction: Un puntero a nuestro objetivo. Queremos ir recto, así que lo fijamos en 0.
2. El bucle principal (en loop()):
// 1. We get the sensor reading and put it into the Input variable.
Input = currentAngle; 

// 2. We call the compute function. This is where the PID magic happens!
myPID.Compute(); 

// 3. We use the result to control the motors.
int speedL = baseSpeed - Output;
int speedR = baseSpeed + Output;
move(speedL, speedR);
La función myPID.Compute() realiza todo el trabajo internamente. Cada vez que se llama (la librería gestiona el tiempo según SetSampleTime), lleva a cabo los siguientes pasos:
  1. Lee el valor de la variable Input (currentAngle).
  2. Calcula el error: error = Direction - Input.
  3. Calcula el término Proporcional (Kp * error).
  4. Calcula y suma el término Integral (Ki * accumulated_error).
  5. Calcula y suma el término Derivativo (Kd * rate_of_error_change).
  6. Los suma todos para obtener el valor de corrección final.
  7. Escribe este valor final en la variable Output.
Así, si Output es +15, significa que el robot necesita una corrección de 15 unidades. La aplicamos reduciendo la velocidad de un motor (baseSpeed - 15) y aumentando la del otro (baseSpeed + 15), lo que hace girar al robot y reduce su error. Si el robot va perfectamente recto, Input será 0, el error será 0 y Output será 0, por lo que ambos motores funcionarán a baseSpeed.

4) Cómo ajustar Kp, Ki y Kd para un movimiento estable

  1. Para empezar: Establece Ki = 0.0 y Kd = 0.0 en tu código.
  2. Encuentra un valor de Kp estable que no oscile (o apenas oscile). Probablemente sea inferior a 1,5.
  3. (Opcional pero recomendado) Añade una banda muerta de unos 0,5 grados a tu bucle para ignorar el ruido del sensor.
  4. Una vez que Kp sea estable, aumenta lentamente Kd para reducir cualquier sobreoscilación residual.
  5. Por último, aumenta lentamente Ki para eliminar la deriva a largo plazo.

 

8Consideraciones avanzadas y solución de problemas

Siguiendo estas pautas y comprendiendo los principios subyacentes, puedes convertir el coche robot OSOYOO V3 en una plataforma capaz de navegación autónoma, sentando las bases para proyectos de robótica más avanzados.

Lección anteriorInicio del tutorialSiguiente lección