這一切都始于黑暗時(shí)代的一款名為“馬里奧”的小游戲,從一個(gè)小家伙跳上鴨子拯救我的公主到成為一個(gè)陽剛英俊的王子在波斯漫游(波斯王子)與黑暗作斗爭(zhēng)以拯救我的世界,我一直是玩電子游戲的忠實(shí)粉絲,我從小玩它們。但他們有時(shí)確實(shí)會(huì)感到無聊,我覺得參與其中的程度較低。今天,先進(jìn)的游戲機(jī)支持虛擬游戲,并幫助我們比鍵盤或鼠標(biāo)更好地感受游戲。
作為一名Arduino愛好者,我厭倦了使用鍵盤和鼠標(biāo)玩名為 “憤怒的小鳥” 的著名游戲,并決定 使用Flex傳感器和電位計(jì)構(gòu)建自己的游戲控制器 。當(dāng)柔性傳感器被拉動(dòng)時(shí),彈射器上的鳥也會(huì)被拉動(dòng),您可以使用電位計(jì)設(shè)置它的發(fā)射方向。然后,當(dāng)您釋放柔性傳感器時(shí),鳥將被發(fā)射。我非常喜歡這樣做,所以如果你打算構(gòu)建非常相似的東西,那么本教程將很有幫助。本教程還將有助于 使用電位計(jì)控制鼠標(biāo)光標(biāo) 。
軟件和硬件要求:
軟件:
- Arduino IDE
- 處理集成開發(fā)環(huán)境
- 憤怒的小鳥游戲在電腦上
硬件:
- Arduino (任何版本)
- 電位計(jì)
- 柔性傳感器
- 47K 歐姆電阻器
- 連接線
- 面包板
背后的概念:
Arduino 板從電位計(jì)和 Flex Senor 讀取值 ,并通過正常的 Serial.write() 函數(shù)通過 USB COM 端口將它們傳輸?shù)焦P記本電腦/PC。然后,我們使用 Processing 讀取此信息,并使用 Java 中的 Robot 類控制鼠標(biāo)光標(biāo),該類受 Process IDE 支持。我們對(duì)處理 IDE 進(jìn)行了編程,當(dāng)拉動(dòng) Flex 傳感器時(shí),將單擊鼠標(biāo),并且根據(jù)拉動(dòng)的程度,鼠標(biāo)指針將沿 X 方向移動(dòng)。然后根據(jù)電位計(jì)的值,我們將在 Y 方向上移動(dòng)鼠標(biāo)光標(biāo),這樣我們就可以設(shè)置應(yīng)該發(fā)射鳥的方向。
電路圖:
使用柔性傳感器和電位計(jì)播放憤怒的小鳥的電路很簡(jiǎn)單。
我們已經(jīng)簡(jiǎn)單地將電位計(jì)和柔性傳感器連接到Arduino的模擬輸入(A0,A1)。Flex 傳感器的輸出也使用 47K 下拉電阻下拉。
您可以直接將其連接到面包板上或?qū)⑺鼈兒附拥?Perf 板上,然后將其組裝在手套或其他東西上以使其更具創(chuàng)意。我只是使用面包板進(jìn)行連接,如下所示:
Arduino 計(jì)劃:
完整的Arduino代碼在本教程結(jié)束時(shí)給出。下面解釋幾個(gè)重要的行。
我們初始化程序以使用 9600 波特率,并開始從 Flex 傳感器和電位計(jì)讀取值。眾所周知*,serial.write()* 函數(shù)一次只能發(fā)送一個(gè)字節(jié)的數(shù)據(jù)。由于一個(gè)字節(jié)是 8 位,2^8 = 256。我們將能夠發(fā)送從 0 到 256 的值。因此,我們必須將 Flex 傳感器輸出和電位計(jì)輸出的值壓縮為 0 到 256。
為此,我們使用 Arduino 中的 map() 函數(shù)。來自柔性傳感器的所有值都從 5 轉(zhuǎn)換為 100,因此當(dāng)我們彎曲傳感器時(shí),它將從 5 遞增,釋放時(shí)它將回到 5。提及鼠標(biāo)單擊,使用值 1 和 0。發(fā)送 1 時(shí)按下鼠標(biāo),發(fā)送 0 時(shí)釋放鼠標(biāo)。
if (FlexValue>=65 && FlexValue<=120) //my flex sensor varies from 65 to 120, your might be different
{
FlexValue = map (FlexValue,120,65,0,100); //based on bending convert to 0 to 100
if (FlexValue>=5) // 1 and 0 is used for mouse click so start from 5
{
Mclick=true;
Serial.write(1); //1 is sent to make mouse left click
Serial.write(FlexValue); //Flex value is the distance to move mouse in X direction
}
else
{
Mclick=false;
Serial.write(0);}
}
類似地,電位計(jì)中的值從 101 轉(zhuǎn)換為 200,通過 map( ) 函數(shù),并發(fā)送到筆記本電腦 COM 端口,通過 Serial.write() 函數(shù),如下所示。
if (potValue<=200)
{
potValue = map(potValue,0,200,101,201); //Based in turn convert to 101 to 201
Serial.write(potValue); //Pot value is the distance to move mouse in Y direction
}
程序的其余部分使用注釋進(jìn)行解釋。
在此項(xiàng)目中,我們使用處理 IDE 來讀取 COM 端口值,并根據(jù)通過 COM 端口接收的值控制鼠標(biāo)指針。這個(gè)憤怒的小鳥游戲控制器的完整處理代碼可以從以下鏈接下載:
- 此憤怒的小鳥游戲控制器的處理代碼 (右鍵單擊并“將鏈接另存為”)
Arduino程序可以在本教程的末尾找到。處理代碼已根據(jù) yoggy 在他的 GitHub 頁(yè)面上給出的代碼進(jìn)行了修改以適應(yīng)我們的目的。
來自COM端口的數(shù)據(jù)應(yīng)以與從Arduino發(fā)送的數(shù)據(jù)相同的波特率讀取。此外,使用設(shè)備管理器檢查Arduino連接的COM端口。我的Arduino連接到COM3,它是0^千^我電腦中的端口和Arduino中的波特率為9600,因此代碼如下
port = new Serial(this,Serial.list()[0],9600);
一旦我們開始閱讀這些值,我們就可以通過根據(jù)它從 Arduino 發(fā)送的值來識(shí)別它來區(qū)分它。這些值再次從 0 映射到 100,以便我們能夠根據(jù)該值控制鼠標(biāo)。
if (port.available()>0)
{
data=port.read();
println(data); //Read the data from COM port and save it in data
}
if (data>=101 && data<=201) //If the value if from 101 to 201 then it must be from Potentiometer
{
Turn = int (map (data,101,201,0,100)); //Use that value to turn the catapullt
}
if (data>=5 && data <=100) //If the value if from 5 to 100 then it must be from Flex Sensor
{ Pull = int (map(data,5,100,0,100));} //Use that value to pull the catapult
if (data == 1)
click = true; //Use that value to press the mouse button
if (data == 0)
click = false; //Use that value to release the mouse button
對(duì)數(shù)據(jù)進(jìn)行分類后,我們就可以在處理中使用機(jī)器人 Java 類控制鼠標(biāo)。命令robot.mouseMove(crntX-Pull, crntY+Turn); 可用于將鼠標(biāo)移動(dòng)到任何所需InputEvent.BUTTON1_DOWN_MASK InputEvent.BUTTON1_DOWN_MASK位置,并分別用于按下或釋放鼠標(biāo)按鈕。
if (click == false) //when Flex Sesnor is not pulled
{
crntX = (int)p.getX() ; crntY = (int)p.getY() ;
if (Pull>50)
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); //Release the mouse button
}
if (click == true) //when Flex Sesnor is pulled
{
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); //Press the mouse Button
robot.mouseMove(crntX-Pull, crntY+Turn); //Move the mouse based on the Flex and POT value
}
}
啟動(dòng)時(shí),處理 IDE 還將顯示一個(gè)小對(duì)話框,您可以在其中找到“拉動(dòng)”、“轉(zhuǎn)動(dòng)”的值和“鼠標(biāo)單擊”的狀態(tài),如下所示
加工:
要使用提供的代碼使這個(gè)憤怒的小鳥項(xiàng)目工作,請(qǐng)根據(jù)電路圖組裝您的硬件并上傳給定的 Arduino 代碼。然后記下您的Arduino連接到哪個(gè)COM端口,并在處理代碼中進(jìn)行必要的更改并啟動(dòng)處理草圖。
現(xiàn)在,只需啟動(dòng)憤怒的小鳥游戲并將光標(biāo)放在彈射器附近,然后拉動(dòng)柔性傳感器以拉動(dòng)鳥并使用電位計(jì)設(shè)置方向。設(shè)置方向后,松開柔性傳感器
EEEEWWWWWEEEEEEEEEE!!!!!!!!!!...............
你的鳥會(huì)被直接拋到空中,轟!!在小豬身上。完整的工作可以在下面給出的視頻中找到。
/*
* Angry Bird Game Controller Program
* Code by : B.Aswinth Raj
* Dated : 3-8-2017
* More details : www.circuitdigest.com
*/
void setup() {
Serial.begin(9600); //Transmit at 9600 Baud Rate
}
boolean Mclick = false;
void loop() {
int potValue = analogRead(A0); //variable to store potValue
int FlexValue = analogRead(A1); //variable to store Flex Value
// Serial.println(FlexValue);
// Serial.print("POT: ");
// Serial.println(potValue);
// Serial.print("Flex: ");
if (FlexValue>=65 && FlexValue<=115) //my flex sensor varies from 65 to 120, your might be different
{
FlexValue = map (FlexValue,120,65,0,100); //based on bending convert to 0 to 100
if (FlexValue>=5) // 1 and 0 is used for mouse click so start from 5
{
Mclick=true;
Serial.write(1); //1 is sent to make mouse left click
Serial.write(FlexValue); //Flex value is the distance to move mouse in X direction
}
else
{
Mclick=false;
Serial.write(0);}
}
else
{
Mclick=false;
Serial.write(0);}
if (potValue<=200)
{
potValue = map(potValue,0,200,101,201); //Based in turn convert to 101 to 201
Serial.write(potValue); //Pot value is the distance to move mouse in Y direction
}
delay(500); //stability delay
}
-
Arduino
+關(guān)注
關(guān)注
188文章
6471瀏覽量
187224 -
電位計(jì)
+關(guān)注
關(guān)注
0文章
253瀏覽量
16973 -
游戲控制器
+關(guān)注
關(guān)注
0文章
15瀏覽量
3019
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論