Tabla de contenido:

Controlar el servo usando MPU6050 entre Arduino y ESP8266 con HC-12: 6 pasos
Controlar el servo usando MPU6050 entre Arduino y ESP8266 con HC-12: 6 pasos

Video: Controlar el servo usando MPU6050 entre Arduino y ESP8266 con HC-12: 6 pasos

Video: Controlar el servo usando MPU6050 entre Arduino y ESP8266 con HC-12: 6 pasos
Video: Control de 2 Servo Motores con Acelerometro y Giroscopio MPU 6050 Teoria y Practica 2024, Noviembre
Anonim
Controlar el servo usando MPU6050 entre Arduino y ESP8266 con HC-12
Controlar el servo usando MPU6050 entre Arduino y ESP8266 con HC-12

En este proyecto, estamos controlando la posición de un servomotor usando el mpu6050 y el HC-12 para la comunicación entre Arduino UNO y ESP8266 NodeMCU.

Paso 1: ACERCA DE ESTE PROYECTO

Es otro proyecto de IoT basado en el módulo RF HC-12. Aquí, los datos imu (mpu6050) de arduino se utilizan para controlar el servomotor (conectado con Nodemcu). Aquí, la visualización de datos también se realiza en el lado de arduino, donde los datos de tono mpu6050 (rotación sobre el eje x) se visualizan con un boceto de procesamiento (discutido más adelante). Básicamente, este proyecto es solo un poco de preparación para recordar diferentes aspectos del control Imu & Servo con Arduino y ESP8266 nodemcu.

OBJETIVO

El objetivo de esto es bastante claro, estamos controlando la posición del servomotor usando el valor de paso de IMU. Y en conjunto, este paso y la posición del motor sincronizado se visualizan con Processing.

Paso 2: Hardware requerido

Módulo Wifi NodeMCU ESP8266 12E

Protoboard sin soldadura

Cable pasa corriente

MPU6050 accelo + giroscopio

Módulos de RF HC-12 (par)

Servomotor SG90

Paso 3: circuito y conexiones

Circuito y conexiones
Circuito y conexiones
Circuito y conexiones
Circuito y conexiones

Las conexiones son sencillas. Puede alimentar el servo con 3.3V de su Nodemcu. También puede usar Vin para alimentar el servo si su nodemcu tiene tanto voltaje en ese pin. Pero la mayoría de las placas Lolin no tienen 5V en Vin (depende del fabricante).

Estos diagramas de circuitos se realizan con EasyADA.

Paso 4: TRABAJANDO

LABORAL
LABORAL

Tan pronto como se inicie el boceto de arduino, enviará el ángulo de inclinación (que varía de -45 a 45) al receptor hc12 de Nodemcu que se mapea con una posición de servo de 0 a 180 grados. Aquí usamos el ángulo de inclinación de -45 a +45 grados para que podamos asignarlo fácilmente a la posición del Servo.

Ahora, estás pensando por qué podemos simplemente usar el método del mapa de la siguiente manera:

int pos = map (val, -45, 45, 0, 180);

Porque el ángulo negativo enviado por el transmisor hc12 se recibe como:

1a mitad: (T) 0 a 45 => 0 a 45 (R)

2da mitad: (T) -45 a -1 => 255 a 210 (R)

Entonces tienes que mapearlo de 0 a 180 como

si (val> = 0 && val <= 45) pos = (val * 2) +90; si no pos = (val-210) * 2;

Estoy evitando el método del mapa debido a un error irrelevante. Puedes probar eso y comentar que funciona contigo

if (val> = 0 && val <= 45) pos = map (val, 0, 45, 90, 180); else pos = map (val, 255, 210, 0, 90); // El cuarto argumento puede ser 2 (puedes comprobarlo)

Cálculo del ángulo de inclinación del MPU6050

Estoy usando la biblioteca MPU6050_tockn que se basa en proporcionar datos sin procesar de la IMU.

int pitchAngle = mpu6050.getAngleX ()

