Mostrando entradas con la etiqueta NANO. Mostrar todas las entradas
Mostrando entradas con la etiqueta NANO. Mostrar todas las entradas

sábado, 8 de febrero de 2025

MPU6050 con Arduino: Acelerómetro y giroscopio – Guía completa

Muy buenas a todos!!!

Vamos a ver que funcionalidades tiene el sensor MPU6050 el cual integra un acelerómetro de 3 ejes un giroscopio de 3 ejes y un sensor de temperatura, aunque este último no es muy preciso.

Antes de empezar vamos a destacar algunos de los términos que se usan con este sensor:

¿Que mide el acelerómetro?

Como su nombre indica, un acelerómetro mide la aceleración que es una magnitud vectorial, es decir, mide el cambio de velocidad y la dirección hacia donde se realiza el cambio.

A grandes rasgos hay tres tipos de aceleración:

  • Aceleración positiva: La velocidad de un objeto aumenta en el tiempo.

  • Aceleración negativa: La velocidad de un objeto disminuye con el tiempo.
  • Aceleración centrípeta: La dirección cambia a una velocidad constante.

¿Que mide el giroscopio?

Un giroscopio es un dispositivo que mide la velocidad angular o tasa de rotación de un objeto en los ejes X, Y y Z.

La velocidad angular se expresa en grados por segundo (°/s) o radianes por segundo (rad/s).

El MPU6050, está basado en tecnología Micro-Electro-Mechanical Systems más conocido como MEMS.

Esta tecnología utilizan un pequeño elemento vibrante que, al girar, experimenta una fuerza llamada efecto Coriolis.

Esta fuerza es detectada y convertida en una señal eléctrica, que luego se traduce en una medida de la velocidad angular. Esto nos permite detectar rotaciones en cualquier dirección.

También podemos configurar el rango de medición teniendo en cuenta que rotaciones más rápidas equivalen a una menor precisión.

El rango de medición es configurable con los siguientes valores:

  • ±250 °/s
  • ±500 °/s
  • ±1000 °/s
  • ±2000 °/s

Resumen de aceleración y giroscopio en el contexto del MPU6050

El acelerómetro del MPU6050 mide la aceleración en los ejes X, Y, Z. Esto incluye:


  • La aceleración debida al movimiento por ejemplo, si mueves el sensor.
  • La aceleración debida a la gravedad 9.8 m/s² hacia el centro de la Tierra.

El acelerómetro del MPU6050 mide la velocidad angular en los ejes: X, Y y Z.


  • La velocidad angular se expresa en grados por segundo (°/s) o radianes por segundo (rad/s).

Diferencia entre giroscopio y acelerómetro


  • Acelerómetro: Mide la aceleración lineal (cambios en la velocidad en línea recta) y la inclinación respecto a la gravedad.
  • Giroscopio: Mide la velocidad angular (cambios en la rotación o giro).

La combinación de ambos sensores trabajando juntos para proporcionan una imagen completa del movimiento de un objeto. Por ejemplo:

  • El acelerómetro puede decirte si un objeto está inclinado.
  • El giroscopio puede decirte si el objeto está girando y a qué velocidad.

Conexiones MPU6050:

  • VCC: Alimentación 3.3v-5v+.
  • GND: Alimentación - o masas.
  • SCL: Serial Clock pin para la interfaz I2C.
  • SDA: Serial Data pin para la interfaz I2C.
  • XDA: I2C externo Serial Data para conectar sensores externos como un magnetómetro.
  • XCL: I2C externo Serial clock.
  • AD0: Cambia de dirección para evitar conflictos: GND -> Dirección 0X68 o +3.3V -> Dirección 0x69.
  • INT: Pin de interrupción. El MPU6050 puede programarse para generar interrupciones al detectar ciertos gestos o vibraciones.



Librerías para MPU650:

Las principales librerías que sirven para casi todos los microcontroladores Arduino:



Ejemplo para Arduino UNO/NANO:




