Tutorial 8. Lectura del sensor MPU6050 (Acelerómetro y Giroscópio) en Microcontrolador de la serie STM32F4.

El objetivo de este tutorial es mostrar como configurar nuestra tarjeta de desarrollo Ophyra para leer el sensor MPU6050. Este sensor es un Acelerómetro y Giroscopio integrado con comunicación I2C. Para demostrar su funcionamiento realizaremos un ejemplo donde mandaremos los datos leídos del sensor hacia el puerto RS232 para visualizarlos en la terminal del compilador.

Configurar Hardware usando STM32CubeMX.

Lo primero que vamos a realizar será la correspondiente configuración de los recursos de nuestra tarjeta en STM32CubeMX de la siguiente manera:

Creamos un proyecto nuevo (Imagen 1) y seleccionamos el microcontrolador STN32F407VG, como ya sabemos, que es el correspondiente a nuestra tarjeta Ophyra.

Imagen 1. Nuevo Proyecto en STM32CubeMX. Imagen 2. Selección del microcontrolador.

Como ya se mencionó se utilizará la comunicación RS232 para desplegar la información proveniente del sensor MPU6050. Por lo que utilizaremos el recurso “USART 3”, así que lo buscamos en la parte izquierda de la ventana “Pinout”, lo seleccionamos y lo habilitamos. Seguidamente, en la parte donde dice “Modo” seleccionamos la opción de “Asynchronous”, y en el apartado que dice “Hardware Flow Control (RS232)” lo dejamos en la opción “Disable”, es decir deshabilitado. Ahora podremos observar los pines correspondientes a “TX” y a “RX”, es decir los pines correspondientes para transmitir y para recibir son habilitados y puestos de color verde como se puede apreciar en la imagen 3.

Imagen 3. Habilitación del puerto RS-232 número 3.

El siguiente paso es habilitar el puerto I2C número 1. En este puerto se encuentra conectado el sensor MMPU6050. Como se sabe este puerto utiliza dos pines o puertos para realizar la comunicación:

  • SDA: Puerto serial síncrono bidireccional, por donde se transmiten los datos de dispositivo a dispositivo.
  • SCL: Puerto serial de sicronía de datos, este genera una señal de reloj con la velocidad de transferencia de datos adecaudo al sensor.

En la sección de “Pinout” habilitamos el puerto I2C1 y lo ponemos en modo “I2C”, como se muestra en la Imagen 4. También en la imagen se observa que en los pines del microcontrolador se habilitan los puertos PB7 = I2C_SDA y PB6= I2C_SCL. Estos puertos están conectados por defecto al sensor por lo tanto no es necesario moverlos o renombrarlos.

En el puerto I2C1 también está conectado un dispositivo adicional (una memoria EEPROM) como se detalla en la tabla 1. Ambos dispositivos tienen configurados por hardware sus ID o dirección de identificación esclavo como lo muestra la tabla. En el protocolo I2C, la ID siempre se envía al inicio de una comunicación entre dispositivos maestro-esclavo. Mediante estas direcciones se controla con que dispositivo esclavo se comunicará el dispositivo maestro. Cuando un dispositivo esclavo reconoce su ID, este responde al dispositivo maestro mediante una señal de reconocimiento (acknowledgemt en ingles), es en ese momento cuando se entabla una comunicación entre ambos.

Tabla 1. Dispositivos conectados al  puerto I2C1 de Ophyra.

Si deseamos utilizar otro dispositivo con protocolo I2C, no será posible utilizar el bus I2C1, ya que no se encuentra mapeado hacia algún pin físico de los puertos de expansión CN1, CN2 y CN3; sin embargo el microcontrolador de Ophyra tiene 2 puertos I2C adicionales, que son posible habilitar (I2C2 o el I2C3) recomendamos revisar el manual de Ophyra en la sección 5.14 Puertos de expansión para identificar en que conector tenemos disponible un puerto adicional I2C.

Imagen 4. Habilitación del puerto I2C y dispositivos conectados al mismo puerto.

A continuación damos click sobre la pestaña de “Configuration” y entramos a las ventanas de configuración de cada recurso activado (ver la imagen 5). En la imagen 6 se observa la ventana de configuración del protocolo RS-232.  Nos cercioramos que las configuraciones estén debidamente activadas y damos en el botón de aceptar. Ahora hacemos lo mismo con la configuración del puerto I2C.

Imagen 5. Botones a seleccionar.

Imagen 6. Parámetros del puerto RS-232 y del puerto I2C.

En la pestaña de configuración encontramos en conectividad “Conecctivity” el protoclo I2C. Accionando sobre este botón se muestran algunas configuraciones:

  • I2C Speed Mode: Modo de velocidad.
  • I2C Clock Speed (Hz): Frecuencia de velocidad.
  • Clock No Strech Mode: Modo que alenta la velocidad de comunicación.
  • Primary Address Length selection: Dirección primaria de comunicación.
  • Dual Address Acknowledge: Reconocer la dirección.
  • Primary slave address: Dirección esclava primaria.
  • General Call Adreess detection: Detección del reconocimiento de dirección.

 

