0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Arduino Uno]ボタン連打ゲームを作ってみた!

Last updated at Posted at 2023-04-27

動機

secHack365の思索駆動コースの応募課題を提出するためプログラム以外の制作物を用意する必要があったから。

購入したもの

Amazonでこれをポチりました。キャンペーンのおかげか20%offで買えたので嬉しかったです。(4130円:v:)

制作物の説明

ボタンを連打して押し込めたら勝ちです!とてもシンプル。

実装方法

Arduino IDEのインストール、portとボードの設定を付属資料に従い終了させたあとに以下のように回路を作りました。(もう少し短いワイヤが欲しい...)

その後IDEでCプログラムを作成し、コンパイルとアップロードを行います。
使用したプログラム全体を示します。

// LED右端のピン番号
int ledPinMR = 6;
// LED左端のピン番号
int ledPinML = 12;
// 右のボタンのピン番号
int buttonPinR = 5;
// 左のボタンのピン番号
int buttonPinL = 13;
// 点灯させるLEDのピン番号(初期設定は真ん中)
int now = (ledPinMR+ledPinML)/2;
// 実行を制御するフラッグ
// flag: 0->ゲーム終了, 1->ゲーム未終了
// rFlag: 0->右のボタンが押下げられている, 1->押下げられていない
// lFlag: 0->左のボタンが押下げられている, 1->押下げられていない)
int flag = 1, rFlag = 1, lFlag = 1;

void setup() {
// ボタンのピンから入力を得るための初期設定
  pinMode(buttonPinR, INPUT_PULLUP);
  pinMode(buttonPinL, INPUT_PULLUP);
// ledのピンに出力するための初期設定
  for(int i=ledPinMR;i<=ledPinML;i++) pinMode(i, OUTPUT);
}

void loop() {
// もしゲームが終了している場合
  if(flag == 0) {
    for(int i=ledPinMR;i<=ledPinML;i++) digitalWrite(i, HIGH);
    delay(1000);
    for(int i=ledPinMR;i<=ledPinML;i++) digitalWrite(i, LOW);
    if(ledPinML < now)digitalWrite(ledPinML, HIGH);
    if(now < ledPinMR)digitalWrite(ledPinMR, HIGH);
    delay(1000);
    return;
  }
// もしボタンが押下げられていない場合
  if(digitalRead(buttonPinL) == HIGH) lFlag = 1;
  if(digitalRead(buttonPinR) == HIGH) rFlag = 1;
// もしボタンが押下げられていないときにボタンが押下げられたときnowを操作しボタンのフラグを0にする
  
  if((digitalRead(buttonPinL) == LOW) && (lFlag == 1)) {
    now--;
    lFlag = 0;
  }
if((digitalRead(buttonPinR) == LOW) && (rFlag == 1)) {
    now++;
    rFlag = 0;
  }
// nowが片方に押しやられたときゲームを終了する
  if(now > ledPinML || ledPinMR > now) flag = 0;
// nowに従いledを点灯する
  for(int i=ledPinMR;i<=ledPinML;i++) {
    if(i == now) digitalWrite(i, HIGH);
    else digitalWrite(i, LOW);
  }
}

迷ったこと

最初nowを以下のようにしていたのですが、ボタンを押下げた瞬間にゲームが終了しました。

  if(digitalRead(buttonPinR) == LOW) {
    now++;
  }
  if(digitalRead(buttonPinL) == LOW) {
    now--;
  }

原因

一度の押下げでも大量のloop()が呼ばれていました。

Serial.begin(9660);

をsetup()に追加し、

Serial.print(rFlag);
Serial.print(lFlag);
Serial.print("\n");

をloop()に追加して確認を行いました。押下げされた後のnowが一瞬で片方に振り切れていることがわかりました。

対策

変数nowへの操作を行うのは押下げを検知した最初のloopだけに制限し、ボタンが元の状態に戻るまでnowへのアクセスを禁止するとうまく実行されました。
そのためにrFlag, lFlagを用意しました。

完成!

S__37445669.jpg

S__37445668.jpg

人生で初めてこういう形になるものを作りました!思いがけないエラーに悩まされましたが解決できて嬉しかったです!これからも何か作っていきたいです。皆さんの作ったゲームや面白いものがあったら紹介してください!

また注文した翌日に配達してくださった配達員さんに感謝します!

以上、ありがとうございました。:kissing_smiling_eyes::wave:

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?