Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:teeter-game

Toto je starší verze dokumentu!


Hra Teeter

Zadání:

Na vývojovém kitu 32F429IDISCOVERY realizujte androidovou hru teeter. Na základě údajů z gyroskopu se na displeji bude pohybovat kulička. Cílem hry je dopravit kuličku na požadované místo. Při pohybu je nutné se vyhnout případným překážkám (stěny, díry).

Použitá zařízení

Projekt je realizován na vývojovém kitu 32F429IDISCOVERY, který obsahuje 2.4„ displej QVGA TFT s rozlišením 240×320. Dále byl použit akcelerometr GY-521.

Zapojení PINů:

GY-521 32F429IDISCOVERY Popis
SCL PA8 Hodinový signál
SDA PC9 Data
AD0 GND Adresa zařízení
VCC 3V Napájecí napětí 3.3V
GND GND Uzemnění

Software:

Pro vývoj aplikace bylo využito volně dostupné vývojové prostředí CooCox CoIDE, které využívá GCC kompiler určený pro ARM procesory. Dále bylo využito několika knihoven z webu http://stm32f4-discovery.com/.

Seznam použitých knihoven:

Název knihovny Popis
stm32f4xx Obecná knihovna pro daný vývojový kit
tm_stm32f4_delay Přesné zpoždění
tm_stm32f4_ili9341_ltdc Ovladač k displeji
tm_stm32f4_mpu6050 Ovladač k akcelerometru
tm_stm32f4_i2c knihovna pro použití I2C
tm_stm32f4_sdram knihovna pro přístup do paměti

Realizace:

Celý layout hry je uložen v SDRAM pamětí a při interakci vykreslován na displej zařízení. Nejprve bylo nutné definovat makro pro přístup do paměti na základě souradnic x, y. Pamět není mapována hned od prvního dostupného místa, jelikož některé z dalších knihoven taktéž využívali tento prostor a docházelo ke konfliktům. Z toho důvodu je matice v paměti posunuta o přibližně 7 MB.

#define X_SIZE 240
#define Y_SIZE 320
#define OFFSET 7000000
 
#define MATRIX_SET_VALUE(x, y, val)  TM_SDRAM_Write8(OFFSET + x * Y_SIZE + y, val)
#define MATRIX_GET_VALUE(x, y)       TM_SDRAM_Read8(OFFSET + x * Y_SIZE + y)
// cteni dat z akceletometru
    		    if (sensor1)
    		    TM_MPU6050_ReadAll(&MPU6050_Data0);
 
    			Xpos_old = Xpos;
    			Ypos_old = Ypos;
 
    			// Nacteni vychozi pozice
    			if(start == 1){
    			X_axis_ref = MPU6050_Data0.Accelerometer_X;
    	    	Y_axis_ref = MPU6050_Data0.Accelerometer_Y;
    	    	start = 0;
    			}
 
    			// Setrvacnost
    	    	X_axis = (Q*X_axis + (10-Q)*(MPU6050_Data0.Accelerometer_X - X_axis_ref))/10;
    	    	Y_axis = (Q*Y_axis + (10-Q)*(MPU6050_Data0.Accelerometer_Y - Y_axis_ref))/10;
 
    	    			// zmena polohy
    	    			if(X_axis < -th1){
    	    				Xpos++;
    	    	    		if(X_axis < -th2)
    	    	    			Xpos++;
    	    	    	    	if(X_axis < -th3)
    	    	    	    		Xpos++;
    	    				if(Xpos > 228)
    	    					Xpos = 228;
    	    			}
 
    	    			if(X_axis > th1){
    	    				Xpos--;
        	    			if(X_axis > th2)
        	    				Xpos--;
            	    			if(X_axis > th3)
            	    				Xpos--;
      	    				if(Xpos < 11)
    	    					Xpos = 11;
    	    			}
 
    	    			if(Y_axis > th1){
    	    				Ypos++;
        	    			if(Y_axis > th2)
        	    				Ypos++;
            	    			if(Y_axis > th3)
            	    				Ypos++;
     			         	if(Ypos > 308)
    	    		    	Ypos = 308;
    	    			}
 
    	    			if(Y_axis < -th1){
    	    				Ypos--;
    	   	    			if(Y_axis < -th2)
    	    	    				Ypos--;
    	    	   	    			if(Y_axis < -th3)
    	    	    	    				Ypos--;
    	    			if(Ypos < 11)
    	    			   	Ypos = 11;
    	    		    }
 
    	    			// setrvacnost
    	    			Xpos += (Xpos-Xpos_old)/2;
    	    			Ypos += (Ypos-Ypos_old)/2;
 
    	    	// pohyb podel zdi
    	    	if((MATRIX_GET_VALUE(Xpos, Ypos)) > 10){
    	    		if((MATRIX_GET_VALUE(Xpos, Ypos_old)) < 11){
        	    		   Ypos = Ypos_old;
    	    		}
    	    		else if((MATRIX_GET_VALUE(Xpos_old, Ypos)) < 11){
    	    	           Xpos = Xpos_old;
    	    		}
    	    		else{
    	    		Xpos = Xpos_old;
			        Ypos = Ypos_old;
    	    		}
    	    	}
 
    	    	// konec hry
    	    	if((MATRIX_GET_VALUE(Xpos, Ypos)) == 5){
    	    		DrawDrop(Xpos, Ypos, Xpos_old, Ypos_old, LVL_count);
    	    	}
 
    	    	// dalsi kolo
    	    	if((MATRIX_GET_VALUE(Xpos, Ypos)) == 6){
 
    	    		DrawDrop(Xpos, Ypos, Xpos_old, Ypos_old, LVL_count);
    	    		LVL_count++;
    	    		LVL_change = 1;
 
    	    		 Xpos = 220;
    	    		 Ypos = 300;
    	    		 Xpos_old = 220;
    	    		 Ypos_old = 300;
 
    	    	}
 
 
 
    	    	ReDrawLayout(Xpos, Ypos);
    			DrawBall(Xpos, Ypos, Xpos_old, Ypos_old);
 
    	    	if(LVL_change == 1){
 
    	    		LVL_change = 0;
    	    		DrawLayout(LVL_count);
 
 
    	    	}
 
           }
 
2014/teeter-game.1421624768.txt.gz · Poslední úprava: 2015/01/19 00:46 autor: Roman Deneš