Arduino打地鼠遊戲

Description

Description
作者:黃文玉
 
 
題目一:打地鼠
說明:製作一個實體的打地鼠感測設備,並與螢幕的畫面相配合,達到打地鼠的功效
自製打地鼠教具:Arduino Uno控制板、一個紙盒、6個紅外線循跡感測器、一個小型麵包板、杜邦線,如下圖

(盒子內部)
第1個紅外線循跡感測器的OUT接到Arduino的D2、第2個接到D3、第3個接到D4、第4個接到D5、第5個接到D6、第6個接到D7
6個感測器的VCC接到小麵包板上再接到Arduino的5V、6個感測器的GND接到小麵包板上再接到Arduino的GND

(盒子外部)

 

啟動Transformer 2.0

Scratch 2.0的程式 (程式的部分非常簡單)

舞台與角色

舞台程式:
貓咪程式:每一隻的貓咪程式都一樣(但要改變相對應的變數名稱及腳位名稱)
完成!測試看看,是不是比想像的還要簡單啊!
題目二:數學搶答
說明:製作一個由兩個個位數組成的加法或乘法的運算題目,並透過打地鼠的方式來選擇正確答案
自製打地鼠教具:同上
啟動Transformer 2.0
Scratch 2.0的程式 (程式的部分非常簡單)
舞台與角色
舞台程式(主要程式都寫在此)

 

第1個數與第2個數的程式一樣

符號的程式(產生加法或乘法)
變數與清單
完成!測試看看,是不是比想像的還要簡單啊!
 
 
題目三:打地鼠(離線版,利用MotoBlockly來寫程式)
說明1:這題目完全沒有用到 Scratch+Transformer,而是利用Motoblockly來寫程式再轉為Arduino語言
說明2:打地鼠教具除了延伸上面題目的紅外線循跡感測器(6個)外,也另外加入LED燈(6個),LCD顯示模組及無源蜂鳴器,讓整個教具更完善!
說明3:這是一簡易版,一次只亮一個燈
自製打地鼠教具:
  • Arduino Uno控制板 X1
  • 一個紙盒 X1
  • 紅外線循跡感測器 X6
  • LED燈 X6 (不要用小型的LED燈,不然會被燒壞)
  • LCD顯示模組 X1
  • 無源蜂鳴器 X1
  • 小型麵包板 X1
  • 18650兩節電池盒 X1
  • 18650電池 X2
  • 杜邦線,很多條

外觀:

外觀特寫

盒子內部

接線說明

因為每一個元件都有VCC(5V)及GND,利用小型麵包板來延伸這些接腳的連接

紅外線循跡感測器:編號1號接到D2、編號2號接到D3….

LED燈:編號1號接到D8、編號2號接到D9…

LCD顯示模組:SDA接到A4、SCL接到A4

無源蜂鳴器:接到A0

進入Moto Blockly (後來發現這網站是舊的!!程式有點長、檔案於附件)
註:後來發現原來我進錯網站,如果到此Moto Blockly的網站,就沒有以下沒有亂數及讀取秒的問題!!附件為改過的正確檔案!!


將上面程式轉成Arduino程式語言,並將程式複製到Arduino IDE裡面來上傳(燒錄)到板子上!

但記得要將以下幾行程式,手動改一下

randled = 111111;     ==>  randled=random(1,7);

starttime = 111111;      ==>  starttime=millis();

 finaltime = gametime – (111111 – starttime) / 1000;       ==>  finaltime = gametime – (millis() – starttime) / 1000;

randled = 111111;      ==>  randled=random(1,7);

註:此部分已修改完畢,如下

完整Arduino程式如下

