prueba

Dependencies:   mbed SDFileSystem FXOS8700Q

TP para SO. Escribe a memoria SD, lee inputs desde la coneccion serial a una pc, muestra en pantalla de la misma un menu y permite visualizar el funcionamiento del sensor acelerometro.

Committer:
waltergss
Date:
Tue Jun 25 21:27:04 2019 +0000
Revision:
7:f49ea76f3ac1
Parent:
6:3c77a20acb12
Agregue calibracion de acelerometro y correccion de interrupciones en los menus

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 0:a83db87be46c 1 #include "mbed.h"
Kojto 0:a83db87be46c 2 #include "SDFileSystem.h"
waltergss 6:3c77a20acb12 3 #include "FXOS8700Q.h"
Kojto 0:a83db87be46c 4
waltergss 5:cf92a5a1f081 5 //creamos el objeto sd con la clase SDFileSystem con los pines de la sd para usar el sistema de archivos
Kojto 0:a83db87be46c 6 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
waltergss 6:3c77a20acb12 7
waltergss 6:3c77a20acb12 8 I2C i2c(PTE25, PTE24);
waltergss 6:3c77a20acb12 9 FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1); // Configura sensor acelerometro
waltergss 6:3c77a20acb12 10
waltergss 6:3c77a20acb12 11 //creamos la comunicacion serial con la pc
waltergss 6:3c77a20acb12 12 Serial pc(USBTX, USBRX);
waltergss 6:3c77a20acb12 13
waltergss 5:cf92a5a1f081 14 //creamos los led con la clase digitalout con los pines de los leds
waltergss 4:6435ba5f38d3 15 DigitalOut led1(PTB22);
waltergss 4:6435ba5f38d3 16 DigitalOut led2(PTE26);
waltergss 4:6435ba5f38d3 17 DigitalOut led3(PTB21);
waltergss 5:cf92a5a1f081 18 //creamos los objetos sw con la clase interruptin con los botones para usarlos como interrupciones
waltergss 3:df6847273d9e 19 InterruptIn sw2(SW2);
waltergss 3:df6847273d9e 20 InterruptIn sw3(SW3);
waltergss 3:df6847273d9e 21
waltergss 5:cf92a5a1f081 22 //creo un puntero para el archivo
Kojto 0:a83db87be46c 23 FILE *fp;
waltergss 3:df6847273d9e 24
waltergss 7:f49ea76f3ac1 25 int cont=0;//contador de los puntos
waltergss 7:f49ea76f3ac1 26 float Ax=0.01f;
waltergss 6:3c77a20acb12 27
waltergss 6:3c77a20acb12 28 void menu();
waltergss 6:3c77a20acb12 29 void boton2();
waltergss 6:3c77a20acb12 30 void boton3();
waltergss 6:3c77a20acb12 31 void opcion3();
waltergss 6:3c77a20acb12 32 void opcion1();
waltergss 7:f49ea76f3ac1 33 void calima();
waltergss 7:f49ea76f3ac1 34 void calime();
waltergss 6:3c77a20acb12 35
waltergss 6:3c77a20acb12 36 // main() runs in its own thread in the OS
waltergss 6:3c77a20acb12 37 int main()
waltergss 6:3c77a20acb12 38 {
waltergss 6:3c77a20acb12 39 led1=1;//apago el led rojo
waltergss 6:3c77a20acb12 40 menu();//llamo al menu
waltergss 6:3c77a20acb12 41
waltergss 6:3c77a20acb12 42 }
waltergss 6:3c77a20acb12 43
waltergss 6:3c77a20acb12 44 void menu(){
waltergss 6:3c77a20acb12 45 char c='0';//inicializo el char para leer del teclado
waltergss 6:3c77a20acb12 46 int buffer;//int para leer del archivo de puntos
waltergss 6:3c77a20acb12 47 while(c!='q'){//mientras que no salga muestro el menu
waltergss 6:3c77a20acb12 48 pc.printf("----------------------- \n \r");
waltergss 6:3c77a20acb12 49 pc.printf("1-Iniciar juego \n \r");
waltergss 6:3c77a20acb12 50 pc.printf("2-mostrar puntuacion anterior \n \r");
waltergss 6:3c77a20acb12 51 pc.printf("3-opcion3 \n \r");
waltergss 6:3c77a20acb12 52 pc.printf("q-salir \n \r");
waltergss 7:f49ea76f3ac1 53 led2=0;
waltergss 7:f49ea76f3ac1 54 led3=0;
waltergss 6:3c77a20acb12 55 c=pc.getc();//leo del teclado
waltergss 6:3c77a20acb12 56 switch(c){
waltergss 6:3c77a20acb12 57 case '1':opcion1();//llamo al metodo principal del juego
waltergss 6:3c77a20acb12 58 break;
waltergss 6:3c77a20acb12 59 case '2':pc.printf("\033[2J");//limpio la pantalla
waltergss 6:3c77a20acb12 60 //leo el archivo y muestro por pantalla
waltergss 6:3c77a20acb12 61 fp = fopen("/sd/puntos.txt", "r");//asigno el archivo a fp
waltergss 6:3c77a20acb12 62 if (fp != NULL) {
waltergss 6:3c77a20acb12 63 fscanf(fp,"%d",&buffer);//leo el contenido
waltergss 6:3c77a20acb12 64 fclose(fp);//cierro el archivo
waltergss 6:3c77a20acb12 65 }
waltergss 6:3c77a20acb12 66 pc.printf("Puntos anteriores: ");
waltergss 6:3c77a20acb12 67 pc.printf("%d",buffer); //escribo en la pantalla el entero formateado a string
waltergss 6:3c77a20acb12 68 pc.printf("\n \r");
waltergss 6:3c77a20acb12 69 break;
waltergss 6:3c77a20acb12 70 case '3': opcion3();//llamo al metodo de la prueba del acelerometro
waltergss 6:3c77a20acb12 71 break;
waltergss 7:f49ea76f3ac1 72 default:break;
waltergss 6:3c77a20acb12 73 }
waltergss 6:3c77a20acb12 74 }
waltergss 6:3c77a20acb12 75 }
waltergss 6:3c77a20acb12 76
waltergss 6:3c77a20acb12 77
waltergss 6:3c77a20acb12 78 void opcion1(){//metodo principal del juego
waltergss 6:3c77a20acb12 79 bool aux=true;//bolean para salir
waltergss 6:3c77a20acb12 80 char tecla='0';//char para leer del teclado
waltergss 6:3c77a20acb12 81 cont=0;//inicializo el contador de puntos en 0
waltergss 6:3c77a20acb12 82 int i;//int para el random
waltergss 6:3c77a20acb12 83 led2=0;//apago los leds
waltergss 6:3c77a20acb12 84 led3=0;
waltergss 6:3c77a20acb12 85 pc.printf("\033[2J");
waltergss 6:3c77a20acb12 86 pc.printf("----------------------- \n \r");//muestro comienzo del juego
waltergss 6:3c77a20acb12 87 pc.printf("Comenzo el juego!\n \r");
waltergss 6:3c77a20acb12 88 pc.printf("Para terminar presione x \n \r");
waltergss 6:3c77a20acb12 89 pc.printf("----------------------- \n \r");
waltergss 7:f49ea76f3ac1 90 sw2.rise(&boton2);//asigno a la interrupcion que produce el sw2 al soltarse la funcion boton2
waltergss 7:f49ea76f3ac1 91 sw3.rise(&boton3);//asigno a la interrupcion que produce el sw3 al soltarse la funcion boton3
waltergss 6:3c77a20acb12 92 //bucle principal
waltergss 6:3c77a20acb12 93 while(aux){
waltergss 6:3c77a20acb12 94 // Pone valor random en i (de 0 a 1) y prende el color correspondiente
waltergss 6:3c77a20acb12 95 i=rand()%2;
waltergss 6:3c77a20acb12 96 switch(i){
waltergss 6:3c77a20acb12 97 case 0: led2=1;//si es 0 prendo el verde
waltergss 6:3c77a20acb12 98 break;
waltergss 6:3c77a20acb12 99 case 1: led3=1;//si es 1 prendo el azul
waltergss 6:3c77a20acb12 100 break;
waltergss 6:3c77a20acb12 101 }
waltergss 6:3c77a20acb12 102 //bucle para esperar la interrupcion
waltergss 6:3c77a20acb12 103 while((led2.read()!=0 || led3.read()!=0) && aux){
waltergss 6:3c77a20acb12 104 // espero a que aprete boton
waltergss 6:3c77a20acb12 105 if(pc.readable()){
waltergss 6:3c77a20acb12 106 tecla=pc.getc();
waltergss 6:3c77a20acb12 107 if(tecla=='x'){//si lee x del teclado sale del metodo y vuelve al menu
waltergss 7:f49ea76f3ac1 108 aux=false;
waltergss 7:f49ea76f3ac1 109 sw2.rise(NULL);//asigno a la interrupcion que produce el sw2 al soltarse la funcion boton2
waltergss 7:f49ea76f3ac1 110 sw3.rise(NULL);//asigno a la interrupcion que produce el sw3 al soltarse la funcion boton3
waltergss 7:f49ea76f3ac1 111 return;
waltergss 6:3c77a20acb12 112 }
waltergss 6:3c77a20acb12 113 }
waltergss 6:3c77a20acb12 114 }
waltergss 6:3c77a20acb12 115 //desactivo las interrupciones para escribir sin problemas
waltergss 6:3c77a20acb12 116 __disable_irq();
waltergss 6:3c77a20acb12 117 //abro el archivo para escribir si no existe se crea
waltergss 6:3c77a20acb12 118 fp = fopen("/sd/puntos.txt", "w");//asigno el archivo a fp
waltergss 6:3c77a20acb12 119 if (fp != NULL) {
waltergss 6:3c77a20acb12 120 fprintf(fp, "%d",cont);//escribo el contenido de cont en el archivo fp
waltergss 6:3c77a20acb12 121 fclose(fp);//cierro el archivo
waltergss 6:3c77a20acb12 122 }
waltergss 6:3c77a20acb12 123 //vuelvo a activar las interrupciones
waltergss 6:3c77a20acb12 124 __enable_irq();
waltergss 6:3c77a20acb12 125
waltergss 6:3c77a20acb12 126 //espero en la salida para mostrar el resultado
waltergss 6:3c77a20acb12 127 wait_ms(500);
waltergss 6:3c77a20acb12 128 //apago el led rojo si esta prendido
waltergss 6:3c77a20acb12 129 if(led1.read()==0)
waltergss 6:3c77a20acb12 130 led1=1;
waltergss 6:3c77a20acb12 131 }
waltergss 6:3c77a20acb12 132 }
waltergss 5:cf92a5a1f081 133
waltergss 5:cf92a5a1f081 134 //funciones para las interrupciones
waltergss 3:df6847273d9e 135 void boton2(){
waltergss 4:6435ba5f38d3 136 if(led2.read()!=0){
waltergss 5:cf92a5a1f081 137 cont++;//si se apreta el sw2 y esta el led2 en 1 se cuenta un punto y apaga el led
waltergss 6:3c77a20acb12 138 pc.printf("Buena pulsada , un punto \n \r"); //muestro por pantalla un mensaje motivacional
waltergss 3:df6847273d9e 139 led2=0;
waltergss 3:df6847273d9e 140 } else {
waltergss 4:6435ba5f38d3 141 //apago el led y prendo el led rojo
waltergss 4:6435ba5f38d3 142 led3=0;
waltergss 4:6435ba5f38d3 143 //el led1 tiene logica invertida 0= prendido
waltergss 4:6435ba5f38d3 144 led1=0;
waltergss 5:cf92a5a1f081 145 //resto un punto
waltergss 5:cf92a5a1f081 146 cont--;
waltergss 6:3c77a20acb12 147 pc.printf("Fallaste \n \r");
waltergss 4:6435ba5f38d3 148 }
waltergss 4:6435ba5f38d3 149
waltergss 3:df6847273d9e 150 }
waltergss 6:3c77a20acb12 151 //parecido a boton2 pero para el otro boton
waltergss 3:df6847273d9e 152 void boton3(){
waltergss 4:6435ba5f38d3 153 if(led3.read()!=0){
waltergss 6:3c77a20acb12 154 cont++;//si se apreta el sw3 y esta el led3 en 1 se cuenta y apaga el led
waltergss 6:3c77a20acb12 155 pc.printf("Buena pulsada , un punto \n \r"); //muestro por pantalla un mensaje motivacional
waltergss 3:df6847273d9e 156 led3=0;
waltergss 4:6435ba5f38d3 157 }else{
waltergss 4:6435ba5f38d3 158 led2=0;
waltergss 4:6435ba5f38d3 159 led1=0;
waltergss 5:cf92a5a1f081 160 cont--;
waltergss 6:3c77a20acb12 161 pc.printf("Fallaste \n \r");
waltergss 4:6435ba5f38d3 162 }
waltergss 4:6435ba5f38d3 163
waltergss 4:6435ba5f38d3 164 }
waltergss 7:f49ea76f3ac1 165
waltergss 7:f49ea76f3ac1 166 //-----------------------------------------------------------------------
waltergss 7:f49ea76f3ac1 167 //Esto no esta en el tp
waltergss 6:3c77a20acb12 168 void opcion3(){
waltergss 7:f49ea76f3ac1 169 float x;
waltergss 7:f49ea76f3ac1 170 float faX;//variable para el valor de x
waltergss 7:f49ea76f3ac1 171 sw2.rise(&calima);
waltergss 7:f49ea76f3ac1 172 sw3.rise(&calime);
waltergss 6:3c77a20acb12 173 acc.enable();//activar el sensor
waltergss 7:f49ea76f3ac1 174 acc.getX(x);
waltergss 6:3c77a20acb12 175 while (true) {
waltergss 6:3c77a20acb12 176 acc.getX(faX);//funcion del sensor que devuelve la orientacion en x
waltergss 7:f49ea76f3ac1 177 if(faX>(x+Ax)){//si esta inclinado a la derecha se mueve a la derecha
waltergss 6:3c77a20acb12 178 pc.printf("| | |o| \r\n");
waltergss 6:3c77a20acb12 179 }else{
waltergss 7:f49ea76f3ac1 180 if (faX<(x-Ax)){//si esta inclinado a la izquierda se mueve a la izquierda
waltergss 6:3c77a20acb12 181 pc.printf("|o| | | \r\n");
waltergss 6:3c77a20acb12 182 }else//sino queda en el centro
waltergss 6:3c77a20acb12 183 pc.printf("| |o| | \r\n");}
waltergss 6:3c77a20acb12 184 if(pc.readable()){
waltergss 7:f49ea76f3ac1 185 pc.getc();
waltergss 7:f49ea76f3ac1 186 sw2.rise(NULL);
waltergss 7:f49ea76f3ac1 187 sw3.rise(NULL);
waltergss 7:f49ea76f3ac1 188 return;
waltergss 6:3c77a20acb12 189 }
waltergss 6:3c77a20acb12 190 }
waltergss 6:3c77a20acb12 191
waltergss 7:f49ea76f3ac1 192 }
waltergss 7:f49ea76f3ac1 193
waltergss 7:f49ea76f3ac1 194 void calima(){
waltergss 7:f49ea76f3ac1 195 Ax+=0.01f;
waltergss 7:f49ea76f3ac1 196 }
waltergss 7:f49ea76f3ac1 197 void calime(){
waltergss 7:f49ea76f3ac1 198 if(Ax>0.01f)
waltergss 7:f49ea76f3ac1 199 Ax-=0.01f;
waltergss 7:f49ea76f3ac1 200 }