(2016/11/26)
此作品自「阿玉Transformer+Scratch研究區」的「15打地鼠」延伸過來
題目三:打地鼠(離線版,利用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接到A5
無源蜂鳴器:接到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;
}
}
}
}
註:教學中的發現
由於會用到14個GND孔,所以教學時先讓學生拉出三條接Arduino板的GND到小麵包板的三排上,再從其中一路再拉一條線到另一排上,所以一共有4排的GND孔洞,共15個空洞可用!
蘇國源老師推薦使用擴充板