LCDによるArduinoゲーム
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
<図>
必要な部品は上の写真に示されています。電源が入っていないArduinoから始めます。 USBケーブルを差し込まないでください。これは、後のステップでプログラムしてゲームを試すときに発生します。
接続
長いフックアップワイヤーを使用して、Arduinoの5V信号をブレッドボード上部の赤い列の左端に接続します。
長いフックアップワイヤを使用して、ブレッドボードの上部にある黒(または一部のブレッドボードでは青)の行の左端にGND信号を接続します。
LCD(Liquid Crystal Display)モジュールには、下側に16ピンのオスヘッダーがあります。写真のようにこれをブレッドボードに差し込みます。 LCDに電力を供給して制御するすべての電子信号は、このヘッダーを通過します。
これらのピンは(左から右へ):
- GND-電源グランド信号
- VCC-正の電力信号
- V0-コントラスト調整
- RS-レジスタ選択
- R / W-読み取り/書き込み選択
- E-操作イネーブル信号
- DB0-データビット0(ここでは使用されません)
- DB1-データビット1(ここでは使用されません)
- DB2-データビット2(ここでは使用されません)
- DB3-データビット3(ここでは使用されません)
- DB4-データビット4
- DB5-データビット5
- DB6-データビット6
- DB7-データビット7
- LED +-バックライトLEDポジティブ
- LED--バックライトLEDネガティブ
短いフックアップワイヤを使用して、GNDとLED-(ピン1と16)を上部の黒い列に接続します。
同様に、VCC(ピン2)を短いフックアップワイヤで上部の赤い列に接続します。
220Ω抵抗器のリード線(赤-赤-茶色の帯)を曲げて、LED +とブレッドボード上部の赤い列の間に接続します。
残りの接続を行うには、より長いフックアップワイヤを使用します。
- DB7をArduinoピン3に接続します
- DB6をArduinoピン4に接続します
- DB5をArduinoピン5に接続します
- DB4をArduinoピン6に接続します
- EをArduinoピン9に接続します
- R / WをArduinoピン10(またはブレッドボード上部の黒い列)に接続します
- RSをArduinoピン11に接続します
- V0をArduinoピン12(またはブレッドボード上部の黒い列)に接続します
ブレッドボードの中央に沿って走るチャネルにまたがって、LCD画面の左側のどこかにプッシュボタンを差し込みます(上の図を参照)。短いフックアップワイヤーを使用して、ボタンの上部の2つのピンの1つをブレッドボードの上部にある黒い列に接続します。ボタンの上部にあるもう一方のピンをArduinoのピン2に接続します。
<図><図>
コード
- LCD_Game.ino
LCD_Game.ino Arduino
#include#define PIN_BUTTON 2#define PIN_AUTOPLAY 1#define PIN_READWRITE 10#define PIN_CONTRAST 12#define SPRITE_RUN1 1#define SPRITE_RUN2 2#define SPRITE_JUMP 3#define SPRITE_JUMP_UPPER '。' // 使用 '。'頭の文字#defineSPRITE_JUMP_LOWER4#define SPRITE_TERRAIN_EMPTY '' //ユーザー ''文字#defineSPRITE_TERRAIN_SOLID 5#define SPRITE_TERRAIN_SOLID_RIGHT 6#define SPRITE_TERRAIN_SOLID_LEFT 7#define SPRITE_TERRAIN_SOLID_LEFT 7#define HERO_HORIZ TERRAIN_EMPTY 0#define TERRAIN_LOWER_BLOCK 1#define TERRAIN_UPPER_BLOCK 2#define HERO_POSITION_OFF 0 //ヒーローは見えない#defineHERO_POSITION_RUN_LOWER_1 1 //ヒーローは下の行で実行されています(ポーズ1)#define HERO_POSITION_RUN_LOWER_2 2 //(ポーズ/ジャンプの開始#define HERO_POSITION_JUMP_2 4 //途中まで#defineHERO_POSITION_JUMP_3 5 //ジャンプは上段にあります#defineHERO_POSITION_JUMP_4 6 //ジャンプは上段にあります#defineHERO_POSITION_JUMP_5 7 //ジャンプは上段にあります#defineHERO_POSITION_JUMP_6 8 //ジャンプは上段にあります#defineHERO_POSITION_JUMP_7 9 // Half-wa y down#define HERO_POSITION_JUMP_8 10 //着陸しようとしています#defineHERO_POSITION_RUN_UPPER_1 11 //ヒーローは上段で走っています(ポーズ1)#define HERO_POSITION_RUN_UPPER_2 12 //(ポーズ2)LiquidCrystal lcd(11、9、6、5、4 3); static char terrainUpper [TERRAIN_WIDTH + 1]; static char terrainLower [TERRAIN_WIDTH + 1]; static bool buttonPushed =false; void initializeGraphics(){static byte graphics [] ={//実行位置1B01100、B01100、B00000、 B01110、B11100、B01100、B11010、B10011、//実行位置2 B01100、B01100、B00000、B01100、B01100、B01100、B01100、B01110、//ジャンプB01100、B01100、B00000、B11110、B01101、B11111、B10000、B00000、 //下にジャンプB11110、B01101、B11111、B10000、B00000、B00000、B00000、B00000、//グラウンドB11111、B11111、B11111、B11111、B11111、B11111、B11111、B11111、//グラウンド右B00011、B00011、B00011 B00011、B00011、B00011、B00011、B00011、//左グラウンドB11000、B11000、B11000、B11000、B11000、B11000、B11000、B11000、}; int i; //文字0の使用をスキップします。これにより、lcd.print()を使用して//(i =0; i <7; ++ i){lcd.createChar(i + 1、&graphics [i * 8]); } for(i =0; i 9999)? 5 :(スコア> 999)? 4 :(スコア> 99)? 3 :(スコア> 9)? 2:1; //シーンを描画しますterrainUpper [TERRAIN_WIDTH] ='\ 0'; terrainLower [TERRAIN_WIDTH] ='\ 0'; char temp =terrainUpper [16桁]; terrainUpper [16桁] ='\ 0'; lcd.setCursor(0,0); lcd.print(terrainUpper); terrainUpper [16桁] =temp; lcd.setCursor(0,1); lcd.print(terrainLower); lcd.setCursor(16-数字、0); lcd.print(score); terrainUpper [HERO_HORIZONTAL_POSITION] =upperSave; terrainLower [HERO_HORIZONTAL_POSITION] =lowerSave; return collide;} //ボタンプッシュを割り込みとして処理しますvoidbuttonPush(){buttonPushed =true;} void setup(){pinMode(PIN_READWRITE、OUTPUT); digitalWrite(PIN_READWRITE、LOW); pinMode(PIN_CONTRAST、OUTPUT); digitalWrite(PIN_CONTRAST、LOW); pinMode(PIN_BUTTON、INPUT); digitalWrite(PIN_BUTTON、HIGH); pinMode(PIN_AUTOPLAY、OUTPUT); digitalWrite(PIN_AUTOPLAY、HIGH); //デジタルピン2は割り込み0にマップされますattachInterrupt(0 / * PIN_BUTTON * /、buttonPush、FALLING); initializeGraphics(); lcd.begin(16、2);} void loop(){static byte heroPos =HERO_POSITION_RUN_LOWER_1;静的バイトnewTerrainType =TERRAIN_EMPTY;静的バイトnewTerrainDuration =1; static bool playing =false;静的ブール点滅=false; static unsigned int distance =0; if(!playing){drawHero((blink)?HERO_POSITION_OFF:heroPos、terrainUpper、terrainLower、distance>> 3); if(blink){lcd.setCursor(0,0); lcd.print( "プレススタート"); } delay(250);点滅=!点滅; if(buttonPushed){initializeGraphics(); heroPos =HERO_POSITION_RUN_LOWER_1;再生=true; buttonPushed =false;距離=0; } 戻る; } //地形を左にシフトadvanceTerrain(terrainLower、newTerrainType ==TERRAIN_LOWER_BLOCK?SPRITE_TERRAIN_SOLID:SPRITE_TERRAIN_EMPTY); AdvanceTerrain(terrainUpper、newTerrainType ==TERRAIN_UPPER_BLOCK?SPRITE_TERRAIN_SOLID:SPRITE_TERRAIN_EMPTY); //右側に入る新しい地形を作成しますif(-newTerrainDuration ==0){if(newTerrainType ==TERRAIN_EMPTY){newTerrainType =(random(3)==0)? TERRAIN_UPPER_BLOCK:TERRAIN_LOWER_BLOCK; newTerrainDuration =2 + random(10); } else {newTerrainType =TERRAIN_EMPTY; newTerrainDuration =10 + random(10); }} if(buttonPushed){if(heroPos <=HERO_POSITION_RUN_LOWER_2)heroPos =HERO_POSITION_JUMP_1; buttonPushed =false; } if(drawHero(heroPos、terrainUpper、terrainLower、distance>> 3)){playing =false; //主人公が何かと衝突しました。残念な。 } else {if(heroPos ==HERO_POSITION_RUN_LOWER_2 || heroPos ==HERO_POSITION_JUMP_8){heroPos =HERO_POSITION_RUN_LOWER_1; } else if((heroPos> =HERO_POSITION_JUMP_3 &&heroPos <=HERO_POSITION_JUMP_5)&&terrainLower [HERO_HORIZONTAL_POSITION]!=SPRITE_TERRAIN_EMPTY){heroPos =HERO_POSITION_RUN_UPPER_1; } else if(heroPos> =HERO_POSITION_RUN_UPPER_1 &&terrainLower [HERO_HORIZONTAL_POSITION] ==SPRITE_TERRAIN_EMPTY){heroPos =HERO_POSITION_JUMP_5; } else if(heroPos ==HERO_POSITION_RUN_UPPER_2){heroPos =HERO_POSITION_RUN_UPPER_1; } else {++ heroPos; } ++距離; digitalWrite(PIN_AUTOPLAY、terrainLower [HERO_HORIZONTAL_POSITION + 2] ==SPRITE_TERRAIN_EMPTY?HIGH:LOW); } delay(100);}
回路図
ドキュメントがありません。
製造プロセス