Esto nos dará el ángulo de rotación sobre el eje x. Como puede ver en la figura, mi imu está colocado verticalmente en la placa de pruebas, así que no lo confunda con cabeceo y balanceo. En realidad, siempre debería ver el eje impreso en la placa de conexión.

A través de esta biblioteca, no tiene que preocuparse por la electrónica interna de leer registros específicos para una operación específica. ¡Solo especifica el trabajo y listo!

Por cierto, si quieres calcular el ángulo tú mismo. Puede hacerlo fácilmente de la siguiente manera:

#incluir

const int MPU6050_addr = 0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; configuración vacía () {Wire.begin (); Wire.beginTransmission (MPU6050_addr); Wire.write (0x6B); Wire.write (0); Wire.endTransmission (verdadero); Serial.begin (9600); } bucle vacío () {Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission (falso); Wire.requestFrom (MPU6050_addr, 14, verdadero); AcX = Wire.read () << 8 | Wire.read (); AcY = Wire.read () << 8 | Wire.read (); AcZ = Wire.read () << 8 | Wire.read (); Temp = Wire.read () << 8 | Wire.read (); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read ();

int xAng = mapa (AcX, minVal, maxVal, -90, 90); int yAng = mapa (AcY, minVal, maxVal, -90, 90); int zAng = mapa (AcZ, minVal, maxVal, -90, 90); x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI); y = RAD_TO_DEG * (atan2 (-xAng, -zAng) + PI); z = RAD_TO_DEG * (atan2 (-yAng, -xAng) + PI); Serial.print ("AngleX ="); // Pitch Serial.println (x); Serial.print ("AngleY ="); // Roll Serial.println (y); Serial.print ("AngleZ ="); // Yaw Serial.println (z); }

Pero no es necesario que escriba tanto código para obtener el ángulo. Debe conocer los hechos detrás de escena, pero usar la biblioteca de otras personas es muy efectivo en muchos proyectos. Puede leer sobre este imu y otros enfoques para obtener más datos filtrados en el siguiente enlace: Explore-mpu6050.

Mi código arduino en el extremo de transmisión tiene solo 30 líneas con la ayuda de la biblioteca MPU6050_tockn, por lo que usar una biblioteca es bueno a menos que no necesite algunos cambios básicos en la funcionalidad de IMU. Una biblioteca llamada I2Cdev de Jeff Rowberg es muy útil si desea algunos datos filtrados utilizando el DMP (procesador de movimiento digital) de la IMU.

Integración con Processing

Aquí, el procesamiento se utiliza para visualizar los datos de rotación sobre el eje x de IMU calculados por los datos sin procesar que provienen de MPU6050. Recibimos los datos brutos entrantes en SerialEvent de la siguiente manera:

void serialEvent (Serial myPort) {

inString = myPort.readString (); try {// Analizar los datos // println (inString); String dataStrings = split (inString, ':'); if (dataStrings.length == 2) {if (dataStrings [0].equals ("RAW")) {for (int i = 0; i <dataStrings.length - 1; i ++) {raw = float (dataStrings [i + 1]); }} else {println (inString); }}} catch (Excepción e) {println ("Excepción detectada"); }}

Aquí puede ver la visualización en la imagen adjunta en este paso. Los datos de posición recibidos en el extremo nodemcu también se ven en el monitor en serie como se muestra en la imagen.

Paso 5: CÓDIGO

He adjuntado el repositorio de github. Puede clonarlo y bifurcarlo para usarlo en sus proyectos.

mi código

El repositorio incluye 2 bocetos arduino para transmisor (arduino + IMU) y receptor (Nodemcu + Servo).

Y un boceto de procesamiento. Destaque el repositorio si esto ayuda en su proyecto.

En este instructable, R- Receptor y T- Transmisor

Paso 6: DEMOSTRACIÓN EN VIDEO

Adjuntaré el video mañana. Sígueme para recibir notificaciones.

¡Gracias a todos!

Recomendado: