Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2014:stm32f0-snake [2015/01/18 15:47] Jiří Wiesner |
2014:stm32f0-snake [2015/01/18 17:17] (aktuální) Jiří Wiesner |
||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
====Hra Snake pomocí gyroskopu a grafického displeje na kitu STM32F4==== | ====Hra Snake pomocí gyroskopu a grafického displeje na kitu STM32F4==== | ||
+ | |||
+ | Původním záměrem bylo vytvořit hru Snake za pomoci LED matice, externího gyroskopu a kitu STM32F0. Kvůli nefunkčnímu hardwaru však bylo zadání změněno na vývojový kit STM32F4, který má integrovaný jak displej, tak gyroskop, změna směru hada tedy odpovídá změně směru nahnutí desky. | ||
+ | |||
+ | V první části kódu bylo nutné zainkludovat základní knihovny a knihovny pro práci s gyroskopem a displejem, zdrojem byly stranky http://stm32f4-discovery.com/. | ||
+ | |||
+ | **Program**: | ||
+ | <code c> | ||
+ | #include "tm_stm32f4_ili9341_ltdc.h" | ||
+ | #include "tm_stm32f4_l3gd20.h" | ||
+ | #include "tm_stm32f4_delay.h" | ||
+ | #include "stm32f4xx.h" | ||
+ | #include "defines.h" | ||
+ | |||
+ | #include <stdint.h> | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | |||
+ | int main(void) { | ||
+ | |||
+ | uint16_t i,j; | ||
+ | int x_pos[5] = {125, 145, 165, 185, 205}; | ||
+ | int x_pos_old; | ||
+ | int y_pos[5] = {160, 160, 160, 160, 160}; | ||
+ | int y_pos_old; | ||
+ | int status; //udava smer | ||
+ | |||
+ | TM_L3GD20_t L3GD20_Data; | ||
+ | |||
+ | SystemInit(); | ||
+ | TM_DELAY_Init(); | ||
+ | TM_ILI9341_Init(); | ||
+ | delay_init(); | ||
+ | ili9341_init(); | ||
+ | |||
+ | TM_ILI9341_Rotate(TM_ILI9341_Orientation_Portrait_2); | ||
+ | TM_ILI9341_Fill(ILI9341_COLOR_RED); | ||
+ | |||
+ | |||
+ | /* Init L3GD20 sensor */ | ||
+ | if (TM_L3GD20_Init(TM_L3GD20_Scale_2000) != TM_L3GD20_Result_Ok) { | ||
+ | /* Sensor error */ | ||
+ | TM_ILI9341_Puts(10, 100, "Sensor ERROR!", &TM_Font_11x18, 0x0000, ILI9341_COLOR_RED); | ||
+ | |||
+ | while (1); | ||
+ | } | ||
+ | |||
+ | while(1){ | ||
+ | |||
+ | //prekresleni hada | ||
+ | x_pos_old = x_pos[4]; | ||
+ | y_pos_old = y_pos[4]; | ||
+ | |||
+ | x_pos[4] = x_pos[3]; | ||
+ | y_pos[4] = y_pos[3]; | ||
+ | |||
+ | x_pos[3] = x_pos[2]; | ||
+ | y_pos[3] = y_pos[2]; | ||
+ | |||
+ | x_pos[2] = x_pos[1]; | ||
+ | y_pos[2] = y_pos[1]; | ||
+ | |||
+ | x_pos[1] = x_pos[0]; | ||
+ | y_pos[1] = y_pos[0]; | ||
+ | |||
+ | //nacteni dat z gyroskopu | ||
+ | TM_L3GD20_Read(&L3GD20_Data); | ||
+ | |||
+ | |||
+ | //absolutni zmena | ||
+ | if ((L3GD20_Data.Y * L3GD20_Data.Y) > (L3GD20_Data.X * L3GD20_Data.X)){ | ||
+ | if (L3GD20_Data.Y>25) | ||
+ | status = 1; | ||
+ | if (L3GD20_Data.Y<(-25)) | ||
+ | status = -1; | ||
+ | } | ||
+ | else { | ||
+ | if (L3GD20_Data.X>25) | ||
+ | status = 2; | ||
+ | if (L3GD20_Data.X<(-25)) | ||
+ | status = -2; | ||
+ | } | ||
+ | |||
+ | |||
+ | //posun v danych smerech | ||
+ | if (status == 1) | ||
+ | x_pos[0] += 20; | ||
+ | if (status == -1) | ||
+ | x_pos[0] -= 20; | ||
+ | |||
+ | if (status == 2) | ||
+ | y_pos[0] += 20; | ||
+ | if (status == -2) | ||
+ | y_pos[0] -= 20; | ||
+ | |||
+ | |||
+ | //podtekani a pretekani | ||
+ | if(x_pos[0] > 239) | ||
+ | x_pos[0] -= 240; | ||
+ | if(y_pos[0] > 319) | ||
+ | y_pos[0] -= 320; | ||
+ | |||
+ | if(x_pos[0] < 1) | ||
+ | x_pos[0] += 240; | ||
+ | if(y_pos[0] < 1) | ||
+ | y_pos[0] += 320; | ||
+ | |||
+ | |||
+ | TM_ILI9341_DrawFilledCircle(x_pos_old, y_pos_old, 10, ILI9341_COLOR_RED);//smaze | ||
+ | TM_ILI9341_DrawFilledCircle(x_pos[0], y_pos[0], 10, ILI9341_COLOR_BLACK);//dokresli | ||
+ | |||
+ | delay_ms(400); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | **Závěr:**: | ||
+ | Byla naprogramována jednoduchá hra Snake, která je řízena dle příslušných hodnot v osách X a Y obdržených z vestavěného gyroskopu. Demonstrační video lze shlednout na: https://www.youtube.com/watch?v=flEpEQqiEGE&feature=youtu.be | ||
+ | |||