Tetris
Introducción Esta primer entrega del proyecto consiste en mostrar en funcionamiento la matriz de 8x8, de acuerdo a los parámetros solicitados en clase, los cuales son envió de figura seguido de el angulo y la posición por medio de comunicación USART teniendo como componentes una matriz de 8 x 8 con un driver max7219 y una stm32 núcleo
Objetivos
- Comprender y aplicar la comunicación USART a un sistema.
- Reforzar los conocimientos de manejo de datos (Binarios, Hexa, Decimal)
-dar explicación de cómo se ha realizado el funcionamiento hasta este punto del proyecto.
Conexión
Para realizar una conexión bien elaborada sigue estos pasos:
1. ingresa a tu cuenta de mbed
Configúrala de acuerdo a tu tarjeta de desarrollo:
En la esquina superior derecha encontraras una sección en la cual puedes hacer la selección de tu tarjeta de desarrollo da clic encima (en este caso dice núcleo f44RE damos clic ahí para cambiar a la tarjeta que tenemos sobre la imagen, como se muestra a continuación:
Esto desplegara una nueva ventana llamada select a plataform, dar un clic en add board:
se desplegara una nueva ventana llamada boards allí debes buscar tu tarjeta de desarrollo, una vez encontrada damos doble clic encima
en la parte derecha de tu ordenador encontraras una sección que dice Add your mbed compiler damos clic en esta opción y luego abres tu compilador y la board que seleccionaste ya estará configurada en tu cuenta.
2. Buscar el datasheet o información de tu tarjeta de desarrollo, en este caso se usó una stmf303k8. aquí puedes encontrar información de la ubicación de los pines GPIO de tu tarjeta de desarrollo, características, etc. Si vuelves a la venta de select a plataform allí puedes encontrar el datasheet de tu tarjeta dando clic en more info.
3. Buscar data datasheet del max7219. • encontraras información la cual te permitirá manipular, comprender y analizar de una forma más fácil el funcionamiento de la matriz de acuerdo a las necesidades que requieras. 4. en la esquina superior izquierda encontrara el programa allí este contara con tres subsecciones : main cpp mbed datos.h encargada de guardar los datos que envía el usuario se crea una librería para organizar el código, para acceder a esta dar clic en esta subsección. Desplegamos mbed, encontraras más subsecciones las cuales son: classes-structs-groups Desplegamos classes y buscamos el protocol SPI Dando clic en SPI se abrirá una nueva pantalla como se muestra a continuación:
en la primera parte nos dice como realizar la conexión, de acuerdo a la nucleo que se esta usando se designaron los siguientes pines MISO PA_7 MOSI NO SE CONECTA CLK PA_5 CS PA_4 Los definiremos de la siguiente manera ya en nuestro código Serial pc(SERIAL_TX, SERIAL_RX); definición del serial SPI deviceM(PA_7, PA_6, PA_5); DigitalOut ssel (PA_4); Nota: Estas conexiones están basadas en la stmf303k8 Estas pueden variar deacuerdo a las necesidades del usuario en : SPI deviceM(MISO, MOSI , CLK); DigitalOut ssel (CS); 5. una vez realizadas las conecciones a la nucleo lo siguiente es proceder a conectar la matriz 8x8:
Como se puede observar en la imagen cuenta con 5 pines los cuales se conectaran de la siguiente manera: VCC =5V GND=GND DIN=MISO=PA_7 CS=CS=PA_4 CLK=CLK=PA_5 6. conecta tu stm a tu computador este lo reconocerá como un nuevo dispositivo Ingreso de datos
Según la tabla adjunta se debe enviar en el orden
Tipo de figura , Angulo de figura , Posición de columna
Nota: La posición va de 0 a 7 Compilas el programa este enviara una archivo a tu sección de descargas lo debes pegar en el dispositivo y se este se cargara a la stm Solicitud de datos
inicio=pc.getc(); =3C para dar inicio al ingreso de los tres datos n = pc.getc(); = figura que quiere enviar el usuario giro = pc.getc() = angulo en la cual el usuario quiere que se desplace la figura posición = pc.getc(); =lugar de columna en el que quiere que salga la figura
fin=pc.getc(); =3E para dar fin al ingreso de datos
nota : si no se ingresan los datos en este orden el programa no funcionara Ejemplo ingreso de datos: 3c 01 02 03 3e 3c=ingreso datos 01= Figura 1 02= 180 grados 03= posición columna 3 3e=salida datos En la matriz se deberá visualizar lo siguiente:
00000000
00000000
00000000
00000000
00000000
00010000
00010000
00010000
Funcionamiento -Se determina una memoria en la la biblioteca datos.h en donde se contendrían todas las figuras y sus diferentes posiciones -Se habilita la comunicación Serial - En la función principal se determina el ingreso de los 3 datos como se vio en el ejemplo - Se procede a hacer una verificación de la posición a la cual llegara la figura, si determina que hay algo ocupando el lugar se detendrá una posición antes - Se procede a guardar un vector y y actualizarlo para que no se pierdan datos - Se envía la matriz completa y se refresca la pantalla que se muestra
Nota: El ingreso de datos tiene restricción para el dato ingresado, si se ingresa un dato que no esta entre los permitidos no se ejecutara el programa declaracion de variables globales
- define uint8_t unsigned char uint8_t screen[8]={0,0,0,0,0,0,0,0}; es la que muestra los datos finalmente en la matriz uint8_t screen2[8]={0,0,0,0,0,0,0,0}; se usa para guardar datos y realizar operaciones luego con dichos datos. uint8_t verifica; uint8_t mascara; int velocidad=70;
funciones del codigo
segmento de código
int main() { funcion principal en este punto usaremos el datasheet del max7219 pra configurar lo iguinete: sendSPI(0x0c,1); sendSPI(0x0F,1); wait (1); esperar sendSPI(0x0F,0); wait (1); esperar sendSPI(0xB,0x7); borrar(); limpiar matriz 0x0c,1= shutdown matriz 0x0F,1=se usa para verificar que toda la matriz este en funcionamiento(enciende toda la matriz) 0x0F,0= se utiliza para terminar la verificación anterior 0xB,0x7= se usa para activar la matriz de 8x8. nota: para más información revisar datasheet Void play () { Función encargada de determinar el estado de la mascara } Void analisis() { Verifica la siguiente fila para saber si se puede desplazar } Void analisis() { Verifica la siguiente fila para saber si se puede desplazar } int ubicacion() { Limita el ingreso de posicion no mayor a 7 } void escribir() { Guarda y compara los datos entrantes a la matriz y los que ya estaban } void borrar() { Borrar todos los datos de la matriz } void enviar() { Encargado de enviar la matriz completa } void ver() { Informe de datos "no se usa” } void escribir() { Guarda y compara los datos entrantes a la matriz y los que ya estaba } void sendSPI() { Envió de datos al max }
-comunicación SPI Se realiza por comunicación spi como se puede evidenciar en la siguiente figura:
Básicamente este funciona como un estándar de comunicaciones, usado principalmente para la transferencia de información entre circuitos integrados en equipos electrónicos. El bus de interfaz de periféricos serie o bus SPI es un estándar para controlar casi cualquier dispositivo electrónico digital que acepte un flujo de bits serie regulado por un reloj (comunicación sincróna).
- pulsadores
Se colocan tres pulsadores con el fin de realizar por cada uno interrupciones para cada pulsador con el fin de
-cambiar de columna la figura(derecha e izquierda)
- cambiar el Angulo de figura
Es decir:
ya no se envían los valores de giro y posición de columna por medio del terminal, el único dato que se envía es el de la figura el cual va en random , acercando cada vez más al juego real pues el usuario debe realizar el cambio de giro o variar la posición mientras la figura va cayendo a través de la matriz.
la conexión de los pulsadores es muy sencilla, tal cual como se puede evidenciar a continuación:
-diagrama de conexión
Se debe designar un pin diferente para cada pulsador cada uno de estos debe llevar su propia señal que va directamente a un pin de la stm, así como se evidencia en la imagen anterior en este caso se utilizó los siguientes pines: -Para realizar el giro (PF_1) -Para realizar el desplazamiento a la derecha (PF_0) -para realizar el desplazamiento a la izquierda (PA_8) nota: Aquí simplemente se designó el pin para cada pulsador.
- función de cada pulsador: -El pulsador de la izquierda: Su función es por medio de interrupciones al ser presionado debe hacer que la figura que va cayendo por la matriz de desplace a una columna hacia el lado izquierdo. -pulsador centro: Su función es por medio de interrupciones al ser presionado debe hacer que la figura que va cayendo por la matriz cambie de ángulo para que el usuario pueda acomodarla de acuerdo a lo que necesite. -Pulsador derecha: Su función es por medio de interrupciones al ser presionado debe hacer que la figura que va cayendo por la matriz de desplace a una columna hacia el lado derecho.
- envió figuras
Para que las figuras se envíen solas se ejecuta un comando llamado rand el cual permite enviar números aleatorios guardándolos en la variable que abre el switch para cada figura
- interrupciones
Es un mecanismo que permite ejecutar un bloque de instrucciones interrumpiendo la ejecución de un programa, y luego restablecer la ejecución del mismo sin afectarlo directamente. De este modo un programa puede ser interrumpido temporalmente para atender alguna necesidad urgente del computador y luego continuar su ejecución como si nada hubiera pasado.
En la imagen de a continuación se muestra este proceso más claramente:
-como hacer un interrupción:
Lo primer que debes hacer es designar el puerto serial que vas a utilizar:
En este caso se realizó así:
Los pines que se evidencian ahí ya se habían mencionado anterior mente para que eran en la sección de pulsadores.
Lo segundo que se debe hacer es hacer el void para la interrupción que queremos realizar:
y por ultimo después del main se escribe la variable que designamos seguido de si el cambio viene por alto o por bajo en este caso la imagen muestra que es por bajo entonces se escribe fall entre paréntesis (&nombre de la función que designamos) esto se realiza con el fin de que el programa valla específicamente a esta posición de memoria, como se muestra a continuación:
se crea un librería en la cual se guardaron las tres interrupciones empezando por: -pmenos -pmas -giros
-movimientos.h
Si se ingresa allí podrá encontrar el código detallado de como se realizo el codigo de cada interupcion
Una vez realizado este proceso se puede realizar el funcionamiento del programa funcionando
Figura desplazada derecha
Figura con giro
Hay otro método de realizar el envió de datos, el cual es por medio del teclado del computador
Dentro de programa se crea un switch case en el cual se dará el condicional de cuales botones se van a usar
En este caso se eligieron
-a (para hacer desplazamiento a la izquierda)
-d (para hacer desplazamiento a la derecha)
-w (para realizar los giros)
Una vez presionado este se dirigirá a la interrupción que ya se definió previamente
Tal como se muestra a continuación:
La variable d es la que nos habilita el switch y esta es la única que envía por el terminal
.... En este punto sale un nuevo requerimiento el cual consiste en usar algo que quieran incluir los estudiantes para realizar movimiento de las figuras y los giros, por esta razón se decidio usar un sensor de color :
Este sensor como funciona: Convierten en frecuencia la intensidad de luz medida por una matriz de fotodiodos. La frecuencia entregada por el sensor TCS3200 es mayor cuanta mayor luminosidad se detecte. La matriz de fotodiodos permite promediar el valor medido para compensar diferencias de color en la superficie muestreada así como disponer de filtros de color (en el modelo de color RGB) que, al ir alternando su estado, sirven para distinguir cada componente. Claro está que no es tan solo conectar y ya nos dará el color especifico que estamos ingresando primero debemos realizar unas configuraciones con el fin de obtener una frecuencia mas optima que no permita determinarlo. Lo primero que debemos saber es que está formada por 16 fotodiodos con un filtro rojo, 16 con un filtro verde, 16 con un filtro azul y otros 16 sin filtrar. Los 64 fotodiodos no funcionan de manera simultánea sino que se activan por grupos de color antes de realizar la medición de la intensidad de luz que incide en ellos. Para elegir qué filtros deben activarse este cuenta con dos pines S2 y S3, los cuales debemos configurar para realizar cambios de luminosidad Esta configuración de s2 y s3 se mostrara más adelante y a su vez usaremos en este proyecto una caja compacta, la cual su interior estará pintada de color negro y estará completamente sellada para que la luz exterior no nos afecte la medición y los valores que esta siempre nos entrega sean más estables y varíen entre el mismo rango cada vez que se realice la medición como se muestra en la siguiente imagen:
esta caja cuenta con una cavidad en la cual se podrá poner la matriz, ( las conexiones de la matriz siguen siendo las mismas, para más información ir al inicio del documento) , y en el interior de la caja se encuentra nuestro sensor de color, como realizaremos la medición si el sensor se encuentra dentro de la caja pues esta caja contara también con una ranura
Esta ranura es la parte luminosa que se muestra en la imagen esta se ve de esta manera pues el sensor en ese instante se encontraba conectado.
Aparte de esta caja se realizó también una pieza con forma de E la cual en cada extremidad se pintó (RGB) es decir una roja, una verde y una azul como se muestra a continuación:
para que se realizó esto, pues al buscar especificaciones de este sensor se pudo observar que La máxima frecuencia que estos pueden puede generar (sin producir saturación) dependiendo de la intensidad de la luz medida y del color es posible escalar la frecuencia en tres niveles, la normal (máxima) al 100%, una media al 20% y otra baja al 2%, esta configuración como la realizamos, el sensor cuenta con dos pines S0 y S1 y de acuerdo al estado de estos dos, es decir alto o bajo se puede establecer valores de frecuencia.
Para este proyecto usaremos el 20% entonces configuraremos el s0 en estado alto y el s1 en estado bajo
El siguiente paso sería como realizar la conexión:
vcc lo conectamos a 5v s0 se conecta al pin digital D3 s1 se conecta al pin digital D4 s2 se conecta al pin digital D5 s3 se conecta al pin digital D6 GND a gnd El pin de led al pin digital D7 OUT al pin digital D2 Esta para una stm32f446 se toman estos pines de tal manera que no se crucen con los pines que se usaban con la matriz de 8x8
una vez realizado esto se comenzaron a hacer pruebas y se podía ver una respuesta del sistema muy similar a la que entrega el fabricante la cual era
al darnos cuenta que hay unos rangos que son muy similares mayormente en el verde y el azul se decidio comenzar a evaluar la componente RGB de cada extremidad de la E que le ingresábamos para luego estos datos poderlos evaluar y ver como realizábamos un filtro para determinar cuál era cada color como se muestra a continuacion
una vez hecho estos se tomaron estos valores de respuesta del sistema y se ingresaron a la programación de la matriz claro está que para realizar la lectura de los datos y obtener una respuesta constante se realizó un timer el cual nos permitía terminar estos valores en una cantidad de tiempo determinado en el código este se encuentra como timer tiempo
1 comment on Tetris:
Please log in to post comments.
.