/*
 * Ejemplo de lectura de datos para el sensor MPU6050
 * valido para Arduino UNO y NANO
*/

#include <Wire.h>

// Dirección del sensor
const int MPU6050_addr=0x68;


int16_t AccX, AccY, AccZ; 
int16_t GyroX, GyroY, GyroZ;
int16_t Temp;

void setup(){
  
  Wire.begin();
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  
  Serial.begin(115200);
}

void loop(){
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU6050_addr,14,true);
  
  AccX=Wire.read()<<8|Wire.read();
  AccY=Wire.read()<<8|Wire.read();
  AccZ=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();
  
  Serial.print("AccX = "); Serial.print(AccX);
  Serial.print(" || AccY = "); Serial.print(AccY);
  Serial.print(" || AccZ = "); Serial.print(AccZ);
  Serial.print(" || Temp = "); Serial.print(Temp/340.00+36.53);
  Serial.print(" || GyroX = "); Serial.print(GyroX);
  Serial.print(" || GyroY = "); Serial.print(GyroY);
  Serial.print(" || GyroZ = "); Serial.println(GyroZ);
  delay(100);
}


Una vez que subamos el programa al microcontrolador, en el monitor serial, tendremos la siguiente salida:


AccX = 13432 || AccY = -792 || AccZ = 9780 || Temp = 44.06 || GyroX = 911 || GyroY = -10038 || GyroZ = -5514


Problemas con las librerías


Mientras he realizado las pruebas he tenido algunos problemas con las librerías, por lo que al final he usado la obtención de datos usando unicamente la librería "Wire.h". Con estos datos podemos hacer casí cualquier sistema que necesite conocer su posición, movimiento y posición angular tales como...

  • Drones: Para estabilizar el vuelo y detectar cambios de orientación.
  • Robótica: Para controlar la dirección y el movimiento de robots.
  • Realidad virtual: Para rastrear movimientos de la cabeza o manos.
  • Navegación: En sistemas de navegación inercial para vehículos.

Hoja de datos del MPU6050


Aquí tienes otros enlaces de este blog relacionados con sensores y Arduino:


Saludos!!

domingo, 28 de junio de 2020

Modifica un mando Walkera RC con Arduino Nano y NRF24L01

Muy Buenas a todos y todas las Arduineras!!!

Hace un tiempo dando una vuelta me encontré con este mando de radio control para un ¿Helicoptero? el modelo creo que es el WK-2401 2,4GHz.

No tengo ni idea de sus características y la verdad poco importa... mi interés era el mando en si, los mandos iban bien y tenia posibilidades para ampliar los canales con huecos donde se pueden colocar interruptores en la parte superior y a los lados de la pantalla.

En total me costo 10€ aunque de la web que saque la foto del original lo tienen por 23$ (unos 20€).

Una vez en casa, toda la electrónica fue removida sin problemas, los gimbal iban conectados con un cable a la placa y solo tuve que desconectar.

3 de los 4 canales tienen resorte, es decir vuelven a la posición central y 1 de ellos no, siendo este para aviones y helicópteros ya que mantiene la posición.

Después de quitar la electrónica original le hice un hueco al Arduino NANO y al módulo NRF24L01.


Esquema RC XBOX

El esquema es prácticamente el mismo que he usado para el RC Xbox con algunas modificaciones como pueden ser los pulsadores que los he cambiado por interruptores y los dos pulsadore son para moverse por el menú.

Ademas de 4 interruptores de palanca le he añadido dos pulsadores que serán las teclas "Atras" y "Selección.

La energia es suministrada por una batería de 2 celdas 18650, estas baterías se cargan desde la parte posterior con el interriptor principal en posición OFF.

Así las funciones para el interruptor principal son: ON para uso normal y OFF para apagado o carga de la batería.



Si buscas un poco en internet, veras que tener una buena configuración es imprescindible, pero otros apartados a tener en cuenta son:

  • Aislamiento del módulo NRF24L01
  • Alimentación estable 3.3V
  • Añadir condensador de 47uF lo más cercano a la alimentación del módulo