#include <Wire.h>
#include <motoLiquidCrystal_I2C.h>
LiquidCrystal_I2C mylcd(0x3F,16,2);
byte  ir1;
byte  ir2;
byte  ir3;
byte  ir4;
byte  ir5;
byte  ir6;
byte  ircheck;
byte  randled;
byte  checkpoint;
int  score;
long  starttime;
int  finaltime;
int  gametime;
void music() {
  tone(A0,523,500);
}
void setup()
{
  mylcd.init();
  mylcd.backlight();
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(5, INPUT);
  pinMode(7, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(6, INPUT);
    ir1 = 0;
  ir2 = 0;
  ir3 = 0;
  ir4 = 0;
  ir5 = 0;
  ir6 = 0;
  ircheck = 0;
  randled = 0;
  checkpoint = 0;
  score = 0;
  starttime = 0;
  finaltime = 0;
  gametime = 60;
  pinMode(A0, OUTPUT);
}
void loop()
{
    if (checkpoint == 0) {
      mylcd.setCursor(0,0);
      mylcd.print(“Touch 4 and 6 “);
      mylcd.setCursor(0,1);
      mylcd.print(“Start Game….”);
      digitalWrite(11,HIGH);
      digitalWrite(13,HIGH);
      if (digitalRead(5) == 1 && digitalRead(7) == 1) {
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(11,HIGH);
        digitalWrite(12,HIGH);
        digitalWrite(13,HIGH);
        delay(1000);
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        delay(1000);
        checkpoint = 1;
        randled=random(1,7);
         starttime=millis();
        score = 0;
        mylcd.clear();
      }
    }
    if (checkpoint == 1) {
      finaltime = gametime – (millis() – starttime) / 1000;
      if (finaltime == 9) {
        mylcd.clear();
      }
      if (randled == 1) {
        digitalWrite(8,HIGH);
      }
      if (randled == 2) {
        digitalWrite(9,HIGH);
      }
      if (randled == 3) {
        digitalWrite(10,HIGH);
      }
      if (randled == 4) {
        digitalWrite(11,HIGH);
      }
      if (randled == 5) {
        digitalWrite(12,HIGH);
      }
      if (randled == 6) {
        digitalWrite(13,HIGH);
      }
      ir1 = digitalRead(2);
      ir2 = digitalRead(3);
      ir3 = digitalRead(4);
      ir4 = digitalRead(5);
      ir5 = digitalRead(6);
      ir6 = digitalRead(7);
      if (ir1 == 1) {
        ircheck = 1;
        if (randled == 1) {
          music();
          score = score + 1;
        }
      }
      if (ir2 == 1) {
        ircheck = 2;
        if (randled == 2) {
          music();
          score = score + 1;
        }
      }
      if (ir3 == 1) {
        ircheck = 3;
        if (randled == 3) {
          music();
          score = score + 1;
        }
      }
      if (ir4 == 1) {
        ircheck = 4;
        if (randled == 4) {
          music();
          score = score + 1;
        }
      }
      if (ir5 == 1) {
        ircheck = 5;
        if (randled == 5) {
          music();
          score = score + 1;
        }
      }
      if (ir6 == 1) {
        ircheck = 6;
        if (randled == 6) {
          music();
          score = score + 1;
        }
      }
      if (ircheck != 0) {
        randled=random(1,7);
        checkpoint = 1;
        ircheck = 0;
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        delay(200);
      }
      if ((ir1 == 1 && ir3 == 1) && (ir4 == 1 && ir6 == 1)) {
        checkpoint = 0;
      }
      if (finaltime <= 0) {
        checkpoint = 2;
      }
      mylcd.setCursor(0,0);
      mylcd.print(String(“Final Time: “) + String(finaltime));
      mylcd.setCursor(0,1);
      mylcd.print(String(“Score: “) + String(score));
    }
    if (checkpoint == 2) {
      mylcd.setCursor(0,0);
      mylcd.print(“GAME OVER !!!”);
      mylcd.setCursor(0,1);
      mylcd.print(String(“Score: “) + String(score));
      for (int i = 1; i <= 3; i=i+1) {
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(11,HIGH);
        digitalWrite(12,HIGH);
        digitalWrite(13,HIGH);
        delay(500);
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        delay(500);
        if (i == 3) {
          delay(5000);
          checkpoint = 0;
        }
      }
    }
}

原文連結

黃 文玉

黃 文玉

現職為高雄市左營區新上國小電腦老師。
黃 文玉

Latest posts by 黃 文玉 (see all)

    Contact

    Contact
    • Category
      No Category

    Project簡述

    Project簡述
    • 簡述
      製作一個實體的打地鼠感測設備,並與螢幕的畫面相配合,達到打地鼠的功效
    • 作者
      黃文玉

    您的姓名 〈需填寫〉

    您的電子郵件信箱 〈需填寫〉

    主旨

    您的信件內容