Toto je starší verze dokumentu!
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).
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í |
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 |
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); } }