這一切都始于黑暗時代的一款名為“馬里奧”的小游戲,從一個小家伙跳上鴨子拯救我的公主到成為一個陽剛英俊的王子在波斯漫游(波斯王子)與黑暗作斗爭以拯救我的世界,我一直是玩電子游戲的忠實粉絲,我從小玩它們。但他們有時確實會感到無聊,我覺得參與其中的程度較低。今天,先進的游戲機支持虛擬游戲,并幫助我們比鍵盤或鼠標更好地感受游戲。
作為一名Arduino愛好者,我厭倦了使用鍵盤和鼠標玩名為 “憤怒的小鳥” 的著名游戲,并決定 使用Flex傳感器和電位計構建自己的游戲控制器 。當柔性傳感器被拉動時,彈射器上的鳥也會被拉動,您可以使用電位計設置它的發射方向。然后,當您釋放柔性傳感器時,鳥將被發射。我非常喜歡這樣做,所以如果你打算構建非常相似的東西,那么本教程將很有幫助。本教程還將有助于 使用電位計控制鼠標光標 。
軟件和硬件要求:
軟件:
- Arduino IDE
- 處理集成開發環境
- 憤怒的小鳥游戲在電腦上
硬件:
- Arduino (任何版本)
- 電位計
- 柔性傳感器
- 47K 歐姆電阻器
- 連接線
- 面包板
背后的概念:
Arduino 板從電位計和 Flex Senor 讀取值 ,并通過正常的 Serial.write() 函數通過 USB COM 端口將它們傳輸到筆記本電腦/PC。然后,我們使用 Processing 讀取此信息,并使用 Java 中的 Robot 類控制鼠標光標,該類受 Process IDE 支持。我們對處理 IDE 進行了編程,當拉動 Flex 傳感器時,將單擊鼠標,并且根據拉動的程度,鼠標指針將沿 X 方向移動。然后根據電位計的值,我們將在 Y 方向上移動鼠標光標,這樣我們就可以設置應該發射鳥的方向。
電路圖:
使用柔性傳感器和電位計播放憤怒的小鳥的電路很簡單。
我們已經簡單地將電位計和柔性傳感器連接到Arduino的模擬輸入(A0,A1)。Flex 傳感器的輸出也使用 47K 下拉電阻下拉。
您可以直接將其連接到面包板上或將它們焊接到 Perf 板上,然后將其組裝在手套或其他東西上以使其更具創意。我只是使用面包板進行連接,如下所示:
Arduino 計劃:
完整的Arduino代碼在本教程結束時給出。下面解釋幾個重要的行。
我們初始化程序以使用 9600 波特率,并開始從 Flex 傳感器和電位計讀取值。眾所周知*,serial.write()* 函數一次只能發送一個字節的數據。由于一個字節是 8 位,2^8 = 256。我們將能夠發送從 0 到 256 的值。因此,我們必須將 Flex 傳感器輸出和電位計輸出的值壓縮為 0 到 256。
為此,我們使用 Arduino 中的 map() 函數。來自柔性傳感器的所有值都從 5 轉換為 100,因此當我們彎曲傳感器時,它將從 5 遞增,釋放時它將回到 5。提及鼠標單擊,使用值 1 和 0。發送 1 時按下鼠標,發送 0 時釋放鼠標。
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);}
}
類似地,電位計中的值從 101 轉換為 200,通過 map( ) 函數,并發送到筆記本電腦 COM 端口,通過 Serial.write() 函數,如下所示。
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
}
程序的其余部分使用注釋進行解釋。
在此項目中,我們使用處理 IDE 來讀取 COM 端口值,并根據通過 COM 端口接收的值控制鼠標指針。這個憤怒的小鳥游戲控制器的完整處理代碼可以從以下鏈接下載:
- 此憤怒的小鳥游戲控制器的處理代碼 (右鍵單擊并“將鏈接另存為”)
Arduino程序可以在本教程的末尾找到。處理代碼已根據 yoggy 在他的 GitHub 頁面上給出的代碼進行了修改以適應我們的目的。
來自COM端口的數據應以與從Arduino發送的數據相同的波特率讀取。此外,使用設備管理器檢查Arduino連接的COM端口。我的Arduino連接到COM3,它是0^千^我電腦中的端口和Arduino中的波特率為9600,因此代碼如下
port = new Serial(this,Serial.list()[0],9600);
一旦我們開始閱讀這些值,我們就可以通過根據它從 Arduino 發送的值來識別它來區分它。這些值再次從 0 映射到 100,以便我們能夠根據該值控制鼠標。
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
對數據進行分類后,我們就可以在處理中使用機器人 Java 類控制鼠標。命令robot.mouseMove(crntX-Pull, crntY+Turn); 可用于將鼠標移動到任何所需InputEvent.BUTTON1_DOWN_MASK InputEvent.BUTTON1_DOWN_MASK位置,并分別用于按下或釋放鼠標按鈕。
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
}
}
啟動時,處理 IDE 還將顯示一個小對話框,您可以在其中找到“拉動”、“轉動”的值和“鼠標單擊”的狀態,如下所示
加工:
要使用提供的代碼使這個憤怒的小鳥項目工作,請根據電路圖組裝您的硬件并上傳給定的 Arduino 代碼。然后記下您的Arduino連接到哪個COM端口,并在處理代碼中進行必要的更改并啟動處理草圖。
現在,只需啟動憤怒的小鳥游戲并將光標放在彈射器附近,然后拉動柔性傳感器以拉動鳥并使用電位計設置方向。設置方向后,松開柔性傳感器
EEEEWWWWWEEEEEEEEEE!!!!!!!!!!...............
你的鳥會被直接拋到空中,轟!!在小豬身上。完整的工作可以在下面給出的視頻中找到。
/*
* 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
+關注
關注
188文章
6472瀏覽量
187337 -
電位計
+關注
關注
0文章
253瀏覽量
16983 -
游戲控制器
+關注
關注
0文章
15瀏覽量
3023
發布評論請先 登錄
相關推薦
評論