Ping Pong con MPU6050
es un proyecto en el cual se desarrolla un juego de ping pong en visualizado en una matriz de Leds de 8x8; donde los jugadores se desplazan mediante el uso de un acelerometro y giroscopio MPU6050, consiste en aprovechar los perifericos I2C y SPI de la tarjeta stm32f446RE.
es una unidad de medicion inercial o IMU por sus siglas (Inertial Measurment Units) de 6 grados de libertad ya que internamente combina un acelerometro de 3 ejes y un giroscopio tambien de 3 ejes; es muy utilizado en sistemas de medicion angular y navegacion, para este proyecto se utilizara uno de los tres ejes que proporciona el acelerometro para evaluar el desplazamiento del jugador:
los acelerometros internamente tienen una MEMS (MicroElectroMechanical Systems) que de forma similar a un sistema de masa-resorte permite medir la aceleracion.
el funcionamiento del juego se basas en aprovechar los datos del acelerometro para poder desplazar lo que viene siendo la "paleta" de ping pong del jugador, mientras se va moviendo la pelota en el entorno mismo.
Materiales
- modulo Acelerometro MPU6050
- una matriz LED 8x8
- una tarjeta ST32F446RE
Conexiones
las conexiones de los diferentes Acelerometros van ubicados en los pines que tengan como funcion I2C (SDA y SCL), para la adquisicion de los datos:
acelerometro 1
- SDA : pin PB_9.
- SCL: pin PB_8.
- VCC: 3.3v.
- GND : culquiera de los puntos GND de la tarjeta.
acelerometro 2
- SDA : pin PB_3.
- SCL : pin PB_10.
- VCC: 3.3v.
- GND : culquiera de los puntos GND de la tarjeta.
NOTA: para cada uno de los modulos se uso un I2C independiente de los que posee la tarjeta.
la conexion del modulo de la matriz, con el circuito integrado MAX 7219, es a todos los pines que componen la funcion o el periferico para el protocolo SPI (MOSI, MISO, CLK, SSEL):
Matriz 8x8
- MOSI: pin PB_15.
- CLK: pin PB_13.
- SSEL: pin PB_12.
NOTA: estos pines son la conexion a la parte de entrada de datos del modulo de la matriz, no confundirlos con el de salida.
Recomendaciones
Para la progrmacion del MPU6050, se requiere el uso de la libreria *MPU6050* desarrollada por Kris Winer.
<<https://os.mbed.com/users/onehorse/code/MPU6050IMU/file/e0381ca0edac/MPU6050.h/>>
como recomendacion: uno de los pines del MPU6050, para ser mas exacto el pin AD0, segun su estado, le permite acceder a dos direcciones de registro del acelerometro
Estado del AD0
- High (3.3v) : 0x69.
- Low (GND o al aire) : 0x68.
por defecto la libreria apunta a la direccion 0x69.
Codigo
en los siguientes enunciados se mostrara fragmentos del codigo original (puede ser optimizado):
lo primero las librerias:
librerias a usar
#include "mbed.h" #include "MPU6050.h"
luego las variables y Objetos que se usaran:
//objetos Ticker Game; Serial pc(USBTX,USBRX); SPI device (PB_15,PB_14,PB_13); DigitalOut ssel(PB_12); MPU6050 mpu1(PB_9,PB_8); MPU6050 mpu2(PB_3,PB_10); // variables int band=0; int move1=0,move2=0,col =0,fil =0; int status =0; float x[3],y[3]; float aux1=0,aux2 =0; uint8_t pos[6]={0b11100000,0b01110000,0b00111000,0b00011100,0b00001110,0b00000111}; uint8_t player1[1],player2[1]; uint8_t ball[8]={0b10000000,0b01000000,0b00100000,0b00010000,0b00001000,0b00000100,0b00000010,0b00000001}; uint8_t aux[1],scan[8];
se usa el Ticker para designar una interrupcion para el analisis en tiempo real de los datos del acelerometro, el cual, segun el tiempo de trabajo designado, establece las diferentes etapas del programa:
Nota: los siguientes fragmentos del codigo, van incluidos en un loop dentro de la funcion principal.
if(status==1){ mpu1.getAccelero(x); //pc.printf("accelero 1: \t X = %f, \t Y = %f, \t Z = %f \n",x[0],x[1],x[2]); aux1 = x[0]; mpu2.getAccelero(y); //pc.printf("accelero 2: \t X = %f, \t Y = %f, \t Z = %f \n",y[0],y[1],y[2]); aux2 = y[0]; status = 2; }
1 comment on Ping Pong con MPU6050:
Please log in to post comments.
hola me podrías guiar