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žívaly 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)
Na jednotlivé pozice se pomocí funkce DrawLayout „vykreslil“ požadovaný layout v závislosti na aktuální úrovni. Pod číslem 11 jsou uloženy stěny. Pod číslem 12 pak rozšířený prostor do kterého kulička nemůže vstoupit. Tento prostor odpovídá poloměru kuličky. Pod čísly 5 a 6 jsou jednotlivé díry. K nim odpovídají středu jsou uloženy pod čísly 4 a 7. Pro vykreslování děr (kruhů) je použita modifikovaná funkce z knihovny tm_stm32f4_ili9341_ltdc. Místo vykreslování jednotlivých pixelů funkce provádí zápis do paměti.
Na konci funkce je pak dvojitá smyčka, která na základě číselných údajů z matice vykresluje na displej jednotlivé barevné pixely.
for(i = 0; i < 240; i++){ for(j = 0; j < 320; j++){ if((MATRIX_GET_VALUE(i, j)) < 6) TM_ILI9341_DrawPixel(i, j, ILI9341_COLOR_GREEN); if((MATRIX_GET_VALUE(i, j)) == 6) TM_ILI9341_DrawPixel(i, j, ILI9341_COLOR_YELLOW); if((MATRIX_GET_VALUE(i, j)) == 11) TM_ILI9341_DrawPixel(i, j, ILI9341_COLOR_YELLOW); } }
// 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;