15打地鼠

(2016/11/23)

上週六(11/19)去「南台灣創客教育博覽會」,認識了徐爸(Mark Hsu),也看到他自製的打地鼠遊戲,覺得很不錯,今天依樣畫葫蘆來製作打地鼠遊戲...

題目一:打地鼠

  • 說明:製作一個實體的打地鼠感測設備,並與螢幕的畫面相配合,達到打地鼠的功效
  • 自製打地鼠教具: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;

}

}

}

}