Adaptador NRF24l01Con esos sencillos puntos veras como mejora el rango de recepción y transmisión.

Otro de los puntos a tener en cuenta es el canal en el que transmitimos, en este caso el 50, ya que, según leí mientras solucionaba problemas de comunicación, los canales más altos daban más problemas (no se hasta que punto sera esto cierto).

Como dato curioso, hubo un día que salí a pleno sol y todo iba fatal, hasta me enfade un poco por que no entendía nada. Al entrar a casa y probar, todo funcionaba bien. No se hasta que punto la radiación solar puede afectar a estos módulos, o si fue algo que toque sin darme cuenta. Bueno yo ahí lo dejo como dato curioso, Ah y cuando digo sol, me refiero a solanero gordo, 38-40ºC...

El programa esta dividido en diferentes archivos para tener un código más limpio y mejor organizado. Aquí está la información sobre como trabajar con pestañas en el Sketch :

  • Walkera_RC24 (Archivo principal)
  • Axis.ino
  • Calibratión.ino
  • Config.h
  • Memory.ino
  • Model.ino
  • Oled.ino

También hace uso de la librería U8Glib para la pantalla oled y usando solo un par de fuentes, ya que son un coladero de memoria.

Se conserva la estructura del mando XboxRC24, pero cambia totalmente la interfaz ya que pasamos de una pantalla LCD a una pantalla oled

Esto hace que haya mychos cambios en la lógica y porsupuesto, dispara el consumo de memoria, almenos en micricontroladores tan justitos como el Arduino NANO.

La configuración del modulo esta en la pestaña Config.h ahí podremos cambiar diferentes parametros del módulo como:.

  • Pines CE y CS
  • Nivel amplificador de potencia (PA)
  • Velocidad de transmisión
  • ACK
  • ACKPAYLOAD
  • delayRF
  • countRF
  • Canal de transmisión (canal50 por defecto)

Otra de las cosas es que se puede ajustar el trim de los canales 1,2,3 y 4, este igual que el mínimo y máximo, también se almacena en la memoria EEprom y se leen al entrar en el modelo.

Seguramente más avanzado cambiare la interfaz ya que es lo que más memoria consume.

Programa para Arduino:

Receptor nRF24L01 Gaz66 desde GitHub

Los módulos nRF24L01 es una muy buena base para hacer proyectos más elaborados con este tipo de módulos, como por ejemplo un mando de Radio Control multifunción o receptores con funciones totalmente personalizadas.

Os dejo enlaces a proyectos realizados con el módulo de radiofrecuencia nRF24L01:

Saludos a todos y todas!!

sábado, 23 de diciembre de 2017

Arduino Ejemplos: Reloj para coche con RTC DS1307, LCD y DHT11

Hola a todos y todas!!!

Hace un tiempo se me rompió el reloj del coche, un viejito Clio de 2004. Estuve mirando el repuesto y estaba entre 20 y 40€ y su función en mi coche era solamente dar la hora, el sensor de temperatura era un extra que no puse en su momento.

Bueno después de muchos años el reloj del coche paso a mejor vida...

Arduino ha sido una solución original y económica para este problema. Con menos de 10€ he montado un reloj con 2 sensores de temperatura/humedad DHT11 un LCD a juego con la iluminación interior de coche (rojo) y un modulo RTC D1307 i2C.

Este programa es una variación de otro que publique en este articulo Arduino: Reloj calendario con RTC DS1307 i2C.


Componentes necesarios:

  • 1 x Arduino NANO.
  • 1 x LCD 16x2.
  • 2 x DHT11.
  • 3 x Pulsadores
  • 1 x Divisor de tensión.

Arduino_RTC, DHT11 and voltmeter
Arduino Reloj RTC para coche.

lunes, 18 de septiembre de 2017

Android: DFPlayer Mini Bt Controla tu modulo DFPlayer Mini fácil y sencillo

