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.
main.cpp@7:f49ea76f3ac1, 2019-06-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |