如何使用Flex传感器和电位计构建愤怒小鸟的游戏控制器

描述

这一切都始于黑暗时代的一款名为“马里奥”的小游戏,从一个小家伙跳上鸭子拯救我的公主到成为一个阳刚英俊的王子在波斯漫游(波斯王子)与黑暗作斗争以拯救我的世界,我一直是玩电子游戏的忠实粉丝,我从小玩它们。但他们有时确实会感到无聊,我觉得参与其中的程度较低。今天,先进的游戏机支持虚拟游戏,并帮助我们比键盘或鼠标更好地感受游戏。

作为一名Arduino爱好者,我厌倦了使用键盘和鼠标玩名为 “愤怒的小鸟” 的著名游戏,并决定 使用Flex传感器和电位计构建自己的游戏控制器 。当柔性传感器被拉动时,弹射器上的鸟也会被拉动,您可以使用电位计设置它的发射方向。然后,当您释放柔性传感器时,鸟将被发射。我非常喜欢这样做,所以如果你打算构建非常相似的东西,那么本教程将很有帮助。本教程还将有助于 使用电位计控制鼠标光标

软件和硬件要求:

软件:

  1. Arduino IDE
  2. 处理集成开发环境
  3. 愤怒的小鸟游戏在电脑上

硬件:

  1. Arduino (任何版本)
  2. 电位计
  3. 柔性传感器
  4. 47K 欧姆电阻器
  5. 连接线
  6. 面包板

游戏控制器

背后的概念:

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   

}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分