DFPlayer Mini Bluetooth para Android

Después de ver la buena aceptación del programa para Android DFPlayer Mini Bt para controlar dicho modulo a través de un terminal Android, decidí hacerle algunas mejoras y de ahí ha salido esta su siguiente: DFPlayer Mini Bt v2.

En DFPlayer Mini Bt v2 se ha mejorado la interfaz y añadido nuevas funcionalidades y una mejora en la comunicación entre el modulo HC-06 y el terminal.

Puedes encontrar toda la información de los comandos que se utilizan en la transmisión de datos entre la APP y Arduino en la sección "Ayuda" de la misma aplicación.

Actualización 2025 con librería DFRobot DFPlayerMini y DFPlayer Mini BT

En la versión anterior del DFPlayer Mini Bt solo se podían utilizar las funciones básicas como Play, Stop, Canción siguiente, Canción anterior y Volumen.



martes, 6 de octubre de 2015

Moviendo desvíos con servos y Arduino

Servo Tower Pro 9GBuenas a todos y todas los amantes de Arduino!!!

Después de estar mirando como poder mover los desvíos de mi nueva maqueta (aun en construcción) y viendo los precios y los diferentes sistemas (electroimanes, relés, motores caseros, etc..) me he decantado por los servos de modelismo y Arduino.

Lo que más me ha convencido son su bajo precio y lo fácil que son de instalar, si a eso le añadimos una placa Arduino, la cosa se hace mucho más interesante.

Ya no es que solo podamos mover el servo con Arduino, sino que también podremos tener salidas para poder conectar semáforos o cualquier otra cosa que queramos como los corazones de los desvíos.

Servo Tower Pro 9G:


viernes, 16 de enero de 2015

Arduino Ejemplos: Pantalla LCD 16x2 – Guía de conexión y funciones

Después de ver como funcionan los pulsadores le toca el turno a las parntallas de tipo LCD.

El LCD (Liquid Crystal Display por sus siglas en ingles) es una pantalla delgada y plana formada por pixeles.

Una de las mejores cualidades de este tipo de pantallas es su bajo consumo, pero también podemos destacar su facilidad de uso, su gran disponibilidad y fiabilidad

Este tipo de pantallas se utilizan en gran variedad de aparatos electrónicos dada su simplicidad tanto en conexiones como en su utilización. En ella se pueden reflejar desde un simple texto tipo "hello World", coordenadas GPS o cualquier tipo de variable que quepa en sus 16 caracteres.

También las hay de diferentes tipos y medidas como LCDs gráficas o LCDs a color, de 16x2 caracteres, 20x4 o incluso más.

En este ejemplo en particular usaremos la típica pantalla LCD de 16x2 caracteres.



Primero hablemos sobre sus pines y cuales son sus conexiones.

Listado de conexiones del LCD 16x02

  • VSS o GND: Este pin del LCD es el pin conectado a masa (-)

  • VDD: Este pin es la alimentación del LCD y se conecta a +5V

  • Vo: Es el pin del contraste, este pin no esta siempre presente, pero si tu LCD lo tuviera, hay que conectarlo a un potenciómetro para poder regular el contraste, si lo conectas directamente a GND la pantalla no se vera correctamente.

  • RS: Es el pin de selección de registros que controla en que parte de la memoria del LCD esta escribiendo los datos.

  • R/W: Modo de lectura o escritura. Este pin va conectado normalmente a masa (GND)

  • E: Este pin habilita los registros. (Enable)

  • DB0...DB7: Son los 8 pines de datos.

  • A: Ánodo del LED de iluminación del LCD (+)

  • K: Cátodo del LED de iluminacion del LCD (-)

Su conexión con Arduino seria la siguiente:

Para facilitar el uso del LCD Arduino tiene una libreria llamada "LiquidCrystal.h" que hará mucho más fácil la comunicación entre el Arduino y la pantalla LCD.

Dentro de esta librería están las siguientes funciones: