第1步:操作
這是游戲操作方式的詳細說明;如果需要的話,使用說明手冊。如果您不喜歡詳細信息,閱讀或使用手冊,請跳過此步驟。
當您第一次打開LED Pong時,LCD會告訴玩家1按下他們的按鈕選擇獲勝得分,然后玩家2按下他們的按鈕進行確認。然后,玩家1可以按其按鈕并選擇一個得分1-9進行比賽。然后,玩家2可以通過按其按鈕確認獲勝得分。
玩家1默認情況下以球開始(按鈕LED指示其轉彎方向),并且當他們按其按鈕時,游戲將開始。一旦按下,“球”將朝向玩家2。當球朝向他們時,僅允許每個玩家按下一個按鈕。您不能對該按鈕“發送垃圾郵件”。如果您過早按下按鈕,那么運氣不好,直到出現新球之前,游戲不會再按下任何按鈕。當球離開球1-2個LED時,按下接收球的球員可以按回球(第一張圖片)。
當球員獲勝時,會出現彩虹效果,并且顏色朝著獲勝者移動。除非關閉游戲,否則獲勝者將從下一場比賽的球開始。
計分板的電位器(旋鈕的奇特詞)調節球的速度。
第2步:第1部分:硬件
啊,我最喜歡的每個項目建筑部分。以下概述了以下步驟以及每個步驟所需的組件。
1。底座/LED燈條
-1米LPD8806可單獨尋址的LED燈條,我以28美元的價格從Ebay買了我的地雷-我最初購買了WS2801 LED燈條,但由于我遇到很多麻煩而將其退還可以正常工作。
-某種木板/塑料板,至少比您的LED燈條長幾英寸。我的是48英寸長的
-(2)1x4公排針。我在Ebay上花了6美元買了100個
2。記分牌
-(2)7段不管是哪種類型,只要確保它們是公共的陽極
-(2)16針DIP插座即可,它們在Ebay
-(2)74HC595移位寄存器中為5個,售價1美元。在Ebay
上為$ 3-(14)330歐姆電阻。在Ebay
上為$ 2.50為100-5k或10k電位計
3. LCD
-紅色LCD 1602 。$ 2.50在Ebay
-Arduino IIC/I2C串行接口適配器板模塊,用于Arduino 1602 LCD。$ 3在Ebay
4. Ardunio屏蔽:5v穩壓器
-LM7805 5v電壓調節器.3在Ebay
-470uf電容器上為$ 1.10在Ebay
-0.1uf盤式電容器上為$ 1.30在Ebay
上為$ 1。 -一個小散熱器
-至少(5)個1x4公型插頭
5.按鈕
-(2 )大按鈕。我自己建立了您可能會在Ebay上找到一些。
-(16)330歐姆電阻器
-(2)74HC595移位寄存器
-(2)74HC595移位寄存器。
-(16)紅色LEDs
雜項物品/工具
-烙鐵
-膠帶
-熱膠槍
-各種規格的實心絞線
-大量的穿孔板(在Ebay上檢查)
-(可選)幾根母跳線(在Ebay上為120,8美元)
-(可選)膠粘腳
總成本:?$ 50,不包括Arduino
步驟3:底座和LED燈條
除非您打算重建乒乓球游戲每次您想要使用它時,首先需要的是一個平臺,可以在上面安裝所有內容。我在車庫里四處挖,發現一塊木板長幾英尺,寬約2.5英寸。有機玻璃(或更好的Lexan)也能很好地工作。我最初將木板切成約48英寸長,但后來不得不縮短到45“,因為我必須在LED燈帶上切出一段;但是稍后再講。如果您使用木材作為平臺,并且可以使用路由器,則建議將通道向下沿中心底部的通道這樣,您可以將配線隱藏在下面,而不是隱藏在配線架的側面(不幸的是,這是我所做的事情)。
一旦平臺切成一定尺寸,您就需要以某種方式連接LED燈串。 LED燈串被包裹在橡膠屏蔽層中,該屏蔽層不會粘在木頭上,我本可以去掉橡膠,但決定在其底部貼上一條膠帶(第一個圖像),然后我找到了燈條和電路板,然后用熱膠將它們粘在一起。
我的LED燈條沒有任何電線連接到它,所以我焊接在一些針座上,我也可以連接電線。請注意:LDP8806 LED燈帶的一端是輸入,另一端是輸出。如果您將Arduino連接到輸出端,則將無法正常工作,因此,當您將其連接起來并無法正常工作時,請嘗試另一端。
如果要測試LED燈條,請運行名為“ strandtest”的示例。
步驟4:記分板
記分板顯示得分,我將球速電位計連接到右側的記分板上,盡管您可以放在任何地方。我在任何地方都找不到適用于我的7段顯示器的數據表,因此我必須自己制作(第一張照片)。為此,我使用電壓表找到了“共陽極”的兩個引腳。然后,我使用5伏電源和330歐姆電阻來查找哪個引腳點亮哪個LED。我把所有這些信息都寫在了便簽紙上。
我繼續按照示意圖繪制左記分板(第三張圖)。記分板以菊花鏈方式連接在一起-一個移位寄存器的數據引腳饋入另一個移位寄存器的引腳9。這使得兩個移位寄存器在Arduino上僅使用3針而不是6針。
請確保將電位計放在左側或右側記分板上。另外,在添加電源線和信號線時,請確保使用的電線數量超出您的預期,尤其是當您希望在完成后能夠卸下Arduino時。
如果要測試您的記分板,將其復制并粘貼到Arduino中。
步驟5:LCD
將LCD焊接到Arduino接口板上應該非常簡單,但是最終卻花費了我很多時間和沮喪。如您在第一張圖片中所看到的,我將接口板向后焊接!不要那樣做!之所以令人迷惑,是因為將電路板向后焊接時背光源可以工作,這可能最初使您認為它工作正常。不是。我不得不花幾個小時拆下液晶顯示器,然后重新安裝它(第二張和第三張圖片)。故事的寓意:在焊接之前,請三遍檢查方向。另外,可變電阻器可調節屏幕的對比度。如果一切都正確連接,但LCD上沒有任何顯示,請向任一方向轉動幾圈。
如果要測試LCD,請將SDA連接到A4,將SCL連接到A5,然后運行示例“ HelloWorld” 。
第6步:Arduino Shield
因為有很多焊接,所以要花些時間,并且要在各部分之間稍作休息。
接線如下:
-記分板移位寄存器:
-引腳5的數據
-鎖存至引腳6
-時鐘至引腳7
-播放器1移位寄存器:
-數據至引腳8
-時鐘至引腳9
-鎖存到引腳10
-播放器2移位寄存器:
-數據存到引腳11
-時鐘存到引腳12
-鎖存到引腳13
-播放器1按鈕:
-插針1
-播放器2按鈕:
-插針2
-速度廣告調整電位器:
-引腳A2
-LED燈帶:
-數據連接到引腳3
-時鐘連接到引腳4
-LCD
-SDA到引腳A4
-SCL到引腳A5
在我的Arduino Uno上,引腳7和引腳8之間的間隙對于我的perfboard來說是寬的我必須使用兩塊穿孔板,然后在正確的間距上將它們焊接在一起(第一張圖)。然后,我焊接在1x4接頭上。如果可以的話,請購買長的排針,因為很高興在下面有額外的間隙(我使用了較短的排針)(第二張圖片)。確保您至少焊接了足夠的插頭,以覆蓋數字引腳1-13,模擬引腳2、4和5,VIN和至少一個接地。
接下來,我焊接在母電源插座上,然后再焊接記分牌,LED燈條以及將連接到每個按鈕和LED移位寄存器的電線。
最初,我不確定LED Pong將使用多少功率,因此我制作了一個5v電壓轉換器,可以處理幾個安培。經過測試,我發現該電路在播放時汲取約150mA的電流,然后在有人獲勝時跳至500mA。 L7805電壓轉換器可以處理高達1安培的電流,因此您可能不喜歡使用它。只需確保在上面放了一個散熱器即可!如果您想做我所做的事情,請遵循原理圖(第五張圖片)。數據表:TIP31C,L7805
我還應該將晶體管放在右邊,因為它就在Arduino USB插孔的頂部(第六張圖片)。
當我完成電壓調節器電路時,我插入了一個9v電源,并用電壓表進行了測試,它提供了5.14伏的涼爽電壓。
最后,我將電源線焊接到了各自的位置。您需要將gnd接頭連接到地,將vin連接到晶體管的5v輸出。當LED Pong打開時,這將為Arduino提供電源。請勿使用Arduino板上的5v電源引腳執行任何操作。
到目前為止,若要測試電路,請將此代碼復制并粘貼到Arduino。
如果打開時一切正常,請在鍵盤上輕拍一下。返回去喝啤酒(如果您已經老了)。所有困難的事情都在你身后。
步驟7:將所有組件安裝到板上
現在您可以將所有內容連接在一起了!在掛載所有內容時,您有幾種選擇。您可以永久安裝所有內容,也可以按照我所做的去做,以使所有內容都可以刪除。我已經在木頭上標記了中點,所以我剛剛找到了Arduino的中間并將它們對齊。我想確保可以輕松地從項目中刪除Arduino,所以我用了兩個螺絲將其固定在適當的位置(第一張和第二張圖片)。現在,您將添加更多電線。如果看第五張圖片,您將添加為記分板供電的兩條棕色電線。一個接地,另一個連接至穩壓器輸出的+5伏。您還將添加將兩個記分牌連接在一起的接地線和+ 5v導線(第五張圖片)。接下來,我用在車庫中發現的幾個非常小直徑的釘子將記分牌固定在木頭上(第三張圖片) );圖釘也可以。我決定將記分板與Arduino隔開2英寸,然后用小扳手將其固定在錘子上(第四張圖)。我建議您在打釘子時在記分板上貼些泡沫,以免意外損壞/劃傷。
現在用于LCD。您還需要將SDA從串行接口連接到A4,將SCL從A5連接到A5。然后,將地線接地,并將5V電壓連接到晶體管的輸出。然后,您可以根據需要安裝LCD。我只是將其熱粘到Arduino屏蔽層上(第六和第七張圖片)。
最初,我將電線熱粘到板上(第九張圖片),但是看起來有點凌亂,最終掉下來了。因此,我最終使用了訂書機中的訂書釘,并小心地將它們砸了(第十張照片)。
從第11張圖片可以看出,仍然可以輕松地移除Arduino。
步驟8:按鈕
我希望按鈕是唯一的,所以我自己制作了按鈕。商店/互聯網購買的按鈕可能同樣有效,并且安裝時間會少很多。如果要跟隨我的腳步,前九張圖片顯示了如何使用鍵盤構建自己的按鈕。
一旦有了按鈕,我就必須弄清楚如何布置LED。我最終進行了箭頭設計(第十張圖片),并按照示意圖(第十一張圖片)進行了構建。如果您提出更好的LED布置,請告訴我!您還可以將兩個或多個移位寄存器菊花鏈在一起(例如我們對記分板所做的操作),這將允許您使用16個以上的LED。
完成后,每一側都應類似于圖十二,然后固定導線并粘上所有東西后,請完成13張圖片。
到此結束了Instructable的硬件部分,您的pong游戲現在應該可以正常使用了!只需復制并粘貼LED Pong代碼,然后將其上傳到Arduino(確保已安裝庫!)。您只需要將代碼上傳到Arduino一次,從那時起,只要打開Arduino,游戲就可以正常工作。
在這一點上,我發現我的晶體管變得有點發燙,所以我放了一個上面有一個小的散熱器(幾乎不熱)。您可以在“簡介”視頻中看到附帶的散熱器。
步驟9:第2部分:軟件
需要一臺裝有Arduino的計算機,以及這部分的Arduino板。我正在運行Arduino 1.0.2。
如果尚未安裝庫,請立即執行!要安裝庫,請按照此處的說明進行操作:http://arduino.cc/en/Guide/Libraries
您需要下載和安裝的庫是:
LPD8806
LiquidCrystal_I2C
以下步驟提供了有關代碼工作方式的詳細說明。如果您不關心它的工作原理,只需將上一步中的代碼復制并粘貼到Arduino中并運行它。就像我之前說過的,我自學了如何做更多的高級編碼,所以我的方法可能不是最好的方法。如果您知道編寫函數的更好方法,請隨時在注釋部分告訴我!
專業提示:您可以將每個函數添加到Arduino的單獨選項卡中(第一張圖片)。這將使您輕松訪問每個功能,并有助于調試。要創建一個新選項卡,請單擊“串行監視器”按鈕下方的向下箭頭,然后單擊“新建選項卡”,或按ctrl + shift + N。
我將每個功能劃分為一個步驟并發布了代碼在該步驟的最后,概述如下:
1.初始化/設置
2。主要功能
3。色輪功能
4。 chaseForward和chaseReverse
5。 player1Celebrate和player2Celebrate
6。 rainbowCyclePlayer1和RainbowCyclePlayer2
7。 selectScore結果8。 shift1和shift2
步驟10:初始化/設置
大部分代碼是很容易解釋的,但是,我將澄清一些內容。
這兩行是十六進制數字,在記分板上顯示每個數字(0-9)。
字節digitOne [10] = {0x6F,0x09、0x73、0x3B,0x1D,0x3E,0x7C,0x0B,0x7F,0x1F};//播放器1的數字
字節digitTwo [10] = {0x6F,0x09、0x73、0x3B,0x1D,0x3E,0x7C,0x0B,0x7F,0x1F};//播放2個數字
例如,如果要在記分板上顯示數字“ 3”,則將0x3B發送到移位寄存器。這將使移位寄存器引腳1、3、4、5和15 LOW 變為低電平,從而完成電路并使連接到這些引腳的LED點亮。如果在構建記分牌時遵循原理圖,則這些LED的位置將為‘3’。
此代碼定義LED燈串中有多少個LED。
int nLEDs = 30;//LED的數量
如果根本不更改LED字符串,則將在此處使用數字32,而不是30。我的字符串中只有30個LED,因為我有刪掉兩個(詳細信息請參見“故障排除”部分。)
此代碼將兩個記分板都設置為顯示數字“ 0”。
//將記分板設置為“ 0”
digitalWrite(latch1,LOW);
shiftOut(data1,clock1,MSBFIRST,?digitOne [0]);
shiftOut(data1,clock1,MSBFIRST,?digitTwo [0]);
digitalWrite(latch1,HIGH);
我們將閂鎖銷 LOW 寫入,然后發送信息,然后將閂鎖銷 HIGH 寫入,以使其“鎖定”數字,直到我們希望它們更改之前,它們才會更改。 digitOne對應于玩家1的計分板,digitTwo對應于玩家2的計分板。我們發送數字“ 0”,它是十六進制值0x6F,并保持引腳1、2、3、5、6和15 LOW -使這些LED點亮。
接下來,我做了
//關閉播放器1和播放器2的發光二極管
digitalWrite(latch2,LOW) ;
shiftOut(data2,clock2,MSBFIRST,255);
digitalWrite(latch2,HIGH);
digitalWrite(latch3,LOW);
shiftOut(data3,clock3,MSBFIRST,255);
digitalWrite(latch3,HIGH);
這確實類似于初始化記分板移位寄存器,但有一個例外。我使用字節值而不是十六進制。字節是介于0到255之間的任何值。與移位寄存器通信時,255會將所有引腳高(關閉LED)關閉,將0使其全部 LOW (
然后我們將兩個按鈕都聲明為輸入。
pinMode(player1,INPUT);
digitalWrite(player1,HIGH);
pinMode( player2,INPUT);
digitalWrite(player2,HIGH);
我們之所以將它們寫得很高是因為Arduino Uno內置了上拉電阻。通過將引腳寫為高電平,我們不需要將任何電阻焊接到按鈕上。
最后,我們調用selecScore函數,如步驟16所述。
score = selectScore( );//設置獲勝分數
此處的初始化/設置代碼
步驟11:主要功能
這是一遍又一遍地循環的主要功能。
我們要做的第一件事是用分數更新每個記分板。在游戲開始時它們都將設置為零,因為在設置中將player1Points和player2Points初始化為零。
digitalWrite(latch1,LOW);
shiftOut(數據1,時鐘1,MSBFIRST,?digitOne [player1Points]);
shiftOut(數據1,時鐘1,MSBFIRST,?digitTwo [player2Points]);
digitalWrite(latch1,HIGH);
如果任一位玩家獲勝,則慶祝功能稱為
if(player1Points》 =得分)
{
player1Celebrate();
}
if(player2Points》 = score)
{
player2Celebrate();
}
下一部分將映射電位計的值并將電位器的位置存儲為一個值。然后,該值將成為每個LED之間的時間量。例如,如果val為100,則程序將點亮LED燈條中的LED,然后等待100毫秒,然后點亮下一個LED。
val = map(val,0,1023,1,100);
下一部分確定是將LED朝玩家1還是玩家2發送。 div》
if(flag ==‘F’)
{
chaseForward(strip.Color(127,0,0),val);
}
if(flag ==‘R’)
{
chaseReverse(strip.Color(0,0,127),val);
}
最后,程序確定當“球”駛向另一位球員時是否及時按下他們的按鈕。
int AbuttonState = digitalRead(player1);
if(AbuttonState ==低&&轉==‘A’&&標志!=‘F’&&標志!=‘R’)
{
i = 0;
//關閉播放器1的LEDs
digitalWrite(latch2,LOW);
shiftOut(data2,clock2,MSBFIRST,255);
digitalWrite(latch2,HIGH);
chaseForward(strip.Color(0,127,0) ),val);//白色
}
int BbuttonState = digitalRead(player2);
if(BbuttonState == LOW && turn ==‘B’&& flag !=‘F’&& flag!=‘R’)
{
i = 30;
//關閉播放器2的LEDs
digitalWrite(latch3,LOW);
shiftOut(data3,clock3,MSBFIRST,255);
digitalWrite(latch3,HIGH);
chaseReverse(strip.Color(127,0,127),val);//紅色
}
此處主要功能代碼
步驟12:色輪功能
功能確定要發送哪種顏色的“球”。我從LPD8806庫中提供的strandtest示例復制了該函數。如果要更改球的顏色,則可以修改此代碼。
uint32_t Wheel(uint16_t WheelPos)
{
字節r,g,b;
開關(WheelPos/128)
{
case 0:
r = 127-WheelPos%128;//紅色降低
g = WheelPos%128;//綠色向上
b = 0;//藍色關閉
斷開;
情況1:
g = 127-WheelPos%128;//綠色向下
b = WheelPos%128;//藍色向上
r = 0;//關閉紅色
中斷;
情況2:
b = 127-WheelPos%128;//blue down
r = WheelPos%128;//紅色
g = 0;//綠色關閉
中斷;
}
return(strip.Color(r,g,b));
}
色輪功能代碼此處
步驟13:ChaseForward和ChaseReverse
chaseForward和chaseReverse函數基本上相同,除了在chaseForward中,球是朝著玩家2前進,對于chaseReverse,球朝著玩家1前進。下面是chaseForward的示例。首先,程序檢查是否按下了將球返回玩家1的按鈕。如果在代碼循環30次之前按下它,則作弊將變為“ true”。這樣一來,每側只能按一次按鈕。
每次功能循環時,功能條中的下一個LED點亮“等待”毫秒。 “ wait”是電位計設置的值。
如果按下按鈕,并且“ ball”是從字符串末尾開始的兩個或更少的LED,并且尚未按下按鈕,則該球將變為發送回玩家1。如果在“ i”為28之前按了該按鈕,或者如果從未按過該按鈕,則玩家2將失去一個點。
for(i; i 《30; i ++)
{
if(digitalRead(player2)== LOW)
{
作弊=‘Y’;
}
strip.setPixelColor(i,c);//將新像素設置為“打開”
strip.show();//刷新LED狀態
strip.setPixelColor(i,0);//擦除像素,但不刷新!
delay(wait);
if(i》 27 && cheat!=‘Y’)
{
int BbuttonState = digitalRead(player2);
if(BbuttonState == LOW)
{
turn =‘B’;
標志=‘R’;
return;
}
}
}
如果玩家2丟分,則將一個點添加到player1Points,并且更新后的分數顯示在記分板上。
player1Points ++;
digitalWrite(latch1,LOW);
shiftOut(data1,clock1,MSBFIRST,?digitOne [player1Points]);
shiftOut(data1,clock1,MSBFIRST,?digitTwo [player2Points]);
digitalWrite(latch1,HIGH);
if(player1Points lcd.print(“ PLAYER 1 SCORES!”);
strip.show();
//打開播放器1的LEDs
digitalWrite(latch2,LOW);
shiftOut(data2,clock2,MSBFIRST,0);
digitalWrite(latch2,HIGH) );
chaseForward函數在這里
chaseReverse函數在這里
步驟14: Player1Celebrate和Player2Celebrate
player1Celebrate和player2Celebrate的功能相同,只是一個功能屬于播放器1,另一個屬于播放器2(顯然)。該功能通過在LCD上顯示獲勝玩家開始。然后,調用RainbowCycle函數(在下一步中進行說明),將分數設置為零,并且記分板顯示分數(零)。
player1Celebratefunction here
player2Celebratefunction here
步驟15:RainbowCyclePlayer1和RainbowCyclePlayer2
再次,RainbowCyclePlayer1和RainbowCyclePlayer2非常相似。在這里,我僅解釋RainbowCyclePlayer1。
當其中一名玩家贏得比賽時,將調用該函數。該功能首先關閉玩家1的LED,然后我實際上使用了鏈測試示例中的相同代碼使LED以彩虹效果點亮。在RainbowCyclePlayer1中,顏色移向播放器1,在RainbowCyclePlayer2中,顏色移向播放器2。再次,“延遲(等待)”是電位計設置的毫秒數。該功能通過打開玩家1的LED結束,因為在這種情況下,玩家1贏得了比賽。
rainbowCyclePlayer1函數在此處
rainbowCyclePlayer2函數在此處
第16步:SelectScore
此功能非常簡單,只有在第一次打開電源時才調用一次。 LCD會顯示一條消息,提示您選擇獲勝分數。 LCD完成提示后,分數默認為1,然后玩家1和玩家2可以通過按下各自的按鈕選擇獲勝分數。
當玩家1按下其按鈕時,程序會將一個數字添加到buttonPushCounter和該號碼被打印到液晶顯示屏上。如果buttonPushCounter達到10,它將重新設置為1。如果要使其達到一個較高的分數,則可以選擇比9高的分數。您可以在此處更改該分數。
當玩家2按下其按鈕時,它將確認獲勝分數,并將buttonPushCounter設置的任何數字返回,并隨后成為獲勝得分。
selectScore函數在此處
步驟17:Shift1和Shift2
好吧,布朗尼指出了任何可以解決這個問題的人。..
因為我們使用移位寄存器來控制播放器1和播放器2的LED,所以我們可以打開和關閉不同的引腳。在將LED焊接到移位寄存器之前,我將它們連接在面包板上,并弄清楚了在移位某些數字時打開了哪些引腳。我想出了第一張圖中顯示的數字列表。如果按照我的示意圖進行操作,移出127點亮尾部末端的LED,191點亮尾部第二個LED,199點亮接下來的三個LED,249點亮接下來的兩個LED,以及254點亮通過依次移出這些數字,它使箭頭看起來像跑道/發射臺,指向球的前進方向;這非常酷。但是,移出每組LED之間需要某種延遲,并且眾所周知,延遲功能會停止程序。這很糟糕,因為它使得無論誰轉動它都發出LED,有時在程序讀取按鈕按下之前必須多次按下按鈕。
我花了一些時間研究計時器中斷,但并沒有感覺就像花了幾個小時來試驗它們,所以我暫時將項目的這一部分擱置了。如果有人想弄清楚這個問題,或者至少要在注釋部分提供一些想法,那將很酷。
這是該功能的基礎
第18步:最終注釋
責任編輯:wv
-
led
+關注
關注
242文章
23780瀏覽量
672238
發布評論請先 登錄
奧拓電子LED屏幕:讓虛擬制作走進生活的每個角落
松下影像制作方案分享會成功舉辦

DLPC3479 GUI上面的Edit Firmware制作中有幾個疑問求解
開源項目!手把手教你制作一個互動式LED墻壁時鐘!
松下MPS媒體制作平臺概述

HDI板盲孔制作常見缺陷及解決
AIGC在視頻內容制作中的應用前景

光刻掩膜版制作流程
AI+XR打造內容制作新范式 隨幻科技全新虛擬制作方案首秀BIRTV2024

評論