Imagen 7Generación de código.

lick en “Apply” y posteriormente en “Ok”. Ahora podemos proceder a generar el código, haciendo click sobre el icono de “Generate Source Code…“, ubicado en la parte superior de la ventana principal, donde se desplegará la siguiente ventana:

Imagen 8. Ventana de Proyect settings.

Una vez en esta ventana procedemos a configurar los siguientes parámetros:

  1. Project Name, se coloca un nombre para el proyecto, que en nuestro caso será Tutorial_AccGyro_Serial .

  2. En Project Location, en este campo solo debes asegurarte que se encuentre la dirección donde se ubica tu Workspace para Atollic TrueSTUDIO, en nuestro ejemplo el Wokspace se encuentra enC:\Users\Fernando\Atollic\TrueSTUDIO\ARM_workspace_7.1. Una vez seleccionada la ubicación automáticamente la sección “Toolchain Folder Location” se llenará.

  3. En la Toolchain / IDE, aquí debemos seleccionar nuestro software que utilizaremos para programar, que por ser un Software libre, nosotros usaremos Atollic TrueSTUDIO, por lo tanto seleccionamos TrueSTUDIO.

  4. Seleccionamos la pestaña Code Generator y damos click sobre la opción que se muestra en la imagen.

  5. Al darle click sobre esta opción configuramos el STM32 CubeMX para que nos genere los archivos de configuración separados del archivo “main”. Este paso es opcional y depende de la preferencia del programador.

Finalmente damos click en “OK”, y a continuación se desplegará la ventana que muestra la generación del proyecto, en la cual vamos a dar click en“Open Project”.

Realizar programa en Atollic TrueSTUDIO.

Una vez que STM32CubeMx nos abre TrueStudio, nos dirigimos al explorador de proyectos donde se muestra el proyecto actual como se muestra en la siguiente imagen. Desplegamos las la carpeta de nuestro proyecto, y en el directorio “Src” buscamos el archivo “main.c” y le damos doble para que se despliegue en la ventana de texto.

Imagen 9. Selección del archivo “main”.

Dentro de la sección de “USER CODE BEGIN Includes” agregamos las directivas que se observan en en la imagen 10. Las primeras dos lineas corresponden a librerias estandar de C, mientras que la tercera línea corresponde a la dirección de esclavo o ID del sensor MPU6050 (ver tabla 1). Cabe aclarar que  en la tabla 1 se muestra la dirección 0x68 y en la imagen se muestra 0xD0. Esto es así, porque al número 0x68 se le realizó previamente un corrimiento a la izquierda quedando en el valor de 0xD0. Este corrimiento es necesario debido a que en el protocolo I2C, el bit menos significativo del ID se utiliza como un comando de escritura/lectura. Este bit es manipulado por el dispositivo maestro, poniéndolo a 1 cuando se desea leer información y 0 cuando se desea escribir en el dispositivo esclavo. Cabe hacer notar que esta gestión se realiza de manera automática por las instrucciones en C que comanda el comportamiento del puerto I2C.

Imagen 10.  Directivas iniciales a incluir en el programa.

A continuación escriba el código que se muestra la siguiente imagen.

Figura 11. Variables y secciones de configuración del sensor.

La sección marcada con el número 1, corresponde a las variables utilizadas para transmitir y recibir datos del sensor MPU6050.

La sección 2 envía los primeros datos de configuración del sensor. Los datos que se envían son 0x6B y 0x00; el primero es la dirección del registro de configuración del sensor. El segundo dato corresponde al dato a escribir en el sensor. Según la hoja de especificaciones del sensor cuando se escribe un cero en el registro 0x6B, el sensor sale del estado de Standby o estado Espera y comienza a realizar las mediciones de aceleración y rotación.  La instrucción utilizada para enviar datos es:

 HAL_I2C_Master_Transmit(Arg1, Arg2, Arg3, Arg4, Arg5);

Como se observa esta instrucción requiere de 5 parámetros:

  • Arg1: Se especifica el puerto I2C con el que se está trabajando.
  • Arg2: Es el ID o dirección del dispositivo esclavo.
  • Arg3: Buffer o arreglo de datos a enviar al dispositivo esclavo.
  • Arg4: Cantidad de datos a enviar.
  • Arg5: Tiempo de espera máximo.

La sección 3 configura la frecuencia de muestreo del sensor a 1KHz, escribiendo el dato 0x07 en el registro 0x19 interno del sensor.

Ahora escribimos el código mostrado en la figura 12. Esta sección de código en general lee los datos provenientes del Acelerómetro, Giroscopio y temperatura; y los envía al puerto USB-Serial, para su visualización en cualquier terminal serial. En este caso en particular utilizaremos la terminal serial que está integrada a Atollic-TrueStudio.

Imagen 12. Sección de programa a ejecutarse en ciclo infinito while.

A continuación vamos a describir cada sección del código:

La sección 1, envía solamente un dato (0x3B) al sensor. Esto hace que el sensor posicione su puntero en el registro 0x3B. Este registro corresponde al byte más significativo del eje X del Acelerómetro. La hoja de datos del sensor especifica que todas las lecturas realizadas por el sensor las guarda en registros apilados en su memoria interna. Además cada lectura es de 16bits de longitud, de esta forma usa 2 bytes por cada eje sensado. Por lo tanto se tienen 6 bytes para los datos del Acelerómetro (es decir 2 bytes por cada eje cartesiano: X, Y, Z), 6 bytes para los datos del Giroscopio y 2 bytes para los datos del sensor de temperatura. En total son 14 bytes los que se tienen que leer para obtener la información completa del sensor.

La sección 2, lee los 14 bytes de información, mediante la siguiente instrucción:

 HAL_I2C_Master_Receive(Arg1, Arg2, Arg3, Arg4, Arg5);

Como se observa esta instrucción requiere de 5 parámetros:

  • Arg1: Se especifica el puerto I2C con el que se está trabajando.
  • Arg2: Es el ID o dirección del dispositivo esclavo.
  • Arg3: Buffer o arreglo de datos donde se guarda la información proveniente del dispositivo esclavo.
  • Arg4: Cantidad de datos a recibir.
  • Arg5: Tiempo de espera máximo.

La sección 3, se encarga de ensamblar los datos en palabras de 32 bits flotantes. Lo primero que realiza es una concatenación (a 16bits) del byte más significativo con el byte menos significativo de cada eje de aceleración, sensor de temperatura y giroscopio. Seguidamente divide cada concatenación por un factor de sensibilidad o conversión, según como lo especifica la hoja de datos del sensor.

La sección 4, se encarga de enviar los datos obtenidos hacia el puerto USB-Serial de Ophyra, para su despliegue en la terminal serial de Atollic. Para más detalles sobre el envío y lectura de datos por el puerto serial consulte el tutorial 7.

Finalmente compilamos nuestro programa para generar el archivo *.HEX y descargarlo a nuestra tarjeta. Para ello seguir los pasos del 1 al 5  de esta GUÍA.

Cargar programa a nuestra tarjeta de Desarrollo Ophyra.

El último paso es programar tu tarjeta Ophyra. Si nunca lo has hecho, sigue los pasos del 6 al 12 de esta GUÍA.

Conclusiones.

Después de cargar el programa a la tarjeta Ophyra, abriremos la terminal del puerto serial que viene integrada en Atollic TRUESTUDIO. En la imagen 13 se muestra el botón que debemos presionar para que se nos habrá la terminal. Nota: Este botón puede variar de ubicación según la configuración de tu programa, por ello es necesario que lo identifiques bien.

Imagen 13. Botón para abrir la terminal serial de Atollic.

 Al dar clik sobre el botón, se abrira una ventana de configuración como la que se muestra en la imagen 14.

Imagen 14. Ventana de configuración de la terminal serial de Atollic.

Seleccionamos el puerto COM correspondiente a nuestra tarjeta Ophyra, los demás parámetros no se modifican ya que así fue configurado por defecto el puerto serial de Ophyra; por último damos click en OK. Atollic abrirá una ventana en la parte inferior de la ventana, junto a la consola. En esta ventana observaremos los datos enviados por Ophyra (ver imagen 15).

Para este ejemplo se observará una cadena de datos correspondientes a cada lectura de los ejes del acelerómetro-giroscópio y del sensor de temperatura. Las unidades de medida del Acelerómetro están configuradas en gravedades o G; para el Giroscopio están dadas en º/seg y para el termómetro en ºC. Por defecto el Acelerómetro esta configurado para un rango de 2G, pero puede ser configurado para rangos de 4, 8 y 16G. De igual manera, el Giroscopio esta configurado a una sensibilidad de 250 º/seg, pero puede configurarse para sensibilidades de 500, 1000 y 2000 º/seg.

Para terminar o cerrar la comunicación con el puerto serial, debemos presionar el botón que se resalta en rojo en la  imagen 15.

Imagen 15. Terminal serial de Atollic activada. Despliegue de datos.

Hemos configurado y programado en Ophyra el sensor MPU6050 mediante el puerto serial I2C. Así mismo utilizamos el puerto serial RS232, para visualizar la información proveniente del sensor en la terminal de Atollic.

Te sugerimos hacer ejercicios más complicados como la configuración del sensor a otra velocidad de muestreo, rango de medición del Acelerómetro y sensibilidad del Giroscopio.

Si tienes alguna consulta o duda sobre este tutorial o referente a cualquier otro tema de Ophyra, contáctanos a nuestro Foro.

Menú