如何使用游戏控制器和Arduino控制机器人

Arduino和类似的兼容板是世界各地DIY修补匠的首选设备之一。无论您是刚开始使用Arduino的初学者,还是已经开始使用它们的人,他们都为无数很棒的项目提供了平台。

今天,我们将探索一种创新的方式使用处理和Xbox360控制器来控制伺服器。如果您已经很精通游戏开发,那么您可能会对我们的使用Unity的Custom Game Controller教程感兴趣。

如果这是您第一次尝试Arduino摆弄,则本教程将假设您具有一点先验知识,您可能会在这里找到我们的Arduino指南。同样,如果您是第一次使用Java,可能会有些混乱。虽然Processing使用该平台的简化版本,但这些Java概念和技巧可能仍会有所帮助。

您需要的内容

  • 1 x Arduino。我们今天使用的是UNO。
  • 1个业余伺服器。一切适用于Arduino引脚的东西。
  • 1个有线Xbox360控制器。尽管从技术上讲,这几乎可以与任何控制器一起使用。
  • 多条连接线。
  • 除了这些之外,您还需要从各自的网站下载Processing和Arduino IDE。

    准备Arduino

    首先,我们需要附加伺服器。接线颜色在这里可能会有所不同,但一般来说,红色引脚会连接到 5v 引脚,并且棕色黑色连接到 GND 引脚。数据线通常为黄色橙色,连接到 pin 10

    检查接线并连接Arduino到计算机。打开Arduino IDE。

    打开位于文件>示例> Firmata> StandardFirmata 的StandardFirmata草图。此草图设置了用于通过串行端口进行外部控制的电路板,与我们在使用Python控制Arduino的文章中使用的草图相同。将草图上传到板上。

    如果上传失败,请在工具菜单中检查您是否选择了正确的板和端口详细信息。

    我们的Arduino准备就绪!

    设置处理程序

    打开处理程序,您将得到一个空白的草图。在这里做任何事情之前,我们将需要安装一些库。转到素描菜单,然后选择导入库>添加库。这将打开 Contribution Manager ,对于那里的所有Arduino用户来说都很熟悉。

    我们需要安装三个库才能使此工作正常进行。首先是 Game Control Plus 库。这就是允许我们将游戏控制器与处理一起使用的原因。使用搜索窗口找到它,然后单击右下角的安装。 Game Control Plus需要为其配置工具安装另一个库,所以现在就开始获取它。搜索 G4P 库并安装它。

    最后,我们需要 Arduino(firmata)库。您猜对了,进行搜索,然后单击安装。安装完这些东西之后,我们就可以开始测试一切正常。我们今天正在使用Windows 10,但是可用于大多数平台(包括Raspberry Pi)进行处理。想象可能性!

    测试Arduino

    在我们开始创建自定义草图之前,我们先来测试Arduino和带有Processing的Servo。打开文件>示例,然后从 Contributed Libraries / Arduino(firmata)文件夹中选择 ArduinoServo 。我们将使用它来测试我们的伺服器,但首先我们可能需要更改几件事。

    向下滚动草图并找到以下行:

    println(Arduino.list());

    如果注释掉,删除 println(Arduino.list()); 之前的两个斜杠,然后保存草图。通过单击播放图标运行它,并注意底部的控制台。这将列出连接到您的 COM 端口的所有内容。

    在我来说,我的Arduino在COM 8上,这是此处列出的第三个端口。这很重要,因为下面一行中的代码有一个 Array ,其值决定了要使用的COM端口。

    我们需要更改它以反映我们的COM端口。对我来说,它是第三个位置,或索引号2:

    arduino = new Arduino(this, Arduino.list()[2], 57600);

    我们需要对该代码进行其他一些小的更改才能对其进行测试。向下滚动到设置Arduino引脚的位置,并在此处注释掉其中一行。将另一个更改为 Pin 10

    //arduino.pinMode(4, Arduino.SERVO);arduino.pinMode(10, Arduino.SERVO);

    我们需要在 Draw()方法中执行相同的操作:

    arduino.servoWrite(10, constrain(mouseX / 2, 0, 180));// arduino.servoWrite(4, constrain(180 - mouseX / 2, 0, 180)); 

    保存草图并运行。您应该能够通过在程序生成的窗口中来回移动鼠标来移动伺服器。

    如果该命令不适合您,请检查您的伺服接线,并检查您是否正确COM端口的阵列位置。知道Arduino与Processing很好的结合之后,就该继续了。

    配置控制器

    我们正在使用的Game Control Plus库也具有强大的配置。确保已插入控制器,打开 Configurator 示例项目,然后运行它。您将获得如下所示的菜单:

    单击您的控制器名称,然后会弹出一个更大的配置窗口。

    这看似令人望而生畏,但它旨在尽可能简单。在左侧填写第一个键,其中包含您要用作变量的名称。此变量将控制伺服器的位置,因此我将其称为 servoPos

    在其旁边的框中,您可以对其功能进行简要说明。现在,拿起控制器并移动您希望与伺服器一起使用的操纵杆。进行一些实验后,发现右指尖与“ X旋转"框相对应。在 servoPos 变量和此框之间拖动一条线。

    现在,我们需要将配置保存为数据文件。在窗口的右上方,填写设备角色字段和文件名字段。

    文件名很重要,因为您会在您的代码中使用它。我将其命名为 xbs 来保持简单。点击验证,然后点击保存。这样会写一个包含控制器说明的文件,以后可以使用。

    准备自定义草图文件夹

    让我们设置工作文件夹。打开一个空白的处理草图,并以您喜欢的任何名称保存。这样会在保存位置为其创建一个目录。

    现在导航至 Documents / Processing / libraries / GameControlPlus / examples / Configurator ,然后复制标有 data 。此文件夹包含我们刚刚创建的配置文件。导航到新保存的空白草图的目录,然后粘贴数据文件夹。

    创建自定义草图

    现在一切就绪,我们可以开始使用我们的草图制作草图了。两个图书馆。我们将逐步进行此操作,但如果您想继续前进,可以下载完整的草图和数据文件夹。请注意,您可能仍需要修改代码以反映您的Arduino COM端口。

    首先导入我们需要的所有库:

    import processing.serial.*;import net.java.games.input.*;import org.gamecontrolplus.*;import org.gamecontrolplus.gui.*;import cc.arduino.*;import org.firmata.*;

    我们还需要声明我们的 ControlDevice I / O Arduino ,以及 float 来保存指尖上的值:

    ControlDevice cont;ControlIO control;Arduino arduino;float thumb;

    我们的 setup()方法创建一个小窗口(控制器的实例),并将设备与我们的配置文件进行匹配。在此重要的是正确获取配置数据文件的文件名:

    void setup() {  size(360, 200);  control = ControlIO.getInstance(this);  cont = control.getMatchedDevice("xbs");  if (cont == null) {    println("not today chump"); // write better exit statements than me    System.exit(-1);  }  // println(Arduino.list());  arduino = new Arduino(this, Arduino.list()[2], 57600);  arduino.pinMode(10, Arduino.SERVO);}

    我们还在此阶段检查是否没有适用的控制器,并在需要时退出程序。虽然不需要使用 size()创建的窗口,但稍后会向我们提供一些有关是否从控制器中获取有用值的反馈。我们也像测试时一样初始化Arduino并将其固定在此处。

    现在,我们创建一个小方法来从控制器中获取输入值,并将其映射到我们的伺服器将能够使用的值:

    public void getUserInput() {  thumb = map(cont.getSlider("servoPos").getValue(), -1, 1, 0, 180);}

    这一行代码使用我们的数据文件来获取命名控件 servoPos ,该控件链接到控制器的右指尖,并从中读取值。然后,它将值映射并存储在我们的 thumb float变量中。

    现在此代码从未被调用,现在将对其进行修复。

    void draw() {  getUserInput();  background(thumb,100,255);  arduino.servoWrite(10, (int)thumb);}

    draw()与Arduino IDE中的 loop()方法相似。每帧,它调用 getUserInput()方法并更新拇指值。它使用此值来更改 background()的红色值,从而使我们可以直观地看到值的变化。然后使用 arduino.servoWrite()函数将此值写入伺服器。请注意,我们必须将 thumb 强制转换为整数值,因为ServeWrite函数将两个整数(引脚号和角度)作为参数。

    检查代码是否存在错误,保存并单击运行。在稍稍延迟了Arduino的初始化之后,它看起来应该像这样:

    使用游戏控制器和Arduino进行控制:已完成!

    该项目在很多方面都对没有经验丰富的编码器,尽管可以使用出色的库来帮助我们。它代表的是一种思考控制机器人以及您构建的任何其他设备的新方法。

    该项目将与我们有关构建Laser Turret教程的指南以及使用您的控制器更改螺距的指南完美配合或蜂鸣器或灯光的颜色。

    或者,您可以建造一个大型机器人并占领地球。只要您的USB线足够长!

    标签: Arduino 游戏控制器 机器人技术