Arduino Retro hry s OLED displejem

  • Mark Lucas
  • 33
  • 1912
  • 55
reklama

Přemýšleli jste někdy nad tím, kolik práce vyžaduje psaní vlastních retro her? Jak snadné je Pong kódovat Arduino? Připojte se ke mně, když vám ukážu, jak postavit mini retro herní konzoli napájenou Arduino a jak kódovat Pong od nuly. Zde je konečný výsledek:

Sestavte plán

Toto je docela jednoduchý obvod. A potenciometr (pot) bude ovládat hru a OLED displej bude poháněn Arduino. To bude vytvořeno na prkénku, můžete však chtít vytvořit trvalý obvod a nainstalovat jej do pouzdra. Psali jsme o obnovení hry Pong Jak znovu vytvořit klasickou hru Pong pomocí Arduina Jak znovu vytvořit hru Classic Pong pomocí Arduino Pong byla vůbec první videohra, která dosáhla masového trhu. Poprvé v historii byl koncept „videohry“ přinesen do rodinného domu díky Atari 2600 -… ale dnes vám ale ukážu, jak napsat kód od nuly a rozebrat každý část.

Co potřebuješ

Zde je to, co potřebujete:

  • 1 x Arduino (jakýkoli model)
  • 1 x 10 k potenciometr
  • 1 x 0,96 "ILED displej O2
  • 1 x prkénko
  • Různé mužské> mužské vodiče

Každý Arduino by měl fungovat, takže se podívejte na našeho průvodce nákupem Průvodce nákupem Arduino: Kterou desku byste měli získat? Průvodce nákupem Arduina: Kterou desku byste měli získat? Je tam tolik různých druhů desek Arduino, bylo by vám odpuštěno, že jste zmatení. Které byste si měli koupit pro svůj projekt? Pomozte nám s tímto nákupním průvodcem Arduino! pokud si nejste jisti, jaký model koupit.

Tyto OLED displeje jsou velmi cool. Obvykle je lze zakoupit v bílé, modré, žluté nebo ve směsi tří. Existují v plné barvě, avšak tyto zvyšují složitost a náklady tohoto projektu úplně jinou úroveň.

Okruh

Toto je docela jednoduchý obvod. Pokud nemáte s Arduino mnoho zkušeností, podívejte se na tyto projekty pro začátečníky 15 Velké projekty Arduino pro začátečníky 15 Velké projekty Arduino pro začátečníky Zajímáte se o projekty Arduino, ale nejste si jisti, kde začít? Tyto začátečníky vás naučí, jak začít. První.

Tady to je:

Při pohledu na přední část hrnce připojte levý kolík +5V a pravý špendlík na přízemní. Připojte prostřední pin k analogový pin 0 (A0).

Displej OLED je připojen pomocí protokolu I2C. Připojit VCC a GND na Arduino +5V a přízemní. Připojit SCL na analog pět (A5). Připojit SDA na analog 4 (A4). Důvod, proč je připojen k analogovým pinům, je jednoduchý; tyto kolíky obsahují obvody potřebné pro protokol I2C. Ujistěte se, že jsou správně připojeny a nepřekračovány. Přesné kolíky se budou lišit podle modelu, ale na modelech Nano a Uno se používají A4 a A5. Pokud nepoužíváte Arduino nebo Nano, podívejte se do dokumentace k knihovně Wire.

Pot Test

Nahrajte tento testovací kód (nezapomeňte vybrat správnou kartu a port ze seznamu Nástroje > Prkno a Nástroje > Přístav nabídky):

void setup () // sem vložte svůj instalační kód, který chcete spustit jednou: Serial.begin (9600); // setup serial void loop () // sem vložte svůj hlavní kód, abyste mohli opakovaně pracovat: Serial.println (analogRead (A0)); // vytiskne hodnotu z prodlevy banku (500); 

Nyní otevřete sériový monitor (Vpravo nahoře > Sériový monitor) a otočte banku. Měli byste vidět hodnotu zobrazenou na sériovém monitoru. Mělo by být zcela proti směru hodinových ručiček nula, a úplně ve směru hodinových ručiček 1023:

Upravíte to později, ale prozatím je to v pořádku. Pokud se nic nestane nebo se hodnota nezmění, aniž byste cokoli udělali, odpojte a znovu zkontrolujte obvod.

Test OLED

Konfigurace OLED displeje je o něco složitější. Abyste mohli řídit displej, musíte nainstalovat dvě knihovny. Stáhněte si knihovny Adafruit_SSD1306 a Adafruit-GFX z Githubu. Zkopírujte soubory do své knihovny. To se liší v závislosti na operačním systému:

  • Operační Systém Mac: / Uživatelé / Uživatelské jméno / Dokumenty / Arduino / knihovny
  • Linux: / home / Uživatelské jméno / Skicář
  • Okna: / Uživatelé / Arduino / knihovny

Nyní nahrajte zkušební skicu. Jít do Soubor > Příklady > Adafruit SSD1306 > ssd1306_128x64_i2c. To by vám mělo poskytnout velkou skicu obsahující spoustu grafiky:

Pokud se po nahrávání nic nestane, odpojte a znovu zkontrolujte připojení. Pokud příklady nejsou v nabídkách, možná budete muset restartovat Arduino IDE.

Kód

Nyní je čas na kód. Vysvětlím vám každý krok, takže přeskočte na konec, pokud si přejete, aby byl spuštěn. Jedná se o spravedlivé množství kódu, takže pokud se necítíte sebevědomě, podívejte se na těchto 10 zdrojů zdarma Naučte se kódovat: 10 bezplatných a fantastických online zdrojů pro zdokonalení vašich dovedností Naučte se kódovat: 10 bezplatných a fantastických online zdrojů pro zdokonalení svých Kódování dovedností. Téma, kterému se mnozí vyhýbají. Existuje velké množství bezplatných zdrojů a nástrojů, z nichž všechny jsou k dispozici online. Určitě byste mohli absolvovat nějaké kurzy na toto téma v blízkém… naučit se kódovat.

Začněte zahrnutím potřebných knihoven:

#include #include #include #include 

SPI a DRÁT jsou dvě Arduino knihovny pro zpracování I2C komunikace. Adafruit_GFX a Adafruit_SSD1306 jsou knihovny, které jste nainstalovali dříve.

Dále nakonfigurujte displej:

Displej Adafruit_SSD1306 (4);

Poté nastavte všechny proměnné potřebné ke spuštění hry:

int rozlišení [2] = 128, 64, koule [2] = 20, (rozlišení [1] / 2); const int PIXEL_SIZE = 8, WALL_WIDTH = 4, PADDLE_WIDTH = 4, BALL_SIZE = 4, SPEED = 3; int playerScore = 0, aiScore = 0, playerPos = 0, aiPos = 0; char ballDirectionHori = 'R', ballDirectionVerti = 'S'; boolean inProgress = true;

Tyto ukládají všechna data potřebná ke spuštění hry. Některé z nich ukládají umístění míče, velikost obrazovky, umístění hráče atd. Všimněte si, jaké jsou některé z nich konst což znamená, že jsou konstantní a nikdy se nezmění. To umožňuje kompilátoru Arduino trochu urychlit věci.

Rozlišení obrazovky a umístění koule jsou uloženy v pole. Pole jsou kolekce podobných věcí a pro míč uložte souřadnice (X a Y). Přístup k prvkům v polích je snadný (nezahrnujte tento kód do souboru):

rozlišení [1];

Když pole začínají na nule, vrátí se druhý prvek v poli rozlišení (64). Aktualizace prvků je ještě snazší (znovu tento kód nezahrnout):

koule [1] = 15;

Uvnitř neplatné nastavení (), konfigurovat displej:

void setup () display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.display (); 

První řádek sdělí knihovně Adafruit, jaké rozměry a komunikační protokol váš displej používá (v tomto případě, 128 X 64 a I2C). Druhý řádek (display.display ()) řekne obrazovce, aby ukázala, co je uloženo ve vyrovnávací paměti (což není nic).

Vytvořte dvě metody nazvané drawBall a eraseBall:

void drawBall (int x, int y) display.drawCircle (x, y, BALL_SIZE, WHITE);  void eraseBall (int x, int y) display.drawCircle (x, y, BALL_SIZE, BLACK); 

Tito berou X a y souřadnice koule a nakreslete ji na obrazovku pomocí drawCircle metoda z knihoven zobrazení. Toto používá konstantu BALL_SIZE definováno dříve. Zkuste to změnit a uvidíte, co se stane. Tato metoda drawCircle přijímá barvu pixelu - ČERNÁ nebo BÍLÝ. Protože se jedná o monochromatický displej (jedna barva), bílá se rovná zapnutému pixelu a černá vypíná pixel.

Nyní vytvořte metodu nazvanou moveAi:

void moveAi () eraseAiPaddle (aiPos); if (ball [1]> aiPos) ++ aiPos;  jinak pokud (míč [1] < aiPos)  --aiPos;  drawAiPaddle(aiPos); 

Tato metoda se zabývá pohybem Umělá inteligence nebo AI hráč. To je docela jednoduchý počítačový protivník - Pokud je míč nad pádlem, posuňte se nahoru. Je to pod pádlem, posuňte se dolů. Docela jednoduché, ale funguje to dobře. Používají se symboly přírůstku a úbytku (++aiPos a -aiPos) přidat nebo odečíst jednu z aiPosition. Můžete přidat nebo odečíst větší počet, aby se AI pohyboval rychleji, a proto bude obtížnější porazit. Postupujte takto:

aiPos + = 2;

A:

aiPos - = 2;

Plus se rovná a Mínus se rovná Znaky jsou zkratky pro sčítání nebo odečítání dvou z / do aktuální hodnoty aiPos. Tady je další způsob, jak to udělat:

aiPos = aiPos + 2;

a

aiPos = aiPos - 1;

Všimněte si, jak tato metoda nejprve vymaže lopatku a poté ji znovu nakreslí. To je třeba udělat takto. Pokud by byla nakreslena nová poloha pádla, na obrazovce by byly dvě překrývající se pádla.

drawNet metoda používá k vytvoření sítě dvě smyčky:

void drawNet () for (int i = 0; i < (resolution[1] / WALL_WIDTH); ++i)  drawPixel(((resolution[0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH);  

To používá WALL_WIDTH proměnné nastavit jeho velikost.

Vytvořit metody s názvem drawPixels a erasePixels. Stejně jako u kuličkových metod je jediným rozdílem mezi těmito dvěma barvami barva pixelů:

void drawPixel (int posX, int posY, int rozměry) for (int x = 0; x < dimensions; ++x)  for (int y = 0; y < dimensions; ++y)  display.drawPixel((posX + x), (posY + y), WHITE);    void erasePixel(int posX, int posY, int dimensions)  for (int x = 0; x < dimensions; ++x)  for (int y = 0; y < dimensions; ++y)  display.drawPixel((posX + x), (posY + y), BLACK);   

Obě tyto metody opět používají dvě pro smyčky k nakreslení skupiny pixelů. Spíše než nakreslit každý pixel pomocí knihoven drawPixel metoda, smyčky nakreslí skupinu pixelů na základě daných rozměrů.

drawScore metoda používá textové funkce knihovny k zápisu přehrávače a skóre AI na obrazovku. Tyto jsou uloženy v playerScore a aiScore:

void drawScore () display.setTextSize (2); display.setTextColor (WHITE); display.setCursor (45, 0); display.println (playerScore); display.setCursor (75, 0); display.println (aiScore); 

Tato metoda má také eraseScore protějšek, který nastavuje pixely na černou nebo vypnutou.

Poslední čtyři metody jsou velmi podobné. Nakreslí a vymaže přehrávač a pádla AI:

void erasePlayerPaddle (int row) erasePixel (0, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); erasePixel (0, řádek - PADDLE_WIDTH, PADDLE_WIDTH); erasePixel (0, řádek, PADDLE_WIDTH); erasePixel (0, řádek + PADDLE_WIDTH, PADDLE_WIDTH); erasePixel (0, řádek + (PADDLE_WIDTH + 2), PADDLE_WIDTH); 

Všimněte si, jak volají erasePixel metoda vytvořit dříve. Tyto metody nakreslí a vymažou příslušné pádlo.

V hlavní smyčce je trochu více logiky. Zde je celý kód:

#include #include #include #include Adafruit_SSD1306 display (4); int rozlišení [2] = 128, 64, koule [2] = 20, (rozlišení [1] / 2); const int PIXEL_SIZE = 8, WALL_WIDTH = 4, PADDLE_WIDTH = 4, BALL_SIZE = 4, SPEED = 3; int playerScore = 0, aiScore = 0, playerPos = 0, aiPos = 0; char ballDirectionHori = 'R', ballDirectionVerti = 'S'; boolean inProgress = true; void setup () display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.display ();  void loop () if (aiScore> 9 || playerScore> 9) // zkontrolovat stav hry inProgress = false;  if (inProgress) eraseScore (); eraseBall (míč [0], míč [1]); if (ballDirectionVerti == 'U') // posunout míč nahoru diagonálně míč [1] = míč [1] - RYCHLOST;  if (ballDirectionVerti == 'D') // posunout míč dolů diagonálně míč [1] = míč [1] + RYCHLOST;  if (ball [1] = rozlišení [1]) // odrazí míč od spodního ballDirectionVerti = 'U';  if (ballDirectionHori == 'R') ball [0] = ball [0] + SPEED; // přesuňte míč, pokud (míč [0]> = (rozlišení [0] - 6)) // míč je na okraji AI obrazovky, pokud ((aiPos + 12)> = míč [1] && (aiPos - 12) (aiPos + 4)) // odklonit míč dolů BallDirectionVerti = 'D';  jinak pokud (míč [1] < (aiPos - 4))  // deflect ball up ballDirectionVerti = 'U';  else  // deflect ball straight ballDirectionVerti = 'S';  // change ball direction ballDirectionHori = 'L';  else  // GOAL! ball[0] = 6; // move ball to other side of screen ballDirectionVerti = 'S'; // reset ball to straight travel ball[1] = resolution[1] / 2; // move ball to middle of screen ++playerScore; // increase player score    if (ballDirectionHori == 'L')  ball[0] = ball[0] - SPEED; // move ball if (ball[0] = ball[1] && (playerPos - 12)  (playerPos + 4))  // deflect ball down ballDirectionVerti = 'D';  else if (ball[1]  playerScore)  display.println("YOU LOSE!");  else if (playerScore > aiScore) display.println ("YOU WIN!");  display.display ();  void moveAi () // přesunout AI pádlo eraseAiPaddle (aiPos); if (ball [1]> aiPos) ++ aiPos;  jinak pokud (míč [1] < aiPos)  --aiPos;  drawAiPaddle(aiPos);  void drawScore()  // draw AI and player scores display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(45, 0); display.println(playerScore); display.setCursor(75, 0); display.println(aiScore);  void eraseScore()  // erase AI and player scores display.setTextSize(2); display.setTextColor(BLACK); display.setCursor(45, 0); display.println(playerScore); display.setCursor(75, 0); display.println(aiScore);  void drawNet()  for (int i = 0; i < (resolution[1] / WALL_WIDTH); ++i)  drawPixel(((resolution[0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH);   void drawPixel(int posX, int posY, int dimensions)  // draw group of pixels for (int x = 0; x < dimensions; ++x)  for (int y = 0; y < dimensions; ++y)  display.drawPixel((posX + x), (posY + y), WHITE);    void erasePixel(int posX, int posY, int dimensions)  // erase group of pixels for (int x = 0; x < dimensions; ++x)  for (int y = 0; y < dimensions; ++y)  display.drawPixel((posX + x), (posY + y), BLACK);    void erasePlayerPaddle(int row)  erasePixel(0, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); erasePixel(0, row - PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(0, row, PADDLE_WIDTH); erasePixel(0, row + PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(0, row + (PADDLE_WIDTH + 2), PADDLE_WIDTH);  void drawPlayerPaddle(int row)  drawPixel(0, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); drawPixel(0, row - PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(0, row, PADDLE_WIDTH); drawPixel(0, row + PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(0, row + (PADDLE_WIDTH + 2), PADDLE_WIDTH);  void drawAiPaddle(int row)  int column = resolution[0] - PADDLE_WIDTH; drawPixel(column, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); drawPixel(column, row - PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(column, row, PADDLE_WIDTH); drawPixel(column, row + PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(column, row + (PADDLE_WIDTH * 2), PADDLE_WIDTH);  void eraseAiPaddle(int row)  int column = resolution[0] - PADDLE_WIDTH; erasePixel(column, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); erasePixel(column, row - PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(column, row, PADDLE_WIDTH); erasePixel(column, row + PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(column, row + (PADDLE_WIDTH * 2), PADDLE_WIDTH);  void drawBall(int x, int y)  display.drawCircle(x, y, BALL_SIZE, WHITE);  void eraseBall(int x, int y)  display.drawCircle(x, y, BALL_SIZE, BLACK); 

Zde je to, s čím skončíte:

Až budete s kódem jisti, můžete provést řadu změn:

  • Přidejte nabídku pro úrovně obtížnosti (změna AI a rychlost míče).
  • Přidejte k míči nebo AI nějaký náhodný pohyb.
  • Přidejte další banku pro dva hráče.
  • Přidání tlačítka pauzy.

Nyní se podívejte na tyto retro herní projekty Pi Zero 5 Retro herní projekty s Raspberry Pi Zero 5 Retro herní projekty s Raspberry Pi Zero Raspberry Pi Zero přijalo svět DIY a homebrew světem, což umožňuje revidovat staré projekty a inspirující nováčky, zejména v horečných myslích fanoušků retro her. .

Kódovali jste Pong pomocí tohoto kódu? Jaké změny jste provedli? Dejte mi vědět v komentářích níže, ráda bych vypadala pár obrázků!




jmvrqhsvk ([email protected])
28.05.23 17:30
UneDose | Arduino Retro hry s OLED displejem [url=http://www.g7661nz6wtit893j182bif313od3lr6hs.org/]ujmvrqhsvk[/url] jmvrqhsvk http://www.g7661nz6wtit893j182bif313od3lr6hs.org/ <a href="http://www.g7661nz6wtit893j182bif313od3lr6hs.org/">ajmvrqhsvk</a>
jvrcbvzkxq ([email protected])
15.05.23 21:35
UneDose | Arduino Retro hry s OLED displejem <a href="http://www.g37dfx7viqyk7v352b5j27x46660rop8s.org/">ajvrcbvzkxq</a> jvrcbvzkxq http://www.g37dfx7viqyk7v352b5j27x46660rop8s.org/ [url=http://www.g37dfx7viqyk7v352b5j27x46660rop8s.org/]ujvrcbvzkxq[/url]
12.05.23 01:20
UneDose | Arduino Retro hry s OLED displejem ljwiqtq http://www.g351947j3did9z7ibaov5958zy4v47uxs.org/ [url=http://www.g351947j3did9z7ibaov5958zy4v47uxs.org/]uljwiqtq[/url] <a href="http://www.g351947j3did9z7ibaov5958zy4v47uxs.org/">aljwiqtq</a>
wkvfpcfcj ([email protected])
11.05.23 06:24
UneDose | Arduino Retro hry s OLED displejem <a href="http://www.gn62683jd51a7v542p6uzhr982zp0qwqs.org/">awkvfpcfcj</a> [url=http://www.gn62683jd51a7v542p6uzhr982zp0qwqs.org/]uwkvfpcfcj[/url] wkvfpcfcj http://www.gn62683jd51a7v542p6uzhr982zp0qwqs.org/
xyxnmrhnzo ([email protected])
11.05.23 06:24
UneDose | Arduino Retro hry s OLED displejem <a href="http://www.g3803cw37r3e8ns3bb15y73tmu1myc14s.org/">axyxnmrhnzo</a> xyxnmrhnzo http://www.g3803cw37r3e8ns3bb15y73tmu1myc14s.org/ [url=http://www.g3803cw37r3e8ns3bb15y73tmu1myc14s.org/]uxyxnmrhnzo[/url]
O moderní technologii, jednoduché a cenově dostupné.
Váš průvodce ve světě moderních technologií. Naučte se, jak používat technologie a pomůcky, které nás každý den obklopují, a naučte se, jak objevovat na internetu zajímavé věci.