2016年6月11日土曜日

Arduinoゲーム機の製作6

前回までにようやく動くところまで行ったので、今回はプログラムと
回路のメモ。

といってもかなり教科書的な使い方なのであんまり工夫点はないです。



・回路



最終的な回路図はこんな感じ。
LCDは結局分圧+レギュレーターを使用しました。
これで動いたのでとりあえず良しとします。
改良するとすれば、外部から5V電源を引いてこれるといいかもしれません。


・ソフト

#include <MGLCD.h>
#include <MGLCD_SPI.h>
#include <SPI.h>
#define MODE_MAX 2

//ピン定義
#define LED 12
#define Buzzer 4
#define SW_TOP A5
#define SW_BUTTOM A2
#define SW_RIGHT A4
#define SW_LEFT A3
#define SW_B0 A1
#define SW_B1 A0

//LCD宣言
#define CS_PIN 10
#define DI_PIN  9
#define MAX_FREQ (1000*1000L)
MGLCD_AQM1248A_SPI MGLCD(MGLCD_SpiPin2(CS_PIN, DI_PIN), MAX_FREQ);

//グローバル変数
int mode =0;//現在モード
int BuzTorn[8] = { 262,294,330,349,392,440,494,523 }; //ブザー周波数

void setup() {
  //ボタンピン設定
  pinMode(SW_TOP, INPUT);
  pinMode(SW_BUTTOM, INPUT);
  pinMode(SW_RIGHT, INPUT);
  pinMode(SW_LEFT, INPUT);
  pinMode(SW_B0, INPUT);
  pinMode(SW_B1, INPUT);
  pinMode(LED, OUTPUT); //LED

  //プルアップ有効
  digitalWrite(SW_TOP, HIGH);
  digitalWrite(SW_BUTTOM, HIGH);
  digitalWrite(SW_RIGHT, HIGH);
  digitalWrite(SW_LEFT, HIGH);
  digitalWrite(SW_B0, HIGH);
  digitalWrite(SW_B1, HIGH);

  while(MGLCD.Reset()); //LCD初期化
  delay(500);
  //初期画面表示
  MGLCD.Locate(5,3);         //表示位置指定
  MGLCD.print("Game Board"); //文字列出力
  MGLCD.Locate(11,5);
  MGLCD.print("Ver.1.3 ");
  MGLCD.Rect(9,7,117,47);    //四角形表示

  tone(Buzzer,BuzTorn[6],250) ;  // ド
  delay(1000);

  MGLCD.ClearScreen();       //表示クリア
  digitalWrite(LED, HIGH);  //LED点灯
}

void loop() {
  //モード選択
  MGLCD.Locate(4,2);
  MGLCD.print("Select  Mode");
  MGLCD.Locate(8,4);
  MGLCD.print("[[ ]]");
  MGLCD.Locate(10,4);
  MGLCD.print(mode,DEC);
  if(Push_SW(SW_RIGHT)){mode++;}
  else if(Push_SW(SW_LEFT)) {mode--;}
  if(mode>MODE_MAX) {mode=0;}
  else if(mode<0) {mode = MODE_MAX;}
  if(Push_SW(SW_B0)){
    switch(mode){
        case 0: exe_mode0();
                break;
             
        case 1: exe_mode1();
                break;
             
        case 2: exe_mode2();
                break;
             
        default: break;
     }
  }
}

//--------------------
//      モード0
//--------------------
void exe_mode0(void){
  MGLCD.ClearScreen();
  MGLCD.Locate(6,2);
  MGLCD.print("MODE 0");
  while(!Push_SW(SW_B1)){
    MGLCD.Locate(6,4);
    MGLCD.print("Push B1!!");
    delay(500);
    MGLCD.Locate(6,4);
    MGLCD.print("         ");
    delay(500);
  }
  MGLCD.ClearScreen();
}

//--------------------
//      モード1
//--------------------
void exe_mode1(void){
  MGLCD.ClearScreen();
  MGLCD.Locate(6,2);
  MGLCD.print("MODE 1");
  while(!Push_SW(SW_B1)){
    MGLCD.Locate(6,4);
    MGLCD.print("Push B1!!");
    delay(500);
    MGLCD.Locate(6,4);
    MGLCD.print("         ");
    delay(500);
  }
  MGLCD.ClearScreen();
}

//--------------------
//      モード2
//--------------------
void exe_mode2(void){
  MGLCD.ClearScreen();
  MGLCD.Locate(6,2);
  MGLCD.print("MODE 2");
  while(!Push_SW(SW_B1)){
    MGLCD.Locate(6,4);
    MGLCD.print("Push B1!!");
    delay(500);
    MGLCD.Locate(6,4);
    MGLCD.print("         ");
    delay(500);
  }
  MGLCD.ClearScreen();
}

//--------------------
//    スイッチ入力
//--------------------
bool Push_SW(char sw){
  if(digitalRead(sw) == LOW){
    while(digitalRead(sw) == LOW);
    return(1);
  }else return(0);
}


ArduinoリファレンスとMGLCDのマニュアルにあるとおりです。
工夫点はスイッチ入力でしょうか。
bool Push_SW(char sw){
  if(digitalRead(sw) == LOW){
    while(digitalRead(sw) == LOW);
    return(1);
  }else return(0);
}

スイッチが押されたとき、離されるまで待つことで
確実に入力を判定します。

呼ぶときは、
if(Push_SW(SW)){ 処理 }

また入力待ちは
 while(!Push_SW(SW)){
  処理
 }
このようにスマートに書くことができます。




今回でArduinoのゲーム機製作は終わろうと思います。
ゲームプログラムを書いたところであんまり参考にならないと思いますし・・・
当初、一ヶ月ぐらいでできるだろうと思っていましたが、予想外に
時間がかかってしまいました。しかし、結構遊べそうなものができたので
結構満足しています。
しばらくはArduino関係の資料をまとめようと思います。

0 件のコメント:

コメントを投稿