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;
}
}
}
}