步驟1:基本設計
反應游戲非常簡單。它是一個計時器,一個顯示器以及您需要多少個發光按鈕。
反應游戲接線的主要部分是兩個重復的獨立電路的集合。這兩個電路是:
1。按鈕
在Arduino官方網站上有很多關于向Arduino添加按鈕的教程。
2。獨立點亮的LED(12v)
對于LED,由于我們使用的是12v LED,我們需要與Arduino分開的外部電源,該電源只能在5v的電壓下工作。對于先前的項目(我希望在某個時候寫一個照相亭),我使用MOSFET在Raspberry PI和一些LED燈之間建立接口。我使用了關于PI和LED之間的連接的出色教程。對于這個項目,我只是簡單地重復了多次練習。
輸出顯示
游戲的第三部分是用于顯示得分的LED矩陣顯示和剩余時間。為此,我使用了4個鏈接的MAX7219矩陣顯示器。為了使它們正常工作,我使用了鏈接到驅動程序庫的鏈接教程,并提供了使用顯示器的示例。
步驟2:電路板-按鈕連接器
在構建我制作的第二個反應游戲時,編寫了指令。在制作第一個反應游戲的過程中,我犯了一些小錯誤,因此在設計上有所改進。 (理想情況下,我想為所有電子設備制作PCB,并且我打算在有更多時間的情況下這樣做)。
在其中鉆兩個6mm孔vero板位于方便的位置。如果使用相同的Vero板,則建議使用與以前相同的位置。這樣可以避免所有主要路線,包括我用于地面的大型路線。這些孔用于將板安裝到反應游戲的背面。在我最初的設計中,我沒有這樣做,最終將電路板熱粘合。除非出現問題,否則我很麻煩!
使用1.5mm的鉆頭,沿一個邊緣增加銷的尺寸。我用來將每個按鈕連接到板上的4針凹型連接器的針腳明顯更寬。由于4針連接器每個跨2個孔,因此僅每個其他孔都需要加寬。
將所有8個母連接器推到板上,并焊接到位。
步驟3:電路板-主接線
本節詳細介紹了主要組件與電路板的接線。
一個16針公插頭,它在板的底部。這是按鈕,LED和Arduino
之間的接口。由于使用了Vero板,因此很容易將單獨的電路(LED和按鈕)分為幾組。母連接器跨越8個孔。這意味著LED可以使用4個孔,按鈕可以使用4個孔,以將電路保持在相同的“垂直”狀態。因此,所有8個電路可以以8個孔的間隔重復進行。
為使布線更簡單,我傾向于依次為每個電路依次布線所有相同的零件(如圖所示)
步驟4 :板
要安裝電子設備,我購買了可以運輸的最大的板(610毫米x 1220毫米x 9毫米)。
我標記了所有按鈕的位置。
每個角按鈕距角100毫米x 100毫米。
中間的頂部和底部按鈕位于中間,但距離邊緣100毫米
中間的兩個按鈕(左側和右側)與其他按鈕的距離相等適當的一面。
在標記了按鈕的位置之后,我使用了25毫米的平頭鉆頭來鉆出按鈕的孔。
我標記了顯示器的位置
一個朋友有一個擺動的多功能工具,所以我借用他在顯示器上切出矩形孔。
由于我使用的顯示器的厚度和設計,我使用了路由器將MDF的深度去除了約5mm。
我為木板切了3個支撐腿。腿部被切割成一定角度,使木板既可以躺在桌子上,也可以直立在墻上。中腿需要一個用于穿過電纜的插槽。
在項目的第1版中,我只用了2條腿,但是當傾斜到“桌面”(平躺)位置時,會導致板子彈跳很多。
將腿粘到位。
我用黑板漆畫了木板。這主要是為了使我們能夠使用粉筆在板上畫廣告,并在按鈕上寫下不同的游戲名稱。
最后,我將兩個螺栓熱粘合到電路板上(電路板頂部附近),以通過先前在PCB中鉆出的2個孔安裝電子設備。我還將一圈膠水熱粘在螺栓上(現在在螺栓的上側),以最大程度地減少短路的風險。
步驟5:接線并組裝
為每個按鈕切斷適當長度的電纜。這些電纜的長度會因面板/按鈕的距離而異。
在一端,將剝開的電線擰入連接塊中。對于每個連接塊,將所有4根電線保持在相同的順序,因為這將簡化以后的接線,也使解決任何問題變得更加容易。我使用的順序是:
紅色-LED 12v
黑色-LED接地
黃色-切換到引腳
灰色-切換5v
在另一端,我壓接了連接器以保持連接的美觀和整潔。我確實沒用完連接器,所以不是我的所有連接器都做完了
所有連接器都連接好后,按如下所示組裝按鈕。我的LED沒有標記,因此按正確的方向進行操作會引起反復試驗,但這要等到代碼完成后才能實現
我的按鈕背面有兩小塊塑料在板上時停止旋轉按鈕。這就要求在每個按鈕的板子前面鉆兩個小孔。我發現最簡單的方法是將按鈕放入并旋轉45度。取出按鈕后,可以看到銷釘畫的兩條線。用一個3mm的小鉆頭在每條線的一端鉆孔。確保您在每條線的同一端都進行了鉆孔(例如,兩行的順時針方向!)
步驟6:接線Arduino
以下說明用于連接Arduino MEGA。
需要將16針公對母帶狀跨接電纜從PCB上的16針接頭連接到Arduino上的數字數據針,如圖所示。
兩個引腳從Arduino連接到PCB。 5v轉到具有紅線的PCB上的小電路。接地引腳從Arduino到PCB,
顯示器的接線方式如接線圖所示。
最后將LED的12v線連接到母插孔連接器上。
顯示器
顯示器已配對并放入孔(確保正確放置)。我使用膠帶將顯示屏固定在板上。
我使用膠帶并且不將顯示屏永久固定在原位的原因是我希望能夠與玩家站在一塊墻,或平躺在桌子上。這就是為什么后面的支桿被切成一定角度的原因。但是,這兩個位置都需要切換顯示,以便每次都能正確顯示。因此,通過使用膠帶方法可以輕松更改它們。
第7步:對Arduino進行編碼
我不會在此提供大量教程Arduino編程,因為有一些很棒的教程,但是我將逐步介紹我的代碼,并提供一般概述。我確信我可以改進代碼,并添加許多其他游戲。
該項目需要HCMAX7219庫。可能有多個版本,但是我使用了Hobby Components Blog引用的版本。這就是我建議從此處獲取矩陣顯示的原因,因為使用它們的工作似乎很厚道而不捐贈!
下載后,編輯HCMAX7219.h文件并將以下行更改為4:
(第31行)
#define NUMBEROFDRIVERS 4
此值確定以菊花鏈方式將多少個LED矩陣顯示器鏈接在一起。對于單人游戲,我們使用4;對于兩人游戲,我們使用8。
附加到Instructable是我的代碼。
該代碼包含兩個數組,一個用于LED,一個用于按鈕:
const int LED[8] = { 2, 4, 6, 8, 22, 24, 26, 28 };
const int BUTTON[8] = { 3, 5, 7, 9, 23, 25, 27, 29 };
通過使用數組,可以索引特定的按鈕,然后返回
該程序包括以下主要部分:
設置-在Arduino通電時運行一次以設置游戲
循環-持續運行
ScreenSaver-隨機點亮按鈕,直到按下按鈕。程序中有3個屏幕保護程序,它們是隨機選擇的
CountDown-按下按鈕時,請進行短暫的倒計時,并越來越快地閃爍燈光,以便播放器準備開始
PlayGame-玩實際游戲
設置
如果設置了DEBUG,它將打開串行端口。在設置了DEBUG的情況下運行時,讀取按鈕會有很大的延遲,因此在正確運行游戲時應關閉DEBUG
正確設置所有輸入和輸出引腳
/*
Set up the game
*/
void setup() {
// Set up the seed
if (DEBUG)
Serial.begin(9600);
// Set up the pins
for (int i = 0; i 《 NUMBER_BUTTONS; i++)
{
pinMode(LED[i], OUTPUT);
pinMode(BUTTON[i], INPUT);
}
}
循環
主循環啟動“屏幕保護程序”,等待按鈕按下
顯示閃爍的倒計時在開始播放
玩游戲之前
/*
The main loop
*/
void loop()
{
Debug(“DEBUG ON - ”, 0);
// Run the screen saver
ScreenSaver();
// Countdown to start
CountDown();
// Play the game
PlayGame();
}
屏幕保護程序
“屏幕保護程序”只是閃爍按鈕在不同的模式。這對于調試電子設備以及“宣傳”反應游戲正在運行并準備就緒可發揮作用。我創建了3種不同的屏幕保護程序,從簡單地隨機顯示燈光,建立和分解所有燈光,以及以“反彈”的不同線條顯示燈光。每個屏幕保護程序都有其自身的功能,可以在等待按下按鈕的同時打開和關閉相應的燈。因為我們有8個按鈕,所以每個按鈕對應一個字節中的一位。這使SetLEDs函數可以使用按位操作來打開和關閉燈。
“構建和行”屏幕保護程序使用包含要顯示的字節模式的查找表。隨機屏幕保護程序僅選擇一個介于1和255之間的b =數字,并顯示與該數字相對應的燈光。
/*
Randomly does a screen saver
*/
void ScreenSaver()
{
int screenSaver = random(3);
bool response = false;
while (!response)
{
switch(screenSaver)
{
case 0:
Debug(“Screen saver random: ”, screenSaver);
response = ScreenSaverRandom();
break;
case 1:
Debug(“Screen saver build up: ”, screenSaver);
response = ScreenSaverBuildUp();
break;
case 2:
Debug(“Screen saver lines: ”, screenSaver);
response = ScreenSaverLines();
break;
default:
Debug(“Screen saver default: ”, screenSaver);
response = ScreenSaverRandom();
}
}
}
設置LED
以下兩個功能用于設置LED的開和關(取決于調用它們的要求)。
SetLED寫入特定的引腳,將引腳設置為HIGH或LOW。
SetLEDs使用字節模式來設置多個LED的開和關。
/*
Set a button
*/
void SetLED (int button, int led)
{
if (button != HIGH)
digitalWrite(led, LOW);
else
digitalWrite(led, HIGH);
}
/*
Set the LED pattern using bits
0000 0001 - LED 01
0000 0010 - LED 02
0000 0100 - LED 03
0000 1000 - LED 04
0001 0000 - LED 05
0010 0000 - LED 06
0100 0000 - LED 07
1000 0000 - LED 08
*/
void SetLEDs (int pattern)
{
Debug(“SetLEDs: ”, pattern);
int bitPattern = 0x01;
for(int i=0;i if ((pattern & bitPattern) != 0)
SetLED(HIGH, LED[i]);
else
SetLED(LOW, LED[i]);
bitPattern = bitPattern 《《 1;
}
}
檢查是否按下了按鈕
如果按下了任何按鈕,則以下函數返回true,
/*
Check to see if any button is pressed
*/
bool CheckButtons()
{
for (int i=0; i《 NUMBER_BUTTONS; i++)
{
if(digitalRead(BUTTON[i]) 》 0)
{
Debug(“CheckButtons() - pressed: ”, i);
return true;
}
} Debug(“CheckButtons() - NOT PRESSED - ”, -1);
return false;
}
玩游戲
此功能是主要的單人游戲。它僅循環運行31秒,即可更新時間,打開單個LED并等待按下相應的按鈕。按下適當的按鈕后,它會增加分數,隨機選擇其他按鈕并重復。
游戲實際上持續了31秒,但使用30秒時,您的感覺是您獲得了29秒。對于31秒的游戲,計時器顯示30秒,然后等待一秒鐘遞減。當達到0時,游戲停止。如果使用30秒計時器,則游戲將顯示30秒,然后立即更改為29秒。看來您還沒用完30秒(盡管可以)。我發現,比讓用戶認為自己在被騙更值得多花一秒鐘!
時間一到,它會顯示玩家得分10秒,并在適當的時候更新高分并返回到屏幕保護程序(顯示游戲的最高得分)。
/*
Play the game
*/
void PlayGame()
{
unsigned long endTime = millis() + 31000;
int score = 0;
Debug(“endTime: ”, endTime);
Debug(“millis(): ”, millis()); long randButton = random(8);
while (millis() 《 endTime)
{
// Set the button to press as lit
SetLED(HIGH, LED[randButton]);
UpdateDisplay((endTime - millis())/1000, score);
// Check to see if the button was pressed
if(digitalRead(BUTTON[randButton]))
{
score ++;
// Turn off the button
SetLED(LOW, LED[randButton]);
// Get the new button and check it has changed
int newButton = random(8);
while(newButton == randButton)
{
newButton = random(8);
}
// Values differ, so continue
randButton = newButton;
}
}
// Clear all the LEDs
SetLEDs(0);
// Wait 10 seconds to show the score
delay(10000);
// If a new high score, set it
if (score 》 highScore)
highScore = score;
}
更新顯示內容
此功能可在游戲過程中更新顯示內容。該函數將時間和分數轉換為字符串,在任何1個字符值的前面加上“ 0”以將其填充。然后將緩沖區發送到HCMAX7219庫以打印值,然后刷新顯示。
高分函數的工作非常相似,但顯示值HI和高分。
void UpdateDisplay(unsigned long time, int score)
{
// Update the time, make sure it is 2 digits
String timeStr = String(time);
if(timeStr.length() 《 2)
timeStr = “0” + timeStr;
// Add the score which must be 2 digits
String scoreStr = String(score);
if(scoreStr.length() 《 2)
scoreStr = “0” + scoreStr;
// Combine the string
String numberStr = timeStr + scoreStr;
char charBuf[5];
numberStr.toCharArray(charBuf, 5);
// Display the string
HCMAX7219.printMatrix(charBuf,32);
HCMAX7219.Refresh();
}
2人游戲的改進
我對2人游戲進行了一些改進,應將其移回到單人游戲。其中包括:
高分存儲在EEPROM中,以便在關閉游戲時保存高分。首次打開游戲時,已修改設置以查找被按下的按鈕7。如果在啟動時按下按鈕7,則會將高分重置為0。
如果未按下任何按鈕或按下的按鈕的值,則CheckButtons函數已更改為返回-1。這樣,主菜單就可以檢查返回的值并選擇要在主循環中玩的其他游戲。
步驟8:可選改進
隨著我在原始項目上的進展,我正在不斷改進,更新和完善自己的工作。
用于2個玩家游戲的第二個板子
最初,我只是在看一個玩家反應游戲,但在進行游戲測試時,提出了其他可以實施的想法。第一個是兩個玩家選項。通過擁有第二塊棋盤,可以對大量其他游戲進行編碼。通過使用Arduino Mega,可以在一個處理器上運行兩個板。
提高游戲類型的數量
有很多游戲類型可用。大多數是主題的變體
反應游戲-類似于“‘鼠”。如果它點亮,請按按鈕,得到一個指示,重復30秒。
反應減游戲-與游戲#1相同,但是每次按錯都會輸掉一個點。不過,您只能返回零(顯示的大小不足以容納負數)。
多個按鈕反應游戲-與#1類似,但多個按鈕會亮起,并且必須先清除所有按鈕,然后才能顯示一組新的隨機按鈕。
西蒙(Simon)說-盡管我所有的按鈕都是單一顏色,但可以按給定順序點亮燈光并讓玩家重復給定圖案
將顯示添加到按鈕中
如果可以將矩陣顯示添加到每個按鈕中,并在中間添加較大的矩陣顯示,則可以提出簡單的問題,并選擇多項答案。即使每個按鈕上都沒有顯示,您也可以給每個按鈕編號,然后問一些簡單的數學問題。
責任編輯:wv
-
led
+關注
關注
242文章
23866瀏覽量
674866 -
Arduino
+關注
關注
190文章
6499瀏覽量
192456
發布評論請先 登錄
【VisionFive 2單板計算機試用體驗】VisionFive 2一個霸氣的游戲機
超150款游戲現已支持NVIDIA Reflex
鴻蒙5開發寶藏案例分享---一多開發實例(游戲)
游戲手柄振動馬達:沉浸式游戲體驗的核心
使用ADHV4702創建一個高壓精密恒流源,如何優化?
流動化學和微反應技術特點1
電位對中和反應的影響
電荷守恒定律在化學反應中的作用
行業首個芯片級游戲技術,OPPO「風馳游戲內核」正式亮相一加游戲